在 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
陷阱时保留 $_
的值?
最佳答案
值得注意的是,“执行的最后一个命令的最后一个参数”包括字面文本“执行的最后一个命令”,而不是“用户输入的最后一个命令”; bash 在这方面的行为与其文档 promise 的一样。
但没关系:除非你的陷阱总是返回非零值(并因此中止它们之前运行的命令),否则这很容易变通:
trapfunc() { local old_=$1; date; : "$old_"; }
trap 'trapfunc "$_"' DEBUG
关于bash:在 DEBUG 陷阱中保留 $_,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40944532/