我使用的是 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-arrow和down-arrow键循环查看命令历史记录。因此,要重新运行倒数第二个命令,您需要按up-arrow两次,然后按return。
与 等方法相比,这种方法有几个优点!-2
。最重要的是(在我看来),您可以看到命令并确保它是您想要重新运行的命令,然后再按回车键执行它。即使排除简单的错误(“哎呀,我猜这是我想要的第三个命令”),bash history 也可能不会像您期望的那样计算以前的命令,因为ignorespace
、ignoredups
和HISTCONTROL
变量等选项。
此外,交互式命令调用可让您在重新运行命令之前轻松编辑命令。您也可以使用历史调用修饰符来执行此操作,但再次以交互式方式执行此操作可让您在执行调用/修改的命令之前查看您的编辑。
另外,如果你像我一样懒惰,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>
从那里运行特定的条目。