bash_history 可以保存评估的命令输出吗?

bash_history 可以保存评估的命令输出吗?

当 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

或者多次写入输出文件等。

相关内容