Antworten:
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 "$@"
}
Alias-Lösung
Wenn Sie wirklich gegen die Verwendung einer Funktion per se sind, können Sie Folgendes verwenden:
$ alias wrap_args='f(){ echo before "$@" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
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.
wrap_args x y z
gibt mir: Bash: Syntaxfehler in der Nähe von unerwartetem Token "("
f
mich geirrt. Sobald ich unausgeglichen bin, funktioniert f
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:
alias lsswp="ls -l | grep swp"
(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 nicht ls -l /tmp/ | grep swp
.
Für alle Zwecke, bei denen die Argumente irgendwo in der Mitte verwendet werden sollen, muss function
statt a verwendet werden alias
.
Sie müssen eigentlich nichts tun; Aliase tun dies automatisch. Zum Beispiel:
$ alias less="less -eirqM"
$ less foo.txt
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.
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:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
, wo !:1
und !:2
sind die Parameter, die Sie beim Aufruf Ihres Alias angeben.
Anwendungsbeispiel:
$ ls
clrcf.dat user_comment_2016.06.03_12:51:50.txt user_comment_2016.06.03_12:54:48.txt
TEST-wADM.tec user_comment_2016.06.03_12:52:04.txt user_comment_2016.06.03_12:55:13.txt
$ tgz user* out
a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K
$ ls out*
out.tar.gz
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
sh
sind definiertmy_program_wrapper() { ...; }
. Bash kümmert sich um das Schlüsselwort,function
aber warum nicht mit dem, was portabler ist?