Que signifie! $?

Je suis en train de suivre un tutoriel et il mentionne dexécuter cette commande:

sudo chmod 700 !$ 

Je « ne suis pas familier avec !$. Quest-ce que cela signifie?

Commentaires

  • Il est généralement ' dessayer de echo quelque chose si vous ' nêtes pas sûr de ce quil ' fera.
  • @Shadur, pas toujours. echo $(rm -rf /)
  • @cjm Sauf si vous ' êtes sur un système vraiment ancien, vous ' Vous aurez besoin de loption --no-preserve-root, et si vous voyez les mots " pas de conserve " dans un programme, il vaut mieux réfléchir sérieusement à ce quil fait.
  • @WChargin Soyez très prudent en supposant que " vraiment vieux " et " pas Linux / ne pas utiliser GNU coreutils " sont la même chose; ils ne sont pas ' t.

Réponse

En gros, il « est le dernier argument de la commande précédente.

!$ est la » fin « de la commande précédente Prenons lexemple suivant: Nous commençons par chercher un mot dans un fichier:

grep -i joe /some/long/directory/structure/user-lists/list-15 

si Joe est dans cette liste dutilisateurs, nous voulons lenlever . Nous pouvons soit lancer vi avec cette longue arborescence de répertoires comme argument, soit aussi simplement que vi !$ Quelle bash se développe en:

vi /some/long/directory/structure/user-lists/list-15 

( source ; guide pratique, au fait)


La distinction entre ce jeton !$ et la variable shell spéciale $_ ne vaut rien . En effet, les deux sétendent jusquau dernier argument de la commande précédente. Cependant, !$ est développé pendant lexpansion de lhistorique , tandis que $_ est développé pendant lexpansion des paramètres . Une conséquence importante de ceci est que, lorsque vous utilisez !$, la commande développée est enregistrée dans votre historique.

Par exemple, considérez les frappes au clavier

  • echo Foo Entrée echo !$ Jar Entrez Haut Entrez ; et

  • echo Foo Entrez echo $_ Jar Entrez Haut Entrez.

(Les seuls caractères modifiés sont les $! et $_ au milieu.)

Dans le premier, lorsque vous appuyez sur Haut , la ligne de commande lit echo Foo Jar, donc la dernière ligne écrite dans stdout est Foo Jar.

Dans ce dernier, lorsque vous appuyez sur Up , la ligne de commande lit echo $_ bar, mais maintenant $_ a une valeur différente de ce quelle faisait auparavant – en effet, $_ est désormais Jar, donc la dernière ligne écrite dans stdout est Jar Jar.

Une autre conséquence est que _ peut être utilisé dans dautres extensions de paramètres, par exemple, la séquence de commandes

printf "%s " isomorphism printf "%s\n" ${_%morphism}sceles 

affiche isomorphism isosceles. Mais il « ny a pas dexpansion analogue » ${!$%morphism} « .

Pour plus dinformations sur les phases dexpansion dans Bash, consultez le EXPANSION section de man 1 bash (cela sappelle Expansions Shell dans lédition en ligne). Les HISTORY EXPANSION La section est séparée.

Commentaires

  • Bien. Bon à savoir. Aussi, bonne chose là ' s Stack Exchange. Il est ' difficile de rechercher sur Google quelque chose comme !$
  • BTW, sur la ligne de commande, vous pouvez insérer le dernier argument de la commande précédente par insert-last-argument, généralement lié à M-..
  • @Andrew, noubliez pas daccepter ceci si cela répond à votre question. Accepter et voter plutôt que publier des commentaires est la façon dont les remerciements sont exprimés sur le réseau SE, voir ici pour le " position officielle ".
  • @Andrew FYI, jai cherché sur Google " bash bang dollar " et jai obtenu des résultats décents, y compris ce lien comme troisième liste.
  • @terdon Jai essayé daccepter la réponse hier soir, mais cétait tellement rapide que jai été forcé dattendre pour laccepter.

Réponse

Strictement parlant !$ est le dernier mot de la dernière commande de la liste dhistorique.

mot – Une séquence de caractères traités comme une unité par le shell. Les mots ne peuvent pas inclure de métacaractères sans guillemets.

metacharacter – Un caractère qui, lorsquil nest pas entre guillemets, sépare les mots. Un méta-caractère est un blanc ou lun des caractères suivants: |, &, ;, (, ), < , ou >

vide – Un espace ou une tabulation.

Exemples:

set -o history # enable command history set -o histexpand # enable ! style history substitution HISTSIZE=10 # save all lines on the history list HISTCONTROL= HISTIGNORE= date echo !$ # prints date date>/dev/null echo !$ # prints /dev/null echo a b c>/dev/null echo !$ # prints /dev/null HISTCONTROL=ignorespace # lines which begin with a space character are not saved in the history list echo a b c echo d e f # space at the beginning echo !$ # prints c 

Commentaires

Réponse

!$ vous donnera la dernière commande utilisée pour cet utilisateur particulier ….

vous pouvez également trouver lhistorique des commandes utilisées précédemment en utilisant la commande history … essayez-le ….

REMARQUE: Pour un utilisateur particulier, toutes les commandes utilisées précédemment seront stockées dans le fichier dhistorique de bash.

Commentaires

  • Les autres réponses sont justes. Celui-ci est faux.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *