是否可以通过!
命令将历史命令回显并重定向到脚本文件中?我忽略的pipe
、redirect
、 或命令是否有变化?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
。