An anderer Stelle habe ich eine CD gesehen, die wie folgt funktioniert:
cd()
{
builtin cd "$@"
}
warum wird es empfohlen, $@
anstatt zu verwenden $1
?
Ich habe ein Testverzeichnis "r st" erstellt und das Skript aufgerufen, das diese Funktion enthält, und es hat so oder so funktioniert
$ . cdtest.sh "r st"
aber $ . cdtest.sh r st
scheiterte, ob ich verwendet "$@"
oder"$1"
cd "$*"
funktioniert auch nicht mit mehr als 1 arg.Antworten:
Denn nach
bash(1)
,cd
nimmt ArgumenteDas Verzeichnis befindet sich also möglicherweise nicht in
$1
diesem Verzeichnis, da dies stattdessen eine Option wie-L
oder ein anderes Flag sein kann.Wie schlimm ist das
Es könnte sehr schief gehen, wenn Sie nicht dort landen, wo Sie es erwarten
cd "$1"
...quelle
Bei Verwendung von
"$@"
werden alle Argumente an übergeben,cd
wobei as$1
nur das erste Argument übergibt.In deinen Beispielen
funktioniert immer, wenn Sie nur ein Argument übergeben, aber wenn Sie auch ein Flag übergeben, wie z
Dann wird nur
"$@"
richtig ausgeführt, wo"$1"
es zu einemcd -L
vollständigen Verlust des Verzeichnisses kommt.jedoch
Schlägt fehl , in beiden Fällen , wie Sie mit zwei Parametern auf CD,
r
undst
das ist keine gültige Weise cd auszuführen. Parameter werden durch Leerzeichen getrennt, die in Anführungszeichen (wie im ersten Beispiel) oder mit Escapezeichen (r\ st
) gesetzt werden müssen, um als ein Argument behandelt zu werden.Im Falle von CD ist es jedoch sehr ungewöhnlich, Flags zu übergeben, und Sie können nicht mehrere Verzeichnisse übergeben, so dass Sie den Unterschied in einer realen Verwendung von CD
"$1"
oder"$@"
CD nicht bemerken. Bei anderen Befehlen werden Sie jedoch einen Unterschied feststellen. Daher empfiehlt es sich, immer zu verwenden,"$@"
wenn Sie eine Wrapper-Funktion oder ein Skript wie dieses erstellen möchten.quelle
Es gibt auch den Fall, wenn es keine Argumente gibt:
cd
Ohne Argumente wird das Ausgangsverzeichnis geändert. Wird ohne Argumente"$@"
zu nichts"$1"
erweitert , jedoch zu der leeren Zeichenfolge. Diese sind unterschiedlich:quelle
cd
eine gute Sache ist. Es wird ein Fehler verursacht, anstatt in das Basisverzeichnis zu wechseln. Insbesondere bei einigen anderen Befehlen führtrsync
ein Null-Argument zu unerwartetem Verhalten (enthält das aktuelle Verzeichnis in den Quellen der Übertragung).Argumente für ein Bash-Skript sind durch Leerzeichen getrennt. $ 1 ist das erste Argument. In Ihren Beispielen ...
In Beispiel 1 ist $ 1 die Zeichenfolge "r st" ... im zweiten Beispiel ist $ 1 die Zeichenfolge "r" ...
$ @ sind alle Argumente.
quelle