在bash中使用`!#`有什么用?

Ari*_*ler 8 bash shell

我不是在谈论UNIX shebang意图给出解释器的路径.事实上,shebang已经很难成功地谷歌这个问题了...

我在谈论bash扩张:

  • !! 检索前一个命令(类似于向上箭头,但更有用)
  • !$ 检索最后一个命令的最后一个单词
  • !# 似乎检索当前行

实际上有用的是!#什么?

  • echo !# 扩展到 echo echo
  • echo echo !# 扩展到 echo echo echo echo
  • ls !#扩展到ls ls.

所有这些看起来都是毫无意义的.我所知道的关于!#命令的是我从使用它中学到的东西 - 我不确定我是否知道它的真正功能.

Wil*_*ell 5

正如对问题和其他答案的评论所述,您可以轻松找到以下部分man bash

!#     The entire command line typed so far.
Run Code Online (Sandbox Code Playgroud)

手册页或其他文档没有明确说明并且可能会让您!#感到困惑的有用用途是 bash 事件指示符旨在与单词指示符和修饰符结合使用(在事件指示符下方找到手册页)。将命令与管道链接在一起时,用例也更有意义,;或者&/&&

例如:

我可以使用替换修饰符foo.sh针对两个输入运行脚本,bar并且baz

$ ./foo.sh bar; !#:s/bar/baz/
Run Code Online (Sandbox Code Playgroud)

扩展为:

./foo.sh bar; ./foo.sh baz;
Run Code Online (Sandbox Code Playgroud)

或者下面复制的 Docs (RIP Docs) 中的一个例子显示了如何使用单词选择器:N来选择到目前为止输入的命令的第一个参数,并整齐地 cd 到刚刚创建的目录中:

$ mkdir backup_download_directory && cd !#:1
mkdir backup_download_directory && cd backup_download_directory
Run Code Online (Sandbox Code Playgroud)

这些例子非常琐碎,但我希望它们展示如何!#在制作强大的单行代码的同时真正为某人节省一些严重的冗余输入。