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

我只是一个虾纸丫 提交于 2019-12-18 20:33:15

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

在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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!