有没有办法运行bash脚本X,这样如果X调用可执行bash脚本Y然后Y以'sh -eux'开头?
X.sh:
./Y.sh
Y.sh:
#!/bin/sh
echo OK
答案 0 :(得分:15)
通过导出SHELLOPTS
环境变量,可以使用父级中设置的相同shell选项来运行子shell。
如果您无法编辑X.sh
和Y.sh
,我会创建一个包装脚本,只需在调用SHELLOPTS
之前导出X.sh
。
示例:
#!/bin/sh
# example X.sh which calls Y.sh
./Y.sh
#!/bin/sh
# example Y.sh which needs to be called using sh -eux
echo $SHELLOPTS
#!/bin/sh -eux
# wrapper.sh which sets the options for all sub shells
export SHELLOPTS
./X.sh
直接呼叫X.sh
会显示-eux
Y.sh
个选项
[lsc@aphek]$ ./X.sh
braceexpand:hashall:interactive-comments:posix
通过wrapper.sh
调用它会显示选项已传播到子shell。
[lsc@aphek]$ ./wrapper.sh
+ export SHELLOPTS
+ ./x.sh
+ ./y.sh
+ echo braceexpand:errexit:hashall:interactive-comments:nounset:posix:xtrace
braceexpand:errexit:hashall:interactive-comments:nounset:posix:xtrace
在GNU bash上测试,版本3.00.15(1) - 发布。 YMMV。
答案 1 :(得分:1)
所以我有调试shell脚本的工具:
#!/bin/sh
# this tool allows to get full xtrace of any shell script execution
# only argument is script name
out=out.$1
err=err.$1
tmp=tmp.$1
echo "export SHELLOPTS; sh $@ 1>> $out 2>> $err" > $tmp
sh -eux $tmp &> /dev/null
rm $tmp