web-dev-qa-db-fra.com

Qu'est-ce qu'un bang dollar (! $) Dans Bash?

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

Par exemple.

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

Je peux trouver beaucoup sur les variables en dollars (par exemple $!) mais pas là-dessus. Une explication?

25
Snowcrash

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

!!:$

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

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

shopt -s histverify

(vous pouvez également le mettre dans votre .bashrc pour l'avoir en permanence). Lorsque vous utilisez la substitution d'historique, la substitution n'est pas exécutée immédiatement; à la place, il est placé dans le tampon de readline, en attendant que vous appuyiez sur Entrée… ou pas!


Pour être plus précis, saisissez !$ n'est pas équivalent à taper "$_": !$ est vraiment une substitution d'historique, faisant référence au dernier mot de la commande précédente qui a été entrée, tandis que "$_" est le dernier argument de la commande précédente exécutée. 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 existe de nombreux autres exemples, par exemple, avec des alias.

35
gniourf_gniourf

!$ peut faire quoi $_ le fait, sauf que $_ ne stocke pas la valeur qu'elle renvoie (comme substitution) dans history.

Voici 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
6
zee

Réponse de singe:

whit! $ vous pouvez facilement imprimer le dernier mot du commande précédente

#Create new file
touch newfile.txt
#Edit new file using !$ instead newfile.txt again
nano !$
0
Mike D3ViD Tyson