之间是否存在差异:
$ 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"
答案 0 :(得分:2)
在语义中,您运行相同脚本的方式各不相同。
例如,参见这个简单的脚本:
#!/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 < script
与cat script | bash
相同。
运行bash脚本的正确方式是bash script
或./script
(和shebang)。如果你想在同一个过程中运行说明,你也可以使用. script
(source
)所有其他人可能会工作或不工作,这取决于一些幸运的副作用(通常他们不应该工作)。 / p>