bash递归xtrace

时间:2010-12-01 14:38:14

标签: bash

有没有办法运行bash脚本X,这样如果X调用可执行bash脚本Y然后Y以'sh -eux'开头?

X.sh:

./Y.sh

Y.sh:

#!/bin/sh
echo OK

2 个答案:

答案 0 :(得分:15)

通过导出SHELLOPTS环境变量,可以使用父级中设置的相同shell选项来运行子shell。

如果您无法编辑X.shY.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