bash:在 DEBUG 陷阱中保留 $_

标签 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 陷阱时保留 $_ 的值?

最佳答案

值得注意的是,“执行的最后一个命令的最后一个参数”包括字面文本“执行的最后一个命令”,而不是“用户输入的最后一个命令”; bash 在这方面的行为与其文档 promise 的一样。

但没关系:除非你的陷阱总是返回非零值(并因此中止它们之前运行的命令),否则这很容易变通:

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

关于bash:在 DEBUG 陷阱中保留 $_,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40944532/

相关文章:

linux - 管道 grep 匹配 less (或类似)

linux - 语法错误: "done" unexpected when trying to run shell script

linux - 如何使用sed命令更改limits.conf中的ulimit值?

bash - 从 bash 打开然后杀死子进程

python - 使用Unix工具处理文本: search and replace all text that are not between some lines

perl - 批量重命名以 '-' 开头的文件?

java - 在 Java 中将制表符作为命令行参数传递

linux - 使用 bash 将文件夹名称重命名为文件名

bash - 采购后如何阻止 .bashrc 中的变量在 shell 中可见?

linux - 将 STDOUT 粘贴到远程主机上的剪贴板的选项