bash - 将脚本通过管道传输到 bash 中?

标签 bash shell

两者之间有区别吗:

$ bash ~/script.sh

和:

$ cat ~/script.sh | bash

他们的行为似乎略有不同,我不太明白发生了什么。我的script.sh包含几行 bash,但当我将其输入 bash 时,它似乎会提前中止(但当我直接运行脚本时会运行到完成)。

这两种方式运行脚本有什么区别?

此外,当我使用<时,行为与第一个示例相同(运行至完成):

bash <( ~/script.sh )

脚本的内容是

set -eux
ssh CLUSTER_0_SERVER_0 "do_something" || ssh CLUSTER_0_SERVER_1 "do_something"
ssh CLUSTER_1_SERVER_0 "do_something" || ssh CLUSTER_1_SERVER_1 "do_something"

最佳答案

运行相同脚本的方式在语义上都是不同的。

例如,参见这个简单的脚本:

#!/bin/bash
echo $$
ssh 127.0.0.1
echo $$

直接运行它将执行里面的所有行以及 echo调用将打印相同的 PID:一切都是一个进程,它逐一运行脚本内的命令。

通过 cat ./script.sh | bash 运行它一开始创建两个不同的进程:一个用于执行 cat和一个 bash 。但是,当 bash 解释器读取并执行 ssh 时命令您收到错误(如果 ssh 未配置为不打印它):

Pseudo-terminal will not be allocated because stdin is not a terminal

然后您登录到计算机,它会立即离开,终止当前进程。因此,第二个值是不同的PID。就您而言,您有两个 ssh由条件运算符链接的命令。然而,由于在第一个命令被终止后,第二个命令将无法执行。这就是为什么您只会得到 *_SERVER_0 ssh执行的命令。

第三种情况有效,但只是错误的。 <( cmd )构造意味着执行cmd并将其输出作为文件参数传递给调用者。在您的情况下,脚本不会打印任何内容,因此您没有看到任何错误。运行示例脚本您将收到如下错误:

/dev/fd/63: line 1: 29355: command not found

第四种情况(评论中建议)bash < scriptcat script | bash 相同.

运行 bash 脚本的正确方法是通过 bash script./script (和谢邦)。如果您想在同一进程中运行指令,您也可以使用 . script ( source ) 所有其他的可能有效或无效,这取决于一些幸运的副作用(通常它们不应该有效)。

关于bash - 将脚本通过管道传输到 bash 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23257247/

相关文章:

bash - Windows 2008 R2 x64上的Hadoop 2.3.0上的Pig 0.12.0

bash - 更快地获取一组 git 文件中最新提交文件的时间戳的方法?

c - 热设置 termcap 能力 'bw' 标志?

linux - 删除具有唯一基名的文件?

bash - 如何递归搜索和删除目录中所有文件中的^M?

bash - 更改本地设置以使 sed 正常工作,但为什么呢?

linux - 菜单和子菜单,然后返回到Linux上的菜单脚本

regex - 忽略 diff 命令中带有反斜杠的模式

regex - 使用 grep 从一行中提取多个值

linux - 在linux shell脚本中将多行添加到一行中