在 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 -x
、sudo yum
、sh 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 gcc
和 gcc --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 gcc
和 gcc --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
命令,但您真的需要在这些脚本中使用它吗?
我正在尝试创建一个 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 -x
、sudo yum
、sh 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 outscl enable devtoolset-9 bash
. I ranscl 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 gcc
和 gcc --version
输出,那么可能是 scl
命令没有完成,IMO。命令选项末尾的 bash
有什么作用?它 运行 是一个 bash
过程吗?如果是这样,它的输入来自哪里? 运行 -x
选项 (sh -x script_1.sh
) 会显示正在执行的内容,以及 scl
是否正在完成。
scl enable foo bar bash
actually runs a bash instance withfoo
andbar
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 thegcc --version
.
好吧,&
运行 是后台的 scl
命令,将 echo
留给 运行,然后是 which gcc
和 gcc --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
命令,但您真的需要在这些脚本中使用它吗?