Für Bash-Skripte kann ich "$@"
auf Argumente zugreifen. Was ist das Äquivalent, wenn ich einen Alias verwende?
64
Aliase sind insofern wie Befehle, als alle Argumente an sie als Argumente an das Programm übergeben werden, das sie als Alias verwenden. Zum Beispiel, wenn Sie alias waren ls
zu ls -la
, dann eingeben ls foo bar
würde wirklich ausführen ls -la foo bar
auf der Kommandozeile.
Wenn Sie die tatsächliche Kontrolle darüber haben möchten, wie die Argumente interpretiert werden, können Sie eine Funktion wie die folgende schreiben:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "$@"
}
sh
sind definiertmy_program_wrapper() { ...; }
. Bash kümmert sich um das Schlüsselwort,function
aber warum nicht mit dem, was portabler ist?Alias-Lösung
Wenn Sie wirklich gegen die Verwendung einer Funktion per se sind, können Sie Folgendes verwenden:
Sie können ersetzen
$@
mit ,$1
wenn Sie das erste Argument wollen.Erläuterung
Dadurch wird eine temporäre Funktion erstellt
f
, an die die Argumente übergeben werden.Alias-Argumente werden nur am Ende übergeben. Beachten Sie, dass
f
ganz am Ende des Alias aufgerufen wird.Das
unset -f
entfernt die Funktionsdefinition, wenn der Alias ausgeführt wird, damit er danach nicht herumhängt.quelle
wrap_args x y z
gibt mir: Bash: Syntaxfehler in der Nähe von unerwartetem Token "("f
mich geirrt. Sobald ich unausgeglichen bin, funktioniertf
es gut. Die alte Namenskollisionssache.command type f
:)Neben den derzeitigen Antworten ist es wichtig zu wissen, wie Aliase funktionieren, dass alle Parameter, die Sie nach einem Alias-Befehl eingeben, am Ende wörtlich verwendet werden. Es gibt also keine Möglichkeit, einen Alias für zwei Befehle (mit oder ohne Pipe) zu verwenden, von denen der erste die Parameter interpretieren sollte. Hier ist ein Beispiel für etwas, das nicht wie erwartet funktioniert:
(Ein Beispiel, das von dieser Frage inspiriert wurde ) Dies wird immer die Ausgabe von "
ls -l
durchgeführt" im aktuellen Verzeichnis verwenden und ein Grep dazu ausführen - also "verwenden"lsswp / tmp /
wäre gleichbedeutend mit
ls -l | grep swp /tmp/
und nichtls -l /tmp/ | grep swp
.Für alle Zwecke, bei denen die Argumente irgendwo in der Mitte verwendet werden sollen, muss
function
statt a verwendet werdenalias
.quelle
Sie müssen eigentlich nichts tun; Aliase tun dies automatisch. Zum Beispiel:
Sie sehen die erste Seite von foo.txt und
less
werden bei EOF (-e) beendet, bei der Suche wird die Groß- / Kleinschreibung nicht berücksichtigt (-i) usw.quelle
Ich antworte für csh:
Ja, Sie können die Parameter in Aliasen verwenden und - anders als oben erwähnt - an einer beliebigen Stelle in der Definition des Alias auf sie verweisen - nicht nur am Ende.
Beispiel für tar-gz -ing irgendetwas:
, wo
!:1
und!:2
sind die Parameter, die Sie beim Aufruf Ihres Alias angeben.Anwendungsbeispiel:
Das bedeutet effektiv, dass Sie zwei Parameter verwendet haben, die Sie an beliebigen Stellen des Befehls tar eingefügt haben, wodurch daraus ein Alias wurde
tgz
quelle