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

时间:2017-08-16 18:10:48

标签: bash shell

我不是在谈论用于提供解释器路径的UNIX shebang。事实上,shebang已经很难成功地谷歌这个问题......

我在谈论bash扩展:

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

但是 !#的实际用途是什么?

  • echo !#扩展为echo echo
  • echo echo !#扩展为echo echo echo echo
  • ls !#扩展为ls ls

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

2 个答案:

答案 0 :(得分:3)

!#到目前为止输入的整个命令行。来自man bash

Event Designators
   An event designator is a reference to a command line entry in the history list.

   !      Start a history substitution, except when followed by a blank, newline, carriage return,  =  or  (
          (when the extglob shell option is enabled using the shopt builtin).
   !n     Refer to command line n.
   !-n    Refer to the current command line minus n.
   !!     Refer to the previous command.  This is a synonym for `!-1'.
   !string
          Refer to the most recent command starting with string.
   !?string[?]
          Refer  to  the  most recent command containing string.  The trailing ? may be omitted if string is
          followed immediately by a newline.
   ^string1^string2^
          Quick substitution.  Repeat the last command,  replacing  string1  with  string2.   Equivalent  to
          ``!!:s/string1/string2/'' (see Modifiers below).
   !#     The entire command line typed so far.

一个用法示例:

$ mkdir foo && cd !#:1

制作目录foo并更改为目录。

答案 1 :(得分:3)

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

!#     The entire command line typed so far.

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

例如:

我可以使用替换修饰符针对两个输入foo.shbar运行脚本baz

$ ./foo.sh bar; !#:s/bar/baz/

扩展为:

./foo.sh bar; ./foo.sh baz;

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

$ mkdir backup_download_directory && cd !#:1
mkdir backup_download_directory && cd backup_download_directory

这些例子非常简单,但我希望它们能说明!#如何在制作强大的单行内容时真正为某些人节省一些严重的冗余打字。