web-dev-qa-db-fra.com

Qu'est-ce que ça fait! $ Moyenne?

Je suis sur un tutoriel et il mentionne cette commande:

Sudo chmod 700 !$

Je ne connais pas avec !$. Qu'est-ce que ça veut dire?

33
Andrew

Fondamentalement, c'est le dernier argument de la commande précédente.

!$ est la "fin" de la commande précédente. Considérez l'exemple 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 d'utilisateurs, nous voulons l'enlever de cela. Nous pouvons tirer parti de VI avec cet arbre de répertoire à long terme comme argument ou comme simplement vi !$ Quelle bash se développe:

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

(- source ; guide pratique, au fait)


Cela ne vaut rien de la distinction entre cette !$ jeton et la variable spéciale de la coque $_. En effet, les deux Développer au dernier argument de la commande précédente. Pourtant, !$ est élargi pendant expansion de l'historique, tandis que $_ est développé pendant expansion des paramètres. Une conséquence importante en est que, lorsque vous utilisez !$, le développé La commande est enregistrée dans votre historique.

Par exemple, considérons les frappes de frappe

  • echo Foo Enterecho !$ Jar EnterUpEnter; et

  • echo Foo Enterecho $_ Jar EnterUpEnter.

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

Dans le premier, quand vous appuyez sur Up, la ligne de commande lit echo Foo Jar, la dernière ligne écrite sur 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 égale à ce qu'elle n'a fait précédemment, $_ est maintenant Jar, la dernière ligne écrite sur stdout est Jar Jar.

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

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

prints isomorphism isosceles. Mais il n'y a pas d'analogue "${!$%morphism} "Expansion.

Pour plus d'informations sur les phases de l'expansion à bash, voir la section EXPANSION de man 1 bash (Ceci s'appelle Expansions Shell dans l'édition en ligne). Le HISTORY EXPANSION la section est séparée.

44
wchargin

À proprement parler !$ est le dernier mot de la dernière commande de la liste d'historique.

Mot - une séquence de caractères traitées comme une unité par la coque. Les mots ne peuvent pas inclure des métacaracters non cotés.

metacharacter - un personnage qui, quand il est incontournable, sépare les mots. Un métacaracter est un blanc ou l'un des caractères suivants: '|', '&', ';'; ',' (',') '', '<', ou '>'

blanc - un espace ou un caractère d'onglet.

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
4
Evgeny Vereshchagin