$_
soll das letzte Argument des vorherigen Befehls sein.
Also frage ich mich, warum es nicht so ist, EDITOR="emacs -nw"
aber EDITOR
im folgenden Beispiel?
Warum ist das nicht "emacs -nw"
Teil des letzten Arguments?
Was sind allgemein die Definitionen eines Arguments und das letzte Argument?
Vielen Dank.
$ export EDITOR="emacs -nw"
$ echo $_
EDITOR
EDITOR
ist ein Argument zum Exportierenpdksh
unddash
enthält den zugewiesenen Wert,ksh93
verhält sich jedoch wiebash
folgt.export FOO=bar; echo $_
, drucktexport
.export
es sich um ein integriertes Dienstprogramm handelt.typeset -x FOO=bar
dann , aber in Bash druckt .echo $_
FOO
declare -x FOO=bar; echo $_
FOO=bar
Antworten:
Bash verarbeitet Variablenzuweisungen, wenn sie als Argumente zulässig sind (mit
alias
,declare
,export
,local
,readonly
, undtypeset
), bevor irgendetwas anderes (oder besser gesagt, es ihnen , bevor irgendetwas identifiziert andere - Erweiterung der Variablen zugewiesen Werte gilt). Wenn es um die Worterweiterung gehtexport EDITOR
,_
ist der verbleibende Befehl , also auf gesetztEDITOR
.Im Allgemeinen sind Argumente die „Wörter“, die nach der Erweiterung verbleiben (ohne Variablenzuweisungen und Umleitungen).
Weitere Informationen finden Sie unter Einfache Befehlserweiterung im Bash-Handbuch.
quelle
declare
, dass sein Verhalten nicht mit dem übereinstimmt, was ich beschreibe ...declare a=b; echo $_
Druckea=b
;export c=d; echo $_
druckt nurc
.alias
scheint nur den Namen zu drucken,local
druckt andererseits das ganze Argument. Undreadonly
auch druckt nur den Namen, die ich ein bisschen fand überraschend , da ich gedacht hättereadonly
undlocal
würde ähnlich seindeclare
.export
undreadonly
sind zusammen in deklariertsetattr.def
,declare
,local
, undtypeset
in deklariert sinddeclare.def
,alias
steht allein inalias.def
.alias, declare, export, local, readonly
und verwendet werdentypeset
. Was passiert zuerst und als nächstes? "Wenn es um die Worterweiterung geht, lautet der verbleibende Befehlexport EDITOR
". Bedeuten Sie, dass die VariablenzuweisungEDITOR="emacs -nw"
vor der Erweiterung erfolgt? Wenn nicht, warum enthält der verbleibende Befehl die Zuweisung nicht als Argument? Wenn ja, müssen die den Variablen zugewiesenen Werte nicht erweitert werden, bevor die Variablenzuweisung durchgeführt wird?TL; DR: Im Fall von
export FOO=bar
ruft bash seine temporäre Umgebungserstellung auf, setztFOO=bar
in dieser Umgebung und gibt dann einen endgültigen Befehl von ausexport FOO
. An dieser StelleFOO
wird als letztes Argument genommen.Ah, der viel missbrauchte
$_
:Schauen wir uns einige Variationen an:
Wir sehen hier also drei Muster:
$_
Wird auf den Befehlsnamen selbst gesetzt, wenn keine Argumente vorhanden sind, andernfalls das letzte der dargestellten Argumente.$_
wird nicht geändert.$_
ist auf etwas eingestellt, was nicht ganz erwartet wird; seltsam.Ich habe den Code instrumentiert, um einen Einblick in die Verrücktheit zu geben.
Sie können sehen, dass der Parser
lastarg=
in allen Fällen das erwartete letzte Argument ( ) sieht , aber was danach passiert, hängt davon ab, was Bash für richtig hält. Siehe execute_cmd.c, execute_simple_command () .Im Fall von
export FOO=bar
nimmt bash die Zuweisung vor und exportiert dann die Variable. Dies scheint im Einklang mit der Behauptung der Dokumentation zu stehen, dass das letzte Argument nach der Erweiterung berechnet wurde.quelle
MAILCHECK
Um die Titelfrage zu beantworten, versuchen Sie
!$
:Dies ist eine Erweiterung der Geschichte. Aus der Bash-Manpage:
...
...
...
...
...
...
quelle
export EDITOR="emacs -nw"
» aus zwei Wörtern besteht: das erste ist «export
» und das zweite ist «EDITOR="emacs -nw"
». Die Frage ist wirklich fragen : „Was die bash man - Seite und die Bash - Handbuch Mittelwert tun , wenn sie sagen , dass!_
‚erweitert sich auf die letzte Argument des vorherigen Befehls‘, da die bash - Sets$_
zu«EDITOR
»in diesem Fall?“ Das Kopieren und Einfügen des Bash-Manpage-Abschnitts zur Verlaufserweiterung ist nicht besonders hilfreich.