我正在使用 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
?
您可以使用up-arrow和down-arrow键循环浏览您的命令历史记录。因此,要重新运行倒数第二个命令,您需要按up-arrow两次,然后按return.
与
!-2
. 最重要的是(在我看来),您可以看到该命令并确保它是您打算重新运行的命令,然后再按回车键执行它。即使除了简单的错误(“哎呀,我猜这是我想要的第三个命令”),bash 历史记录可能不会按照您期望的方式计算以前的命令,因为ignorespace
,ignoredups
和HISTCONTROL
变量等选项。此外,交互式命令调用可让您在重新运行之前轻松编辑命令。您也可以使用历史调用修改器来执行此操作,但再次以交互方式执行此操作可让您在执行调用/修改命令之前查看您的编辑。
另外,如果您像我一样懒惰,那么up-arrow up-arrow return输入比输入更容易(shift)exclamation minus 2 return
从
HISTORY EXPANSION
部分man bash
:因此,要在最后运行命令,您可以使用
!-2
其实
!!
只是一个代名词!-1
!-n
执行您历史记录的命令“-n”,但我不推荐它,因为它是“即时”的,不会给您时间首先检查“Nth”命令是否是您需要再次执行的正确命令。 . (@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)。
如果你跑
您将获得最后输入的“n”个命令的列表。历史记录大小默认为 500 个命令。因此,正如 steeldriver 所解释的,最后一个命令之前的命令可以重新运行
是的,倒数第三个将是
等等。有关更多详细信息,请使用
并搜索Event Designators。