3 回答
TA贡献1853条经验 获得超9个赞
命令历史记录是一种交互式功能。历史记录中仅输入完整的命令。例如,case当外壳解析完该结构后,将其作为一个整体输入。既不使用history内置查询历史记录(也不通过外壳扩展(!:p)打印历史记录),这似乎并没有达到您想要的目的,即打印简单命令的调用。
该DEBUG陷阱让你任何简单的命令执行前执行命令权。BASH_COMMAND变量中提供了要执行的命令的字符串版本(单词之间用空格分隔)。
trap 'previous_command=$this_command; this_command=$BASH_COMMAND' DEBUG
…
echo "last command is $previous_command"
请注意,这previous_command将在您每次运行命令时更改,因此请将其保存到变量中以使用它。如果您还想知道上一条命令的返回状态,请将二者保存在一个命令中。
cmd=$previous_command ret=$?
if [ $ret -ne 0 ]; then echo "$cmd failed with error code $ret"; fi
此外,如果只想中止失败的命令,请使用set -e来使脚本在第一个失败的命令上退出。您可以显示EXIT陷阱中的最后一个命令。
set -e
trap 'echo "exit $? due to $previous_command"' EXIT
请注意,如果您试图跟踪脚本以查看其作用,请忘记所有这些内容并使用set -x。
TA贡献1848条经验 获得超6个赞
Bash具有内置功能来访问最后执行的命令。但这是最后一个完整的命令(例如整个case命令),而不是您最初请求的单个简单命令。
!:0 =执行命令的名称。
!:1 =上一个命令的第一个参数
!:* =上一条命令的所有参数
!:-1 =上一条命令的最终参数
!! =前一个命令行
等等
因此,最简单的答案是:
echo !!
...或者:
echo "Last command run was ["!:0"] with arguments ["!:*"]"
自己尝试!
echo this is a test
echo !!
在脚本中,历史记录扩展默认情况下处于关闭状态,您需要使用以下命令启用它
set -o history -o histexpand
TA贡献1811条经验 获得超6个赞
看看var是否在陷阱中也可用(以及所需的值)-的确如此!$BASH_COMMANDEXIT
因此,以下bash脚本按预期工作:
#!/bin/bash
exit_trap () {
local lc="$BASH_COMMAND" rc=$?
echo "Command [$lc] exited with code [$rc]"
}
trap exit_trap EXIT
set -e
echo "foo"
false 12345
echo "bar"
输出是
foo
Command [false 12345] exited with code [1]
bar永远不会打印出来,因为set -e导致bash在命令失败并且false命令总是失败时(根据定义)退出脚本。该12345传递给false在这里只用来表明该参数传递给失败的命令被捕获,以及(在false命令忽略传递给它的任何参数)
- 3 回答
- 0 关注
- 484 浏览
添加回答
举报