如何执行历史记录中的连续命令?

如何执行历史记录中的连续命令?

假设我想执行之前执行过的四个命令的序列。如果命令历史记录中的第一个是 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

要查看历史记录中的一系列命令,请使用内置命令fc命令:

fc -ln 432 435

要再次执行它们:

eval "$(fc -ln 432 435)"

答案3

有一种很好的替代方法可以从 Bash 历史记录中按顺序运行多个命令:您可以使用+搜索历史记录,
而不是使用历史替换(!432或) ,一旦找到您想要的第一个命令跑,击+ (!-4CtrlrCtrlo操作并获得下一步)而不是密钥return
启动命令并提出下一个命令从历史上看。您可以Ctrl+o根据需要多次点击,并以return最后一次结束该序列,或者Ctrl+c停止而不启动它。

答案4

fcfor 循环和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

相关内容