在bash
中,manual says $_
应为“执行的最后一个命令的最后一个参数”。
这是预期的行为:
$ echo 1 2 3
1 2 3
$ echo $_
3
$
使用DEBUG
陷阱时,$_
基于陷阱运行的最后一个命令(下例中为date
),而不是用户输入的最后一个命令:
$ exec bash
$ unset PROMPT_COMMAND
$ trap date DEBUG
$ echo 1 2 3
Sat Dec 3 11:54:33 ICT 2016
1 2 3
$ echo $_
Sat Dec 3 11:54:37 ICT 2016
date
$ # User blinks in confusion and says "but I didn't just type date!"
默认情况下,设置DEBUG
陷阱似乎会更改$_
的默认行为。
chruby和bash-preexec都受此影响。
有趣的是,这在zsh
中的预期效果如下:
$ zsh
genesis% trap date DEBUG
genesis% echo 1 2 3
Sat Dec 3 12:18:01 ICT 2016
1 2 3
genesis% echo $_
Sat Dec 3 12:18:04 ICT 2016
3
genesis%
如何在使用$_
陷阱时保留DEBUG
的价值?
答案 0 :(得分:6)
值得注意的是"最后一个执行命令的最后一个参数"包括文字文本"最后执行的命令",not"用户输入的最后一个命令&#34 ;; bash在这方面表现得像文件承诺。
但不要小心:除非你的陷阱永远返回非零值(并因此中止它们之前运行的命令),否则这很容易解决:
trapfunc() { local old_=$1; date; : "$old_"; }
trap 'trapfunc "$_"' DEBUG