问题描述
|
我试图回显在bash脚本中运行的最后一个命令。我找到了一种方法来处理“ 0”,当从解析器的角度来看命令在脚本中代表特定行时,它可以很好地工作。但是在某些情况下,例如在将命令插入
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脚本中的调用方式/位置如何?
我的答案
尽管我的同事们做出了令人赞赏的贡献,但我还是选择编写一个writing4ѭ函数-该函数将所有参数作为一个命令运行,并在失败时显示该命令及其错误代码-具有以下好处:
-我只需要在要检查的命令前加上ѭ4即可,这使它们保持一行,并且不会影响脚本的简洁性
-每当脚本在这些命令之一上失败时,脚本的最后输出行就会显示一条消息,清楚地显示哪个命令及其退出代码失败,从而使调试更加容易
示例脚本:
#!/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
函数并没有破坏它们。到目前为止,我发现的唯一问题是运行回声,但该回声中断了,但我仍然不打算检查回声。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)