web-dev-qa-db-fra.com

$ _ vs! $. Dernier argument de la commande précédente et redirection de sortie

La question concerne les variables spéciales. La documentation dit:

!!:$

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


($_, un trait de soulignement.) Au démarrage de Shell, définissez le nom de chemin absolu utilisé pour appeler le shell ou le script Shell en cours d'exécution tel que transmis dans l'environnement ou la liste d'arguments. Par la suite, se développe en dernier argument de la commande précédente après expansion. Définissez également le chemin d'accès complet utilisé pour appeler chaque commande exécutée et placée dans l'environnement exporté vers cette commande.

Il doit y avoir une différence que je ne peux pas saisir, car:

$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt

$ echo "hello" > /tmp/a.txt
$ echo $_
hello

Quelle est la différence?

35
Loom

!$ est un désignateur Word de l'expansion de l'historique, il se développe jusqu'au dernier mot de la commande précédente dans historique . IOW, le dernier mot de l'entrée précédente dans l'histoire. Ce mot est généralement le dernier argument à commander, mais pas en cas de redirection. Dans:

echo "hello" > /tmp/a.txt

toute la commande 'echo "hello" > /tmp/a.txt' est apparu dans l'histoire et /tmp/a.txt est le dernier mot de cette commande.

_ est un paramètre Shell, il se développe jusqu'au dernier argument de la commande précédente. Ici, la redirection ne fait pas partie des arguments passés à la commande, donc seul hello est l'argument passé à echo. Voilà pourquoi $_ étendu à hello.

_ ne fait plus partie des paramètres spéciaux standard du shell . Il fonctionne dans bash, zsh, mksh et dash uniquement lorsqu'il est interactif, ksh93 uniquement lorsque deux commandes sont sur des lignes séparées:

$ echo 1 && echo $_
1
/usr/bin/ksh

$ echo 1
1
$ echo $_
1
40
cuonglm