我试图回显在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]有人可以帮助我找到一种方法来回显上次运行的命令,而不管该命令在bash脚本中的调用方式/位置如何?
我的答案
尽管我的SO同事们做出了令人赞赏的贡献,但我选择编写一个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
函数并未破坏它们。到目前为止,我发现的唯一问题是运行回声中断,但无论如何我都不打算检查回声。
run()
当使用引号时,这将无法正常工作,例如,此操作将失败:run ssh-keygen -t rsa -C info@example.org -f ./id_rsa -N ""
。