Home > Mobile >  how to print out all commands in bash script
how to print out all commands in bash script

Time:05-15

I know "set -x" will print out commands in current script. but if the script a.sh runs b.sh then b.sh won't print out commands. is there a way set -x globally so all commands print out?

x@ASUS:~$ cat a.sh

#!/bin/bash

set -x

echo "a.sh"
./b.sh

x@ASUS:~$ cat b.sh

#!/bin/bash

echo "b.sh"

x@ASUS:~$ ./a.sh

echo command in b.sh is not printed out

CodePudding user response:

Yes, you need to source the second script instead of executing it.

Executing it will spawn a new shell, which is not affect by set -x. Sourcing it will instead execute the script in the current shell, where you've run set -x.

[1:24 anon] ~$ cat ./a.sh 
                                                                                                                                                                                                       
#!/bin/bash

set -x

echo "a.sh"
source ./b.sh

[1:26 anon] ~$ cat ./b.sh   
                                                                                                                                                                                                     
#!/bin/bash

echo "b.sh"

[1:26 anon] ~$ ./a.sh       
                                                                                                                                                                                                     
  echo a.sh
a.sh
  source ./b.sh
   echo b.sh
b.sh

CodePudding user response:

As long as b.sh does not call set x, then you can do:

export SHELLOPTS
set -x

This should survive intermediate non-bash subprocesses that don't sanitise their environment, but only works with bash scripts (eg. scripts with #!/bin/sh bang-path won't display traces).

bash$ cat <<'EOD' >a2.sh
#!/bin/bash

export SHELLOPTS
set -x

echo "a2.sh"
awk 'BEGIN{system("echo a1");system("bash -c \"echo a2\"");system("./b.sh") }'
./b.sh
EOD
bash$ chmod  x a2.sh
bash$ ./a2.sh
  echo a2.sh
a2.sh
  awk 'BEGIN{system("echo a1");system("bash -c \"echo a2\"");system("./b.sh") }'
a1
  echo a2
a2
  echo b.sh
b.sh
  ./b.sh
  echo b.sh
b.sh
bash$
  • Related