it-swarm.com.de

Wie übergebe ich Parameter an einen Alias?

Für Bash-Skripte kann ich "[email protected]" Verwenden, um auf Argumente zuzugreifen. Was ist das Äquivalent, wenn ich einen Alias ​​verwende?

77
prosseek

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 den Alias ​​ls to ls -la, dann tippe ls foo bar würde wirklich ausführen ls -la foo bar in der Kommandozeile.

Wenn Sie die tatsächliche Kontrolle über die Interpretation der Argumente haben möchten, können Sie eine Funktion wie folgt schreiben:

my_program_wrapper() {
    local first_arg="$1" \
          second_arg="$2"

    shift 2               # get rid of the first two arguments

    # ...

    /path/to/my_program "[email protected]"
}
54
amphetamachine

Alias-Lösung

Wenn Sie wirklich gegen die Verwendung einer Funktion an sich sind, können Sie Folgendes verwenden:

$ alias wrap_args='f(){ echo before "[email protected]" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after

Sie können [email protected] Durch $1 Ersetzen, wenn Sie nur das erste Argument möchten.

Erklärung

Dadurch wird eine temporäre Funktion f erstellt, der die Argumente übergeben werden.

Alias-Argumente werden erst am Ende übergeben. Beachten Sie, dass f ganz am Ende des Alias ​​aufgerufen wird.

Der unset -f Entfernt die Funktionsdefinition, wenn der Alias ​​ausgeführt wird, damit er danach nicht herumhängt.

34
Tom Hale

Neben den vorliegenden Antworten ist es wichtig zu wissen, wie Aliase funktionieren, dass alle Parameter, die Sie nach einem Alias-Befehl eingeben, am Ende buchstäblich verwendet werden. Es gibt also keine Möglichkeit, einen Alias ​​für zwei Befehle (Piped oder nicht) zu verwenden, von denen der erste die Parameter interpretieren sollte. Um es klar zu machen, hier ein Beispiel für etwas, das nicht wie erwartet funktionieren würde:

alias lsswp="ls -l | grep swp"

(ein Beispiel inspiriert von diese Frage ) Dabei wird immer die Ausgabe von ls -l verwendet, die im Verzeichnis current ausgeführt wird, und es wird ein Grep durchgeführt mit

lsswp/tmp /

wäre äquivalent zu 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 ein function anstelle von alias verwendet werden.

19
rozcietrzewiacz

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 wird bei EOF (-e) beendet, bei Suchvorgängen wird die Groß- und Kleinschreibung nicht berücksichtigt (-i) usw.

15
Warren Young

Ich antworte für csh:

Ja, Sie können die Parameter in Aliasen verwenden und - anders als oben erwähnt - überall in der Definition des Alias ​​darauf verweisen - nicht nur am Ende.

Beispiel für etwas tar-gz -ing:

$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"

, wo !:1 und !:2 sind die Parameter, die Sie beim Aufrufen 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

Dies bedeutet effektiv, dass Sie zwei Parameter verwendet haben, die Sie an beliebigen Stellen des Befehls tar eingefügt haben, und daraus einen Alias ​​tgz gemacht haben

1
stevica