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 lszu ls -la, dann eingeben ls foo barwürde wirklich ausführen ls -la foo barauf 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 , $1wenn 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 fganz am Ende des Alias aufgerufen wird.
Das unset -fentfernt die Funktionsdefinition, wenn der Alias ausgeführt wird, damit er danach nicht herumhängt.
wrap_args x y zgibt mir: Bash: Syntaxfehler in der Nähe von unerwartetem Token "("
fmich geirrt. Sobald ich unausgeglichen bin, funktioniert fes 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 -ldurchgefü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 functionstatt 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 lesswerden 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 !:1und !:2sind 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
shsind definiertmy_program_wrapper() { ...; }. Bash kümmert sich um das Schlüsselwort,functionaber warum nicht mit dem, was portabler ist?