当 bash 或其他 shell 的历史记录是参数时,有没有办法保存评估命令的输出?
$ echo $(pwd) && history
/root
0 I want something like:
1 echo $(pwd) && history
2 echo /root && history
VS
$ echo $(pwd) && history
/root
0 echo $(pwd) && history
答案1
这在 ZSH 中是可能的,但存在问题(见下文),因此不应使用:
zshaddhistory() {
local cmd newcmd
cmd=${1%%$'\n'}
newcmd=${(e)cmd}
if [[ $newcmd != $cmd ]]; then
print -sr -- $cmd
print -sr -- $newcmd
return 1
else
return 0
fi
}
基本上,我们从潜在的历史记录添加中删除隐式换行符,然后e
将命令扩展为新字符串。如果这导致发生某些情况,则会为原始命令和新命令执行自定义历史记录添加;否则,常规历史记录机制(通过
return 0
)将命令添加到历史记录中。
然而!如果任何扩展$(...)
有副作用,则该解决方案就会出现问题,这与运行两次 C 或 LISP 宏代码的问题类似。因此,我不会真正推荐它用于生产用途,除非您喜欢调试问题,例如简单的计数器出错:
% i=0
% print $((i++))
1
% print $((i++))
3
% print $((i++))
5
% print $((i++))
7
或者多次写入输出文件等。