Wie übergebe ich Parameter an einen Alias?

64

Für Bash-Skripte kann ich "$@"auf Argumente zugreifen. Was ist das Äquivalent, wenn ich einen Alias ​​verwende?

Prosseek
quelle

Antworten:

50

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 "$@"
}
Amphetamachine
quelle
3
opengroup.org/onlinepubs/009695399/utilities/… Funktionen in shsind definiert my_program_wrapper() { ...; }. Bash kümmert sich um das Schlüsselwort, functionaber warum nicht mit dem, was portabler ist?
Ephemient
2
@ephemient Sehr wahr. Ich meine außerdem, dass jeder GNU Bash benutzt und nicht die POSIX-Shell von Barebones.
Amphetamachine
21

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.

Tom Hale
quelle
Humm? wrap_args x y zgibt mir: Bash: Syntaxfehler in der Nähe von unerwartetem Token "("
Elliptical View
@Elipticalview Hmm, Kopieren Einfügen Problem? Bestätigte Arbeiten an der Bash 4.4.12.
Tom Hale
1
Ich hatte fmich geirrt. Sobald ich unausgeglichen bin, funktioniert fes gut. Die alte Namenskollisionssache.
Elliptical View
command type f:)
Tom Hale
1
groß! das ist die faulste Variante!
Sergius
19

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.

rozcietrzewiacz
quelle
15

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.

Warren Young
quelle
Kannst du bitte meine Frage anschauen - keine der Lösungen funktioniert für mich und ich darf kein Kopfgeld erheben.
JJD
1
@JJD Derjenige, der Ihre Frage beantwortet hat, ist richtig: Sie möchten in diesem Fall eine Funktion, keinen Alias. Da die akzeptierte Antwort auf diese Frage im Wesentlichen dieselbe ist, wurde Ihre Frage zu Recht geschlossen.
Warren Young
1

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

Stevica
quelle