假设我想执行之前执行过的四个命令的序列。如果命令历史记录中的第一个是 432,那么我可以这样做:
$ !432; !433; !434; !435
我很好奇,有没有更有效的方法来实现这一目标?
答案1
如果它引用最近运行的命令,更有效的方法是用负数引用它们:
!-4; !-3; !-2; !-1
此外,一旦执行此操作,您的最后一个历史记录条目将包含整个命令链,因此您可以使用 重复它!!
。
编辑:
如果您还没有熟悉一下这个强大的内置函数fc
,吉尔斯提到。 (使用help fc
。)事实证明,您也可以使用负数,因此您可以使用与上面相同的操作
eval "`fc -ln -4 -1`"
不过,这有一个警告:此后,该eval
行将作为最后一个命令存储在历史记录中。所以如果你再次运行这个,你就会陷入循环!
更安全的方法是使用默认fc
操作模式:将选定的命令范围转发到编辑器,并在退出后运行它们。尝试:
fc -4 -1
您甚至可以颠倒命令范围的顺序:fc -1 -4
答案2
答案3
有一种很好的替代方法可以从 Bash 历史记录中按顺序运行多个命令:您可以使用+搜索历史记录,
而不是使用历史替换(!432
或) ,一旦找到您想要的第一个命令跑,击+ (!-4
CtrlrCtrlo操作并获得下一步)而不是密钥return这
将启动命令并提出下一个命令从历史上看。您可以Ctrl+o根据需要多次点击,并以return最后一次结束该序列,或者Ctrl+c停止而不启动它。
答案4
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