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
Built-In, um einen String in eine Variable einzulesen d
. Da wir eine vollständige Zeichenfolge einschließlich Leerzeichen (Zeilenumbrüche, Tabulatoren, Leerzeichen) lesen möchten, verwenden IFS=
und deaktivieren wir umgekehrte Schrägstriche mit -r
.
<<<
Der Here-String-Operator ermöglicht es uns, jeden String, den wir als Argument für den mkcd
Alias angeben, umzuleiten . die nutzung wäre wiemkcd "some directory"
- Mehrere Befehle innerhalb eines Alias werden kombiniert und in der aktuellen Shell unter Verwendung der
{ list; }
Struktur (die group command
im bash
Handbuch als bekannt bezeichnet wird) ausgeführt. Beachten Sie, dass ein vorangestelltes Leerzeichen nach {
und eine ;
individuelle Liste von Befehlen erforderlich sind.
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 Wortteilung 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 eine Wortteilung leisten können, sodass wir teilweise Aliase mit Argumenten versehen können.