从历史记录执行一系列命令

时间:2014-07-11 13:50:53

标签: linux shell ubuntu history

我正在使用Ubuntu,我想重复我执行的一系列命令。我试过像

这样的东西
for i in $(seq 2006 2013); do \!$i; done;

但失败了,因为shell试图执行命令'!2006'。

man history

也没有告诉我如何重复一系列命令。

2 个答案:

答案 0 :(得分:6)

如果您使用bash(或ksh),fc内置版允许您以各种方式操作历史记录。

fc -l                   # list recent history.
fc -l      2006 2013    # list commands 2006..2013
fc         2006 2013    # launch editor with commands 2006..2013; executes what you save
fc -e pico 2006 2013    # launches the editor pico on command 2006..2013
fc -e -    2006 2013    # Suppresses the 'edit' phase (but only executes the first listed command)
fc -e :    2006 2013    # Launches the ':' command (a shell built-in) as the editor

ksh中的经典技巧是使用别名alias r='fc -e -',但由于bash的行为,有必要稍微扭转它的手臂并使用{{1相反。

答案 1 :(得分:4)

for i in $(seq 2006 2013); do \!$i; done; 
在您的代码中,您可能会想到!就好像 !在bash命令行中,但在这里“!”随着“$ i”成为字符串命令“!2006,!2007 ......!2013”​​,但实际上没有名为“!2006”的命令!“2006”整体上是一个命令名。

Bash中!是一个事件指定者。当你使用!2006。 它被解释为“对命令2006的引用”,但没有使用命令“!2006”。

!总是从左到右执行命令。

有关详细信息,请访问http://www.gnu.org/software/bash/manual/bashref.html#Event-Designators

我尝试以下方式获得相同的结果:

for i in $(seq 2006 2013); do  fc -e - $i; done;