!#(感叹号散列)、!$:r:r(感叹号美元冒号 r)、!#:t(感叹号散列冒号 t)在下面的 bash 命令中是什么意思?

dep*_*pfx 4 bash command-history

我一直在尝试安装 Nagios 软件包,但在此处的指南中偶然发现了这些奇怪的 bash 扩展。有人可以帮助我理解扩展的含义吗?维基链接也有助于将来参考。

root@z:~> wget http://mathias-kettner.de/download/check_mk-1.1.7i5.tar.gz
root@z:~> tar zxvf !#:t
root@z:~> chown -R root:root !$:r:r && chmod -R o-w !$:r:r && cd !$:r:r
root@z:~/check_mk-1.1.7i5> ./setup.sh
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 6

这些是bash历史扩展关键字。他们从 shell 历史记录中选择一行并重新插入(部分)它,修改后可能。您链接到的站点做了合理的解释工作,但它并没有描述所有这些。

tar zxvf !#:t
Run Code Online (Sandbox Code Playgroud)

实际上没有意义:!#选择到目前为止输入的行,但tar zxvf我们不想重复使用其中的任何一个。它应该是

tar zxvf !$:t
Run Code Online (Sandbox Code Playgroud)

它选择上一行 ( !$)的最后一部分,即提供给 的 URL wget,并获取文件名部分 ( :t, 表示尾部 — 严格来说,它是最后一个目录分隔符之后剩下的部分,/,恰好与 URL 配合得很好)。

然后

chown -R root:root !$:r:r
Run Code Online (Sandbox Code Playgroud)

选择前一行的最后一部分,删除文件扩展名(:r——严格来说,它删除了最后一个 之后的任何内容.,包括.),这给出了目录名称(假设 tarball 包含一个与 tarball 基本名称同名的目录)。在chmod与cd以同样的方式进行的命令。