bash:在DEBUG陷阱中保留$ _

时间:2016-12-03 05:22:12

标签: bash

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陷阱似乎会更改$_的默认行为。

chrubybash-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的价值?

1 个答案:

答案 0 :(得分:6)

值得注意的是"最后一个执行命令的最后一个参数"包括文字文本"最后执行的命令",not"用户输入的最后一个命令&#34 ;; bash在这方面表现得像文件承诺。

但不要小心:除非你的陷阱永远返回非零值(并因此中止它们之前运行的命令),否则这很容易解决:

trapfunc() { local old_=$1; date; : "$old_"; }
trap 'trapfunc "$_"' DEBUG