$_
est dit être le dernier argument de la commande précédente.
Je me demande donc pourquoi ce n'est pas le cas EDITOR="emacs -nw"
mais EDITOR
dans l'exemple suivant?
Pourquoi ne fait-il pas "emacs -nw"
partie du dernier argument?
Plus généralement, quelles sont les définitions d'un argument, et le dernier argument?
Merci.
$ export EDITOR="emacs -nw"
$ echo $_
EDITOR
EDITOR
est un argument pour exporterpdksh
etdash
inclura la valeur qui a été affectée, maisksh93
se comportera de labash
même manière.export FOO=bar; echo $_
imprimeexport
.export
s'agit d'un utilitaire intégré.typeset -x FOO=bar
ensuite , mais dans Bash imprime .echo $_
FOO
declare -x FOO=bar; echo $_
FOO=bar
Réponses:
Bash traite les affectations de variables, quand ils sont autorisés comme arguments (avec
alias
,declare
,export
,local
,readonly
, ettypeset
), avant toute autre chose (ou plutôt, il les identifie avant tout - l' expansion s'applique aux valeurs affectées aux variables). En ce qui concerne l'expansion des mots, la commande restante estexport EDITOR
, donc_
est définie surEDITOR
.De manière générale, les arguments sont les «mots» restants après l'expansion (qui n'incluent pas les affectations de variables et les redirections).
Voir Extension de commande simple dans le manuel de Bash pour plus de détails.
la source
declare
le comportement de ne correspond pas à ce que je décris ...declare a=b; echo $_
gravuresa=b
;export c=d; echo $_
imprime justec
.alias
semble imprimer seulement le nom,local
d'un autre côté, imprime tout l'argument. Etreadonly
imprime également juste le nom, ce que j'ai trouvé un peu surprenant car j'aurais penséreadonly
etlocal
serait similairedeclare
.export
etreadonly
sont déclarés ensemblesetattr.def
,declare
,local
ettypeset
sont déclarés dansdeclare.def
,alias
est le seul dansalias.def
.alias, declare, export, local, readonly
ettypeset
. Que se passe-t-il en premier et ensuite? "Quand il s'agit de l'expansion des mots, la commande restante estexport EDITOR
", impliquez-vous que l'affectation des variablesEDITOR="emacs -nw"
se produit avant l'expansion? Sinon, pourquoi la commande restante ne contient pas l'affectation comme argument? Si oui, l'expansion sur les valeurs affectées aux variables ne doit-elle pas se produire avant d'effectuer l'affectation des variables?TL; DR: dans le cas de
export FOO=bar
, bash invoque sa création d'environnement temporaire, définitFOO=bar
dans cet environnement, puis donne une commande finale deexport FOO
. À ce stade,FOO
est pris comme dernier argument.Ah, les abusés
$_
:Regardons quelques variantes:
Nous voyons donc trois modèles ici:
$_
est défini sur le nom de la commande lui-même si aucun argument, sinon le dernier des arguments présentés.$_
n'est pas modifié.$_
est réglé sur quelque chose qui n'est pas tout à fait attendu; bizarre.J'ai instrumenté le code pour donner un aperçu de l'étrangeté.
Vous pouvez voir que l' analyseur voit le dernier argument attendu (
lastarg=
) dans tous les cas, mais ce qui se passe ensuite dépend de ce que bash pense que cela devrait se produire. Voir execute_cmd.c, execute_simple_command () .Dans le cas de
export FOO=bar
, bash effectue l'affectation puis exporte la variable. Cela semble cohérent avec l'affirmation de la documentation selon laquelle le dernier argument a été calculé après l'expansion.la source
MAILCHECK
Pour répondre à la question du titre, essayez
!$
:Il s'agit d'une expansion historique. Depuis la page de manuel bash:
...
...
...
...
...
...
la source
export EDITOR="emacs -nw"
» se compose de deux mots: le premier est «export
» et le second est «EDITOR="emacs -nw"
». La question est vraiment de demander: «Que signifient la page de manuel bash et le manuel Bash quand ils disent que!_
« se développe jusqu'au dernier argument de la commande précédente », étant donné que bash est défini$_
sur«EDITOR
»dans ce cas?» Copier et coller la section de page de manuel bash sur l'expansion de l'historique n'est pas particulièrement utile.