我正在尝试创建一个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的语法)并监视发生了什么。你在script_1.sh
中看到gcc --version
的版本信息了吗?
gcc --version
仅在我注释掉scl enable devtoolset-9 bash
时打印。我运行scl enable devtoolset-9 bash
,它没有输出任何东西到屏幕上。
说明scl
命令没有完成。也许它正在等待终端的输入。当包含scl
命令时,您看到which gcc
的输出了吗?如果不是,那么几乎可以肯定scl
正在尝试从终端读取。我不知道它在读取什么——这不是一个我熟悉的命令。
没有等待任何输入。在执行后,当我单独运行它时,它会再次出现提示符。
如果您没有看到which gcc
和gcc --version
输出,那么我认为scl
命令很可能没有完成。命令选项末尾的bash
做什么?是否运行bash
进程?如果有,它的输入来自哪里?使用-x
选项(sh -x script_1.sh
)运行将显示正在执行的内容,以及scl
是否正在完成。
scl enable foo bar bash
实际上运行了一个bash实例,启用了foo
和bar
软件集合。见https://linux.die.net/man/1/scl
好;bash
实例在做什么?在执行任何操作之前,它不等待输入吗?没有提示有点令人惊讶,但也不完全令人惊讶。当scl
挂起时,您是否尝试键入exit
?
我刚刚尝试了
scl enable devtoolset-9 bash & echo "Enabling devtoolset-9"
,它工作并最终打印出gcc --version
。
好吧,&
在后台运行scl
命令,让echo
运行,然后是which gcc
和gcc --version
。将&
替换为分号。或者将&
替换为-c 'echo Hi'
和分号,看看会发生什么。
太棒了!添加
-c echo "Hi"
使其工作!
因此,在scl enable devtoolset-9 bash
末尾指定的bash
命令正在等待您的输入,这就是为什么它没有终止(并且您没有看到which gcc
运行)等等。你在script_2.sh
结束时遇到了同样的问题-其他脚本呢?但是你现在知道发生了什么,并且可以决定怎么做。例如,使用-c exit
只会终止shell(而不是回显Hi
)。
我需要更多地研究scl
命令,但是你真的需要在这些脚本中使用它吗?