Sunday, 10 September 2017

bash - How to echo shell commands as they are executed



In a shell script, how do I echo all shell commands called and expand any variable names?



For example, given the following line:



ls $DIRNAME



I would like the script to run the command and display the following



ls /full/path/to/some/dir


The purpose is to save a log of all shell commands called and their arguments. Is there perhaps a better way of generating such a log?


Answer



set -x or set -o xtrace expands variables and prints a little + sign before the line.




set -v or set -o verbose does not expand the variables before printing.



Use set +x and set +v to turn off the above settings.



On the first line of the script, one can put #!/bin/sh -x (or -v) to have the same effect as set -x (or -v) later in the script.



The above also works with /bin/sh.



See the bash-hackers' wiki on set attributes, and on debugging.




$ cat shl
#!/bin/bash

DIR=/tmp/so
ls $DIR

$ bash -x shl
+ DIR=/tmp/so
+ ls /tmp/so
$


No comments:

Post a Comment

casting - Why wasn't Tobey Maguire in The Amazing Spider-Man? - Movies & TV

In the Spider-Man franchise, Tobey Maguire is an outstanding performer as a Spider-Man and also reprised his role in the sequels Spider-Man...