如何在执行外壳命令时回显它们

2019/12/18 20:31
阅读数 107

在shell脚本中,如何回显所有被调用的shell命令并扩展任何变量名?

例如,给出以下行:

ls $DIRNAME

我希望脚本运行命令并显示以下内容

ls /full/path/to/some/dir

目的是保存所有调用的shell命令及其参数的日志。 也许有更好的方法来生成这样的日志?


#1楼

您还可以通过将它们包装在set -xset +x中来切换脚本中的选择行,例如,

#!/bin/bash
...
if [[ ! -e $OUT_FILE ]];
then
   echo "grabbing $URL"
   set -x
   curl --fail --noproxy $SERV -s -S $URL -o $OUT_FILE
   set +x
fi

#2楼

另一个选择是在脚本的顶部而不是在命令行的顶部放置“ -x”:

$ cat ./server
#!/bin/bash -x
ssh user@server

$ ./server
+ ssh user@server
user@server's password: ^C
$

#3楼

对于zsh,回显

 setopt VERBOSE

对于调试,

 setopt XTRACE

#4楼

shuckc回显选择行的答案有一些缺点:您最终还会回显以下set +x命令,并且您失去了使用$?测试退出代码的能力$? 因为它被set +x覆盖。

另一种选择是在子shell中运行命令:

echo "getting URL..."
( set -x ; curl -s --fail $URL -o $OUTFILE )

if [ $? -eq 0 ] ; then
    echo "curl failed"
    exit 1
fi

这将为您提供如下输出:

getting URL...
+ curl -s --fail http://example.com/missing -o /tmp/example
curl failed

但是,这确实会增加为命令创建新的子shell的开销。


#5楼

在Bash脚本名称之前的命令行上键入“ bash -x”。 例如,要执行foo.sh,请输入:

bash -x foo.sh
展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部