回显并重定向 bash 历史记录!命令到文件

回显并重定向 bash 历史记录!命令到文件

是否可以通过!命令将历史命令回显并重定向到脚本文件中?我忽略的piperedirect、 或命令是否有变化?tee

  518  xmodmap -e "keycode 66 = Return"
  519  xmodmap -e "keycode 23 = Tab"
  535  xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'

[Tech_Ministry@localhost ~]$ echo !535 && !518 >> xmodmap_-e.sh 
echo xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape' && xmodmap -e "keycode 66 = Return" >> xmodmap_-e.sh 
xmodmap -e clear Lock -e keycode 0x42 = Escape

读完这篇文章后邮政我试过echo !535:p && !518:p >> xmodmap_-e.sh

我觉得我好像错过了一些简单的事情..可以这样做吗?可以将每个命令回显到单独的行吗?

答案1

help history

  -p    perform history expansion on each ARG and display the result
    without storing it in the history list

例如,我通常做的就是history -p \!572 >> myfile从历史记录中保存命令 572。

对于你的例子,我会使用:

echo "$(history -p '!535') && $(history -p '!518')" >> xmodmap_-e.sh

尽管可能有一种方法可以使用单个history命令来完成此操作。

(这会将两个命令放在脚本文件中的一行上,并与&&运算符连接。)


更新:当我写这篇文章时,我正在寻找的更简单的形式是:

history -p \!535 \!518 >> whatever.sh

答案2

如果将历史标记括在双引号中,则可以将其扩展捕获为带引号的字符串:

echo "!535 && !518" >> xmodmap_-e.sh 

您发布的尝试失败的原因是因为&&未引用,因此已采取行动:

echo !535 && !518 >> xmodmap_-e.sh

这扩展为两个命令:

echo {the expansion of !535}
&&
{run the expansion of !518} >> xmodmap_-e.sh

所以第一个扩展将被写入标准输出,并且由于该操作echo会成功,因此将执行第二个操作,并将其任何后续输出附加到文件中xmodmap_-e.sh

相关内容