什么是“apt-get install !!” 做以及如何使它工作?

Tho*_*ler 54 command-line bash

我看到有人打字

apt-get install !!
Run Code Online (Sandbox Code Playgroud)

他这样做了几次,每次都安装了不同的程序。似乎它会自动找出接下来需要什么。

但是,当我在我的 Ubuntu 14.04.1 LTS 虚拟机上尝试时,它只是显示了一些使用说明。谷歌搜索apt-get install !!似乎不太好。许多搜索结果不包含双感叹号。

这是什么apt-get install !!做,什么可以在我的机器上缺少它没有工作?

Ste*_*hen 74

!! 是 bash 中的一个快捷方式,表示最后执行的命令。

尝试这个:

 echo hello
 !!
Run Code Online (Sandbox Code Playgroud)

在这种情况下,!!将扩展为另一个echo hello

我想象发生的事情是他们试图运行一个命令但它失败并抱怨它没有安装。然后他们输入,sudo apt-get install !!因为包名称与他们试图运行的命令的名称巧合。生成的命令将尝试安装与他们刚刚尝试执行的命令同名的软件包。

  • 是的,大概就是这样。如果我运行 `lynx`,看到它没有安装,然后运行 ​​`apt-get install !!` 它会安装 lynx。它对我不起作用,因为我尝试将 `apt-get install !!` 作为唯一的命令。 (10认同)
  • @AL:你首先输入`apt-get install some-program`,当你意识到你没有权限时,你只需`sudo !!`,它扩展为`sudo apt-get install some-program`。 (6认同)
  • 另一个常见用途是当某些东西应该作为 `sudo` 运行时,例如 `apt-get install`ing 某些东西。 (4认同)
  • `!!` 是 `!-1` 的别名,表示 bash 历史记录中的最后一项。`!-2` 是倒数第二个,依此类推。 (3认同)

hee*_*ayl 41

!!与 无关apt-get。它是一个 shell 关键字,将扩展为上一个命令。这种扩展是在解释当前命令之前由 shell 完成的。

来自man bash

!! 参考上一条命令。这是'!-1'的同义词。

例如,如果您运行一个命令:

echo "foo"
Run Code Online (Sandbox Code Playgroud)

然后如果你运行:

sudo apt-get install !!
Run Code Online (Sandbox Code Playgroud)

它将扩展为:

sudo apt-get install echo foo
Run Code Online (Sandbox Code Playgroud)

如您所见,它被扩展为两个包echo,另一个是foo. 没有名为fooand 的独立包echo。除了内置的 shell 之外,echo还有一个/bin/echo可执行文件,它是 GNU-coreutils 包的一部分。因此,您会收到错误消息,指出没有此类软件包可用。

另一方面,另一个人可能正在做这样的事情:

echo "foo"
Run Code Online (Sandbox Code Playgroud)

如您所见cowsay,正在安装。

我建议你不要这样做(除非你确定),明确无害。

  • 对`!!`的很好的解释。我知道这意味着什么,但我喜欢你描述它的方式。 (2认同)

Bil*_*lal 16

!!: 参考上一条命令。这是!-1来源)的同义词。

例如,如果我执行:

./test
Run Code Online (Sandbox Code Playgroud)

然后记住我需要成为 Root,然后我可以简单地输入:

sudo !!
Run Code Online (Sandbox Code Playgroud)

它与键入相同:

sudo ./test
Run Code Online (Sandbox Code Playgroud)

当您的最后一个命令包含大量字符时,这很有用。