Answers:
如果它引用刚运行的命令,一种更有效的方法是用负数引用它们:
!-4; !-3; !-2; !-1
另外,一旦您执行了此操作,您的上一个历史记录条目将包含整个命令链,因此您可以使用来重复它!!
。
编辑:
如果你有没有准备好,熟悉伟大内置函数fc
,由吉尔提到。(使用help fc
。)事实证明,您也可以使用负数,因此您可以使用进行与上述相同的操作
eval "`fc -ln -4 -1`"
不过,这有一个警告:在此之后,该eval
行将作为最后一条命令存储在历史记录中。因此,如果再次运行此命令,则会陷入循环!
一种更安全的方法是使用默认fc
操作模式:将选定范围的命令转发给编辑器,并在退出后运行它们。尝试:
fc -4 -1
您甚至可以颠倒命令范围的顺序: fc -1 -4
man fc
不给我任何东西。代表什么fc
?还有什么其他选择?
help fc
...以及help help
.... help:帮助[-dms] [模式...]显示有关内置命令的信息。
-l
标志,它将不需要邪恶而执行eval
。
有一种不错的替代方法可以从Bash历史记录中按顺序运行许多命令:您可以使用+ 搜索整个历史记录,
而无需使用历史记录替换(!432
或!-4
),而只需找到历史记录即可。运行,请按+ (操作并获取下一个)而不是键。
这将启动命令并提出历史记录中的下一个命令。您可以随意打几次,并以最后一个序列结束序列,或者在不启动序列的情况下停止序列。CtrlrCtrloreturn
Ctrl+oreturnCtrl+c
Ctrl-o
它之后,它只会输出一个文字^o
并破坏我的(reverse-i-search)
。也许还有其他设置。
要立即执行命令而不是编辑命令,下面是使用eval的Giles Answers语法上更苗条的版本:
fc -e: 432 435
-e的冒号参数是bash noop,其作用是跳过fc所需的“在编辑器中打开”步骤。而且,现在(最近)历史记录将包含历史记录中的实际命令,而不是eval语句。
fc
for循环和 xsel
当我要连接并重新运行最后n个命令多次时,此方法效果很好:
fcn() (
from="${1:-2}"
to="${2:-1}"
if [ "$from" -ne "$to" ]; then
for i in `seq "$from" -1 "$(($to + 1))"`; do
printf "$(fc -ln -${i} -${i}) && "
done
fi
printf "$(fc -ln -${to} -${to})"
)
然后:
$ echo a
a
$ echo b
b
$ echo c
c
$ fcn 3 1 | xsel -b
$ # Paste.
$ echo a && echo b && echo c
a
b
c
$ # Paste again if you feel like it.
$ echo a && echo b && echo c
a
b
c
或对于可能需要进行一些编辑的较大命令:
fcn 3 1 >cmds.sh
vi cmds.sh
bash cmds.sh
bash cmds.sh
history -p \!43{2..5}
以将命令432至435打印到终端,适合后续复制/粘贴。