我正在使用Ubuntu,我想重复我执行的一系列命令。我试过像
这样的东西for i in $(seq 2006 2013); do \!$i; done;
但失败了,因为shell试图执行命令'!2006'。
man history
也没有告诉我如何重复一系列命令。
答案 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;