22 votes

Qu'est-ce que bang dollar (!$) en Bash?

Bang dollar semble faire référence à la dernière partie de la dernière ligne de commande.

E. g.

$ ls -l
 .... something
$ !$
-l
bash: -l command not found

Je peux en trouver plein sur le dollar variables (par exemple, $!), mais pas sur ce point. Une explication?

30voto

gniourf_gniourf Points 9393

C'est le dernier argument de la commande précédente. À partir de la documentation:

!!:$

désigne le dernier argument de la commande précédente. Ce délai peut être raccourci à l' !$.

Remarque. Si vous voulez jouer avec Bash de l'histoire, je vous suggère d'activer l'option shell histverify comme:

shopt -s histverify

(vous pouvez aussi la mettre dans votre .bashrc de l'avoir en permanence). Lors de l'utilisation de l'histoire de la substitution, la substitution n'est pas exécuté immédiatement; au lieu de cela, il est mis en readline du tampon, attend que vous appuyez sur entrée... ou pas!


Pour rendre les choses précises, en tapant !$ n'est pas équivalent à taper "$_": !$ est vraiment une histoire de substitution, se référant à la dernière parole de la commande précédente qui a été saisie, alors qu' "$_" est le dernier argument de la déjà exécuté la commande. Vous pouvez comparer les deux (j'ai shopt -s histverify):

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

Aussi:

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

Et aussi:

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

Et aussi

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

Et aussi

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

Il y a beaucoup d'autres exemples, par exemple, avec des alias.

6voto

NullSoulException Points 808

!$ peut faire ce qu' $_ , sauf le fait qu' $_ ne pas stocker la valeur qu'elle renvoie (comme son substitution) d' history.

Ici est un exemple.

Avec !$

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

Avec $_

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$ 

Plus d'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

0voto

Mike D3ViD Tyson Points 154

Singe de réponse:

pentecôte !$ vous pouvez facilement imprimer le dernier mot de la commande précédente

#Create new file
touch newfile.txt
#Edit new file using !$ instead newfile.txt again
nano !$

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X