Wie versteht der Bash-Alias ​​"$ @"?

352
Sepehr Nazari

Ich versuche ein Alias ​​zu schreiben, um zwei Dinge zu tun

$alias cde='cd "$@" && echo' 

aber aus irgendeinem grund, wenn ich es mit anrufe

$cde test test 

alles was passiert ist echos test:

Es scheint, dass mein Argument nicht an die erste Anweisung übergeben wird, sondern am Ende des gesamten Alias ​​verbraucht wird. Nach meinem Verständnis sollte das $@alle Argumente verbrauchen, damit es niemals das Echo erreicht. Wie kann ich ein Argument im ersten Teil verwenden und nicht im zweiten Teil?

1
Ich habe eine generische Antwort geschrieben, aber einige Ihrer Fragen sind unklar. "Wie kann ich ein Argument im ersten Teil verwenden und nicht im zweiten?" - Wollen Sie nur "Echo" ohne Argumente? Welchen Sinn macht es? Warum "&&"? ** Was willst du genau passieren? ** Kamil Maciorowski vor 6 Jahren 0

1 Antwort auf die Frage

5
Kamil Maciorowski

Alias ​​akzeptiert keine Argumente. Es ersetzt einfach eine Zeichenfolge durch die andere in Ihrer Befehlszeile. $@Für einen Alias gibt es kein separates Zeichen. Er wird also "$@"nicht wie erwartet erweitert. Es wird erweitert, als ob Sie direkt in Ihre Befehlszeile (von Hand) eingegeben hätten:

echo "$@" 

(Dies zeigt nicht das genaue Wort, aber es ist nicht der Punkt).

Eine Funktion nimmt jedoch Argumente und hat ihre eigenen $@. Es ist mir nicht klar, ob Sie echoIhre Alias ​​"Argumente" drucken möchten. Wenn ja, würde ich dies anstelle eines Alias ​​tun:

cde() { cd "$@" ; echo "$@" ; } 

Oder eher:

cde() { cd "$@" ; pwd ; } 

Der Unterschied besteht in der Handhabung (Echo) mehrerer Argumente, dem Erweitern von Pfaden ..usw. Auch Optionen -Lund -POptionen pwdkönnen nützlich sein.

Wenn Sie überschreiben möchten, cdmüssen Sie commandeine Endlosschleife vermeiden (die Funktion würde sich ansonsten aufrufen):

cd() { command cd "$@" ; pwd ; } 
Es ist tatsächlich schlimmer als das. Das `" $ @ "`, wenn der Alias ​​ausgeführt wird, ist eigentlich das, was die ** aktuellen ** Positionsparameter sind. Testen Sie den Alias ​​mit `set - foo bar; cde baz` -> `bash: cd: foo: Keine solche Datei oder Verzeichnis ' glenn jackman vor 6 Jahren 1