Czy mogę przekazać argumenty do polecenia aliasu?

19

Chcę wiedzieć, czy mogę przekazać argument za pomocą polecenia aliasu.

na przykład:

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

Teraz dwydrukuje ostatnie 5 wierszy. Jeśli chcę użyć d, aby wydrukować inną liczbę wierszy, muszę ponownie zmienić deklarację polecenia aliasu d.

Czy jest jakiś sposób, aby zmodyfikować deklarację aliasu, aby nie musiałem ponownie wpisywać deklaracji w celu zmiany liczby wierszy. Jak włączenie przekazywania liczby wierszy jako argumentu podczas deklarowania aliasu d? Czy jest jakaś inna metoda rozwiązania tego?

srk_cb
źródło
W (t) csh „\! *” Odwołuje argumenty do aliasu (ukośnik odwrotny służy tylko ucieczce od wykrzyknika, co normalnie oznacza „historię”), i możesz nawet odwoływać się do poszczególnych argumentów, chociaż nie pamiętam, jak to zrobić. Więc może „tail -n \! *” Lub coś takiego (nie sądzę, że \! * Będzie działał ze znakiem minus bezpośrednio przed nim). Jednak nie jestem pewien, czy to zadziała w (ba) sh.
barka nocna

Odpowiedzi:

20

Aliasy nie przyjmują argumentów. Z aliasem podoba alias foo='bar $1'The $1zostanie rozszerzony przez powłokę do pierwszego argumentu powłoki (co jest prawdopodobne, nic), gdy prowadzony jest alias.

Więc: Zamiast tego użyj funkcji .

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

num=${1:-5} używa pierwszego argumentu, z domyślną wartością 5, jeśli nie jest podany.

Następnie możesz zrobić:

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

Lub jeśli zmienisz nieco użyte opcje:

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

Następnie możesz przekazać dodatkowe -nopcje:

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

Jeśli -npodano wiele opcji tail, używana jest tylko ostatnia.

muru
źródło
Dla funkcjonalnie kwestionowane jak ja :) Może to być pomocne do stanu krótko gdzie umieścić funkcję ... to znaczy ~/.bashrcalbo rc.localczy gdziekolwiek?
WinEunuuchs2Unix
@ WinEunuuchs2Unix gdziekolwiek alias zostałby umieszczony.
muru
5

Musisz mieć w tym celu funkcję opisaną w pisemnym zgłoszeniu zastrzeżeń i tutaj . Spróbuj wykonać następujące czynności:

foo() { /path/to/command "$@" ;}

i dzwoń do foo:

foo arg1 arg2 arg3
Ron
źródło
4

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 readwbudowanego, 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 mkcdaliasu; 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 commandw bashinstrukcji). 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.

Sergiy Kolodyazhnyy
źródło