it-swarm.com.de

Kann ich einem Alias-Befehl Argumente übergeben?

Ich möchte wissen, ob ich ein Argument mit einem Alias-Befehl übergeben kann.

zum Beispiel:

alias d="dmesg|grep -iw usb|tail -5" 

Jetzt druckt d die letzten 5 Zeilen. Wenn ich d verwenden möchte, um eine andere Anzahl von Zeilen zu drucken, muss ich die Alias-Befehlsdeklaration von d erneut ändern.

Kann ich die Deklaration eines Alias ​​so ändern, dass ich die Deklaration nicht erneut eingeben muss, um die Anzahl der Zeilen zu ändern? Als ob Sie die Anzahl der Zeilen als Argument übergeben, während Sie den Alias ​​für d deklarieren? Oder gibt es eine andere Methode, um dies zu lösen?

17
srk_cb

Aliase nehmen keine Argumente an. Mit einem Alias ​​wie alias foo='bar $1' wird der $1 von der Shell zum ersten Argument der Shell (was wahrscheinlich nichts ist) erweitert, wenn der Alias ​​ausgeführt wird.

Also: Benutze Funktionen stattdessen.

d () {
  num=${1:-5}
  dmesg |grep -iw usb|tail -$num
}

num=${1:-5} verwendet das erste Argument mit einem Standardwert von 5, wenn es nicht angegeben wird.

Dann können Sie tun:

$ d
# prints 5 lines
$ d 10
# prints 10 lines

Oder, wenn Sie die von Ihnen verwendeten Optionen geringfügig ändern:

alias d="dmesg|grep -iw usb|tail -n 5"

Dann können Sie zusätzliche -n -Optionen übergeben:

$ d
# prints 5 lines
$ d -n 10
# prints 10 lines

Wenn für tail mehrere -n -Optionen angegeben sind, wird nur die letzte verwendet.

20
muru

Sie benötigen dafür eine Funktion wie in SO und hier beschrieben. Versuche Folgendes:

foo() { /path/to/command "[email protected]" ;}

und rufen Sie die foo mit:

foo arg1 arg2 arg3
5
Ron

Umgehen von Alias-Einschränkungen mit dem Befehl group und here-string

Aliase können keine Argumente akzeptieren, aber wir können das "simulieren". Nehmen Sie zum Beispiel meine Antwort auf diese Frage .

alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'

Wichtige Punkte, die hier passieren:

  • wir verwenden read, um einen String in eine Variable d zu lesen. Da wir eine vollständige Zeichenfolge einschließlich Leerzeichen (Zeilenumbrüche, Tabulatoren, Leerzeichen) lesen möchten, verwenden wir IFS= und deaktivieren umgekehrte Schrägstriche mit -r.
  • <<< mit here-string operator können wir jeden String umleiten, den wir als Argument für den Alias ​​mkcd angeben. Die Verwendung wäre als mkcd "some directory"
  • mehrere Befehle innerhalb eines Alias ​​werden in der aktuellen Shell mithilfe der { list; } -Struktur (die im bash -Handbuch als group command bezeichnet wird) kombiniert und ausgeführt. Beachten Sie, dass nach { und ; ein vorangestelltes Leerzeichen erforderlich ist.

In Ihrem speziellen Beispiel könnten wir Folgendes tun:

alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'

Wir könnten auch die Word-Aufteilung verwenden, um durch Leerzeichen getrennte Argumente zu speichern:

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "arg1 arg2"
arg1
arg2

Oder wir könnten Arrays verwenden, um mehrere Argumente bereitzustellen:

bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";}  <<< "arg1 arg2"
arg2
arg1

Aber ist das ein guter Ansatz?

Nicht unbedingt. Das Problem bei einem solchen Ansatz ist, dass er sehr spezifisch ist - Argumente können nicht einfach zitiert werden, was bedeutet, dass wir nur Argumente ohne Leerzeichen haben können.

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "'arg1 with space' arg2"
'arg1
with space' arg2

Dies ist natürlich nicht weit verbreitet, nur weil wir uns in der realen Welt mit komplexen Argumenten auseinandersetzen müssen, weshalb dieser Ansatz nicht ganz praktisch ist. Funktionen sind weitaus flexibler. Und die Notwendigkeit, args string zu zitieren, wird schnell ärgerlich.

Ungeachtet der Einschränkungen funktioniert dies mit einfachen Zeichenfolgen als Argumente, bei denen wir uns die Aufteilung in Word leisten können, wodurch es uns teilweise möglich ist, Aliasnamen Argumente zuzuweisen.

3