Obejście ograniczeń aliasów za pomocą polecenia grupy i ciągu-tutaj
Aliasy nie mogą przyjmować argumentów, ale możemy to „symulować”. Weźmy na przykład przykład mojej odpowiedzi na to pytanie .
alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'
Kluczowe kwestie, które się tutaj dzieją:
- używamy
read
wbudowanego, aby odczytać ciąg do zmiennej d
. Ponieważ chcemy odczytać pełny ciąg znaków zawierający puste znaki (znaki nowej linii, tabulatory, spacje), używamy IFS=
i wyłączamy znaki ucieczki odwrotnego ukośnika -r
.
<<<
który jest tutaj ciągiem znaków pozwala nam przekierować dowolny ciąg znaków, który podamy jako argument do mkcd
aliasu; użycie byłoby jakmkcd "some directory"
- wiele poleceń w ramach aliasu jest łączonych i wykonywanych w bieżącej powłoce przy użyciu
{ list; }
struktury (co jest znane jak group command
w bash
instrukcji). Zauważ, że wymagane są spacje po {
i ;
indywidualna lista poleceń.
W twoim konkretnym przykładzie możemy zrobić:
alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'
Możemy również wykorzystać dzielenie słów do przechowywania argumentów oddzielonych spacją:
bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "arg1 arg2"
arg1
arg2
Lub możemy użyć tablic, aby podać wiele argumentów:
bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";} <<< "arg1 arg2"
arg2
arg1
Ale czy to dobre podejście?
Niekoniecznie. Problem z takim podejściem polega na tym, że jest on bardzo specyficzny - argumentów nie można łatwo cytować, co oznacza, że możemy mieć tylko argumenty bez spacji.
bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "'arg1 with space' arg2"
'arg1
with space' arg2
Oczywiście nie jest to coś, co byłoby szeroko stosowane, po prostu dlatego, że w prawdziwym świecie mamy do czynienia ze złożonymi argumentami, więc takie podejście nie jest całkiem praktyczne. Funkcje są znacznie bardziej elastyczne. A potrzeba cytowania ciągów argumentów szybko się denerwuje.
Pomimo ograniczeń, działa to z prostymi ciągami jako argumentami, w których stać nas na dzielenie słów, a zatem częściowo pozwala nam przekazywać argumenty do aliasów.