bash recursive xtrace

后端 未结 2 573
轮回少年
轮回少年 2020-12-10 11:40

Is there any way to run bash script X so that if X call executable bash script Y then Y starts by \'sh -eux\'?

X.sh:

./Y.sh

Y.sh:

相关标签:
2条回答
  • 2020-12-10 12:36

    It is possible to make a subshell run using the same shell options set in the parent by exporting the SHELLOPTS environment variable.

    In your case where X.sh and Y.sh cannot be edited, I'd create a wrapper script that simply exports SHELLOPTS before calling X.sh.

    Example:

    #!/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
    

    Calling X.sh directly shows that -eux options are not set in Y.sh

    [lsc@aphek]$ ./X.sh 
    braceexpand:hashall:interactive-comments:posix
    

    Calling it via wrapper.sh shows that the options have propagated to the subshells.

    [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
    

    Tested on GNU bash, version 3.00.15(1)-release. YMMV.

    0 讨论(0)
  • 2020-12-10 12:40

    So i've got tool to debug shell scripts:

      #!/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
    
    0 讨论(0)
提交回复
热议问题