What is bang dollar (!$) in Bash?

后端 未结 3 590
离开以前
离开以前 2020-12-14 00:37

Bang dollar seems to refer to the last part of the last command line.

E.g.

$ ls -l
 .... something
$ !$
-l
bash: -l command not found
3条回答
  •  失恋的感觉
    2020-12-14 01:28

    That's the last argument of the previous command. From the documentation:

    !!:$

    designates the last argument of the preceding command. This may be shortened to !$.

    Remark. If you want to play around with Bash's history, I suggest you turn on the shell option histverify like so:

    shopt -s histverify
    

    (you can also put it in your .bashrc to have it on permanently). When using history substitution, the substitution is not executed immediately; instead, it is put in readline's buffer, waiting for you to press enter… or not!


    To make things precise, typing !$ is not equivalent to typing "$_": !$ is really a history substitution, refering to the last word of the previous command that was entered, whereas "$_" is the last argument of the previously executed command. You can compare both (I have shopt -s histverify):

    $ { echo zee; }
    zee
    $ echo "$_"
    zee
    $ { echo zee; }
    zee
    $ echo !$
    $ echo }
    

    Also:

    $ if true; then echo one; else echo two; fi
    one
    $ echo "$_"
    one
    $ if true; then echo one; else echo two; fi
    $ echo !$
    $ echo fi
    

    And also:

    $ echo zee; echo "$_"
    zee
    zee
    $ echo zee2; echo !$
    $ echo zee2; echo "$_"
    

    And also

    $ echo {1..3}
    1 2 3
    $ echo "$_"
    3
    $ echo {1..3}
    1 2 3
    $ echo !$
    $ echo {1..3}
    

    And also

    $ echo one ;
    $ echo "$_"
    one
    $ echo one ;
    one
    $ echo !$
    $ echo ;
    

    There are lots of other examples, e.g., with aliases.

提交回复
热议问题