在一个shell脚本中运行多个shell脚本



我正在尝试创建一个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 gccgcc --version输出,那么我认为scl命令很可能没有完成。命令选项末尾的bash做什么?是否运行bash进程?如果有,它的输入来自哪里?使用-x选项(sh -x script_1.sh)运行将显示正在执行的内容,以及scl是否正在完成。

scl enable foo bar bash实际上运行了一个bash实例,启用了foobar软件集合。见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命令,但是你真的需要在这些脚本中使用它吗?

最新更新