【问题标题】:Issue running multiple shell scripts inside a shell script在一个 shell 脚本中运行多个 shell 脚本的问题
【发布时间】:2021-06-03 16:17:00
【问题描述】:

我正在尝试创建一个在 CentOS 7 下运行多个脚本的 shell 脚本。每个脚本都以 #!/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 的行。

有人可以帮忙吗?

【问题讨论】:

  • 如果它们是 bash 脚本,您应该使用 bash script_N.sh。或者,如果它们以 #! 开头,只需使用 ./script_N.sh
  • set -x 是否显示script_1.sh 行?
  • 如果没有,说明sudo yum ...还没有完成。
  • 为什么要打印这些行?该脚本是否也以set -x 开头?其他脚本有吗?
  • “停在”是什么意思?它会永远挂起,还是suddenly exit

标签: bash shell sh centos7


【解决方案1】:

将 cmets 复制到答案的外观中。

sh script_1.sh 等行更改为bash -x script_1.sh(或sh -x script_1.sh,因为这些脚本似乎没有使用任何特定于Bash 的语法)并监​​控正在发生的事情。在script_1.sh 中看到来自gcc --version 的版本信息吗?

gcc --version 仅在我注释掉 scl enable devtoolset-9 bash 时打印。我跑了scl enable devtoolset-9 bash,它没有向屏幕输出任何东西。

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

它不等待任何输入。执行后,我自己运行时再次提示。

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

scl enable foo bar bash 实际上运行一个启用了foobar 软件集合的bash 实例。见https://linux.die.net/man/1/scl

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

我刚刚尝试了scl enable devtoolset-9 bash & echo "Enabling devtoolset-9",它可以正常工作并最终打印出gcc --version

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

太棒了!添加-c echo "Hi" 使其工作!

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

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

【讨论】:

    最近更新 更多