sh脚本运行过程中修改程序引发的问题
在公司运行shell脚本(暂命名为A.sh)的时候,由于要跑多个应用,所以其依赖的其它shell脚本(暂命名为B.sh)都要经过不同的处理。当A.sh运行的时候(命令还没有走到运行B.sh):
- 修改A.sh里的任一命令时,会报错
- 修改B.sh里的任一命令时,不会影响A.sh的执行。当执行B.sh的时候,输出的就是更新后的B.sh对应的结果
在编程语言中,不管是动态语言还是静态语言,程序运行前都会经过编译或者解释生成可执行文件,运行起来后修改源代码,都不会影响程序的正常运行。但shell脚本不同,它只是纯粹文本,有系统一行行读取命令执行。下面举例讨论:
例1
A.sh
没有依赖其它脚本:1
2
3echo "start running"
sleep 30s
echo "end running"
当程序休眠30s的时候,修改 A.sh
为:1
2
3
4echo "start running"
sleep 30s
echo "sleep end"
echo "end running"
这个时候程序会报错!
例2
A.sh
依赖其它脚本:1
2
3
4echo "start running"
sleep 30s
sh B.sh
echo "end running"
B.sh
内容为:1
echo "Here is B"
当程序休眠30s的时候,修改 B.sh
为:1
2echo "Here is B"
echo "Hello B"
这个时候程序的输出就会受到影响,结果为:1
2
3
4start running
Here is B
Hello B
end running
总结
我们在更改sh脚本的时候,需要极其小心,以免各应用的运行会互相污染。