What is bang dollar (!$) in Bash?

后端 未结 3 591
离开以前
离开以前 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:08

    Monkey's answer:

    whit !$ you can easily print the last word of the previous command

    #Create new file
    touch newfile.txt
    #Edit new file using !$ instead newfile.txt again
    nano !$
    
    0 讨论(0)
  • 2020-12-14 01:16

    !$ can do what $_ does, except the fact that $_ does not store the value it returns (as its substitution) to history.

    Here is an example.

    With !$

    za:tmep za$ ls -lad 
    drwxr-xr-x  4 za  staff  136 Apr  6  2016 .
    za:tmep za$ !$
    -lad
    -bash: -lad: command not found
    za:tmep za$ history | tail -n 3
      660  ls -lad 
      661  -lad                     <<== history shows !$ substitution.  
      662  history | tail -n 3
    

    With $_

    za:tmep za$ ls -lad
    drwxr-xr-x  4 za  staff  136 Apr  6  2016 .
    za:tmep za$ $_
    -bash: -lad: command not found
    za:tmep za$ history | tail -n 3
      663  ls -lad
      664  $_         <<== history shows $_ and not its substitution. 
      665  history | tail -n 3
    za:tmep za$ 
    

    More options:

    !^      first argument
    !:2     second argument
    !:2-$   second to last arguments
    !:2*    second to last arguments
    !:2-    second to next to last arguments
    !:2-3   second to third arguments
    !$      last argument
    !*      all arguments
    
    0 讨论(0)
  • 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.

    0 讨论(0)
提交回复
热议问题