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 du shell, définissez le chemin d'accès absolu utilisé pour appeler le shell ou le script de shell en cours d'exécution tel que transmis dans l'environnement ou la liste d'arguments. Par la suite, se développe jusqu'au dernier argument de la commande précédente après l'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 attraper, 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?
bash
shell
history-expansion
Métier à tisser
la source
la source
$_
. C'est crucial. Cela peut ne pas expliquer la différence qui vous intrigue, mais cela explique un tas d'autres façons$_
et!$
ne sont pas les mêmes.Réponses:
!$
est un désignateur de mot de l'expansion de l'histoire, il se développe jusqu'au dernier mot de la commande précédente de l' histoire . 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:toute la commande
'echo "hello" > /tmp/a.txt'
est apparue 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 seulhello
l'argument est passé àecho
. C'est pourquoi$_
étendu àhello
._
n'est plus l'un des paramètres spéciaux standard du shell . Il fonctionnebash
,zsh
,mksh
etdash
que lorsque interactive,ksh93
que lorsque deux commandes sont sur des lignes séparées:la source
!$
expansion par rapport au$_
paramètre est qu'ilecho $_
apparaît toujours dans l'historique commeecho $_
, tandis qu'ilecho !$
montre la valeur à laquelle il a été étendu. Par exemple,echo one two
puisecho !$
, en appuyant sur les spectaclesecho two
.