将脚本导入bash?

时间:2014-04-23 23:47:16

标签: 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"

1 个答案:

答案 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 < scriptcat script | bash相同。

运行bash脚本的正确方式是bash script./script(和shebang)。如果你想在同一个过程中运行说明,你也可以使用. scriptsource)所有其他人可能会工作或不工作,这取决于一些幸运的副作用(通常他们不应该工作)。 / p>