在 shell 脚本中发布 运行 多个 shell 脚本

Issue running multiple shell scripts inside a shell script

我正在尝试创建一个 shell 脚本,该脚本在 CentOS 7 下 运行 包含多个脚本。每个脚本都以 #!/bin/bash 开头。每个脚本都经过测试,可以 运行 作为独立的 shell 脚本没有问题。

scripts_all.sh

的内容
#!/bin/bash
set -x
sudo yum install g++ make binutils cmake openssl-devel boost-devel zlib-devel
sh script_1.sh # executes all the contents of script_1.sh
sh script_2.sh # does not executed any of the command in script_2.sh. 
sh script_3.sh
sh script_4.sh

script_1.sh

#!/bin/bash
sudo yum install centos-release-scl
sudo yum install devtoolset-9-gcc*
scl enable devtoolset-9 bash
which gcc
gcc --version

script_2.sh

#!/bin/bash
sudo yum install centos-release-scl-rh
sudo yum-config-manager --enable centos-release-scl-rh
sudo yum install devtoolset-9
scl enable devtoolset-9 bash

看来 ./scripts_all.sh 将成功执行 set -xsudo yumsh script_1.sh,但在 sh script_2.sh 处停止。值得注意的是,我可以 运行 sh script_2.sh 没有独立于 scripts_all.sh 的问题。我不知道为什么其余的脚本不会 运行.

./scripts_all.sh 打印 sh script_1.sh 的行及其执行,但它从不打印 sh script_2.sh.

的行

有人可以帮忙吗?

正在将评论复制到答案的伪装中。

sh script_1.sh 等行更改为 bash -x script_1.sh(或 sh -x script_1.sh,因为脚本似乎没有使用任何 Bash-specific 语法)并监​​视发生了什么在。你在script_1.sh中看到gcc --version的版本信息了吗?

gcc --version is only printed when I comment out scl enable devtoolset-9 bash. I ran scl enable devtoolset-9 bash and it does not output anything to the screen.

这表明 scl 命令没有完成。也许它正在等待终端的输入。当您包含 scl 命令时,您是否看到 which gcc 的输出?如果不是,那么几乎可以肯定 scl 正在尝试从终端读取。我不知道它在读什么 — 这不是我熟悉的命令。

It is not waiting for any input. After execution, it brings the prompt again when I run it by itself.

如果您没有看到 which gccgcc --version 输出,那么可能是 scl 命令没有完成,IMO。命令选项末尾的 bash 有什么作用?它 运行 是一个 bash 过程吗?如果是这样,它的输入来自哪里? 运行 -x 选项 (sh -x script_1.sh) 会显示正在执行的内容,以及 scl 是否正在完成。

scl enable foo bar bash actually runs a bash instance with foo and bar Software Collections enabled. See https://linux.die.net/man/1/scl

好的; bash 实例在做什么?它在执行任何事情之前不等待输入吗?没有提示有点令人惊讶,但并不完全令人惊讶。您是否尝试过在 scl 挂起时键入 exit

I just tried scl enable devtoolset-9 bash & echo "Enabling devtoolset-9" and it works and ultimately prints out the gcc --version.

好吧,& 运行 是后台的 scl 命令,将 echo 留给 运行,然后是 which gccgcc --version。将 & 替换为分号。或者将 & 替换为 -c 'echo Hi' 和一个分号,看看会发生什么。

Wonderful! Adding -c echo "Hi" made it work!

所以在 scl enable devtoolset-9 bash 末尾指定的 bash 命令正在等待您的输入,这就是它没有终止的原因(而且您没有看到 which gcc 运行宁)等等。您在 script_2.sh 末尾遇到了同样的问题 — 其他脚本呢?但是您现在知道发生了什么并且可以决定如何处理它。例如,使用 -c exit 将简单地终止 shell(而不是回显 Hi)。

我需要更多地研究 scl 命令,但您真的需要在这些脚本中使用它吗?