如何重新运行倒数第二个命令?

如何重新运行倒数第二个命令?

我使用的是 Ubuntu 21.10。如果我搞砸了,我可以用 重新运行最后一个命令!!。以下是一个例子:

$ apt update
Reading package lists... Done
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
W: Problem unlinking the file /var/cache/apt/pkgcache.bin - RemoveCaches (13: Permission denied)
W: Problem unlinking the file /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Permission denied)
$ sudo !!
sudo apt update
[sudo] password for [me]:
...
Fetched 336 kB in 2s (206 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
98 packages can be upgraded. Run 'apt list --upgradable' to see them.

没问题,但是我怎样才能运行前一个命令而不是重新运行它呢?像这样:

$ echo hi
hi
$ echo hello
hello
$ !!   <-- I'm trying to get that to run 'echo hi'
hello

基本上,这就是我所寻找的

$ echo hi
hi
$ echo hello
hello
$ ???   <-- What can I put here to get it to run 'echo hi'?
echo hello!
hello!

那么,假设!!运行最后一条命令,我该如何运行上一条命令之前的命令?在我的示例中,除了键入!!,我还可以运行什么来执行echo hi

答案1

您可以使用up-arrowdown-arrow键循环查看命令历史记录。因此,要重新运行倒数第二个命令,您需要按up-arrow两次,然后按return

与 等方法相比,这种方法有几个优点!-2。最重要的是(在我看来),您可以看到命令并确保它是您想要重新运行的命令,然后再按回车键执行它。即使排除简单的错误(“哎呀,我猜这是我想要的第三个命令”),bash history 也可能不会像您期望的那样计算以前的命令,因为ignorespaceignoredupsHISTCONTROL变量等选项。

此外,交互式命令调用可让您在重新运行命令之前轻松编辑命令。您也可以使用历史调用修饰符来执行此操作,但再次以交互式方式执行此操作可让您在执行调用/修改的命令之前查看您的编辑。

另外,如果你像我一样懒惰,up-arrow up-arrow return打字比(shift)exclamation minus 2 return

答案2

来自以下HISTORY EXPANSION部分man bash

!-n    Refer to the current command minus n

因此,要运行倒数第二条命令,你可以使用!-2

事实上,!!只是!-1

答案3

!-n执行历史记录中的命令“-n”,但我不推荐这样做,因为它是“即时”的,不会给您时间首先检查“第 N 个”命令是否是您需要再次执行的正确命令...(@bac0n 很好地指出您可以设置:shopt -s histverify将其切换为“非即时”:它将让您在执行命令之前验证 !-n 扩展为<Enter>

但是,如果您使用bash它作为 shell,我更建议您使用搜索功能:

Ctrl 然后输入something,这是您要查找的命令的一部分。(例如:Ctrl++ r(输入终端)echo

它将显示历史匹配中的最新出现情况something(即匹配您在Ctrl+后输入的搜索词r)。

随后的Ctrl+r将进一步追溯您的历史记录。或者添加字母将精确搜索。

一旦找到合适的匹配,按Enter再次执行(或按Ctrl+c退出搜索而不执行当前显示的匹配命令)。

Enter附加提示:如果您按下Ctrl+而不是o,它将执行所选的历史命令并显示下一个可供执行的命令Enter(仅执行该命令并返回正常提示符)或再次按下Ctrl+ o(执行该命令并显示历史记录中的下一个命令)。重复一系列步骤并在执行这些命令之前显示这些命令非常有用。

每次使用这些东西时,您都可以更改当前显示的行上的某些内容(使用左或右箭头键在其中移动),例如参数,服务器名称等,然后执行修改后的行+转到下一行(如果您按下了Ctrl+ o)。

答案4

除了使用Ctrl-R <term>!-2重新运行旧命令之外,您还可以查看命令历史记录并按索引运行它。假设您的历史记录如下所示:

  ...
  1770  ls         
  1771  git status 
  1772  git add .  
  ...

您可以运行!1772以重新运行第 1772 号git add .

我的工作流程有时history |bat然后/<term>从那里运行特定的条目。

相关内容