最佳答案
我试图在 bash 脚本中回显最后一个命令运行。我找到了一种使用 history,tail,head,sed
的方法,当命令从解析器的角度表示脚本中的特定行时,这种方法可以很好地工作。但是在某些情况下,我没有得到预期的输出,例如当命令插入到 case
语句中时:
剧本:
#!/bin/bash
set -o history
date
last=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')
echo "last command is [$last]"
case "1" in
"1")
date
last=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')
echo "last command is [$last]"
;;
esac
输出:
Tue May 24 12:36:04 CEST 2011
last command is [date]
Tue May 24 12:36:04 CEST 2011
last command is [echo "last command is [$last]"]
[ Q ]有人可以帮助我找到一种方法来回显最后一个 run 命令,而不管这个命令在 bash 脚本中如何/在哪里被调用?
我的回答
尽管我的同事们做出了非常值得赞赏的贡献,我还是选择编写了一个 run
函数——它将所有参数作为一个命令运行,并在失败时显示命令及其错误代码——这样做有以下好处:
- 我只需要预先设置我想用 run
检查的命令,使它们保持在一行上,并且不影响我的脚本的简洁性
- 每当脚本在这些命令中的一个出现故障时,我的脚本的最后一行输出是一条消息,清楚地显示哪个命令失败,以及它的退出代码,这使得调试更加容易
示例脚本:
#!/bin/bash
die() { echo >&2 -e "\nERROR: $@\n"; exit 1; }
run() { "$@"; code=$?; [ $code -ne 0 ] && die "command [$*] failed with error code $code"; }
case "1" in
"1")
run ls /opt
run ls /wrong-dir
;;
esac
输出:
$ ./test.sh
apacheds google iptables
ls: cannot access /wrong-dir: No such file or directory
ERROR: command [ls /wrong-dir] failed with error code 2
我用多个参数测试了各种命令,bash 变量作为参数,引号参数... ... 而且 run
函数没有破坏它们。到目前为止,我发现的唯一问题是运行一个中断的回声,但我不打算检查我的回声无论如何。