为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

月关宝盒 2019-11-04 15:02:31
在shell脚本中,如何回显所有被调用的shell命令并扩展任何变量名?例如,给出以下行:ls $DIRNAME我希望脚本运行命令并显示以下内容ls /full/path/to/some/dir目的是保存所有调用的shell命令及其参数的日志。也许有更好的方法来生成这样的日志?
查看完整描述

3 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

set -x或set -o xtrace展开变量并在该行之前打印一点+号。


set -v或set -o verbose在打印之前不展开变量。


使用set +x和set +v关闭以上设置。


在脚本的第一行,一个可以把#!/bin/sh -x(或-v)有同样的效果set -x(或-v)后面的脚本。


以上也适用于/bin/sh。


有关set属性和调试,请参见bash-hackers的Wiki 。


$ cat shl

#!/bin/bash                                                                     


DIR=/tmp/so

ls $DIR


$ bash -x shl 

+ DIR=/tmp/so

+ ls /tmp/so

$


查看完整回答
反对 回复 2019-11-04
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

set -x 会给你你想要的。


这是一个示例shell脚本来演示:


#!/bin/bash

set -x #echo on


ls $PWD

这将展开所有变量并在命令输出之前打印完整命令。


输出:


+ ls /home/user/

file1.txt file2.txt


查看完整回答
反对 回复 2019-11-04
?
ibeautiful

TA贡献1993条经验 获得超5个赞

我使用一个函数回显然后运行命令


#!/bin/bash

#function to display commands

exe() { echo "\$ $@" ; "$@" ; }


exe echo hello world

哪个输出


$ echo hello world

hello world

编辑:


对于更复杂的命令管道等,可以使用eval:


#!/bin/bash

#function to display commands

exe() { echo "\$ ${@/eval/}" ; "$@" ; }


exe eval "echo 'Hello World' | cut -d ' ' -f1"

哪个输出


$  echo 'Hello World' | cut -d ' ' -f1

Hello


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 497 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信