Odpowiedzi:
Aliasy są jak polecenia, ponieważ wszystkie argumenty są przekazywane jako argumenty do programu, który są aliasami. Na przykład, jeśli były do aliasu lsdo ls -la, a następnie wpisując ls foo barbyłoby naprawdę wykonać ls -la foo barw wierszu poleceń.
Jeśli chcesz mieć rzeczywistą kontrolę nad interpretacją argumentów, możesz napisać taką funkcję:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "$@"
}
Rozwiązanie Alias
Jeśli naprawdę nie chcesz używać funkcji jako takiej, możesz użyć:
$ alias wrap_args='f(){ echo before "$@" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
Można wymienić $@ze $1jeśli chcesz tylko pierwszy argument.
Wyjaśnienie
Tworzy to funkcję tymczasową f, do której przekazywane są argumenty.
Argumenty aliasu są przekazywane tylko na końcu. Zauważ, że fjest wywoływany na samym końcu aliasu.
unset -fUsuwa definicja funkcji jako alias jest wykonany tak, aby nie obijać się potem.
wrap_args x y zdaje mi: bash: błąd składniowy w pobliżu nieoczekiwanego tokena `('
faliasem. Po niezalokowaniu fdziała dobrze. Stara nazwa kolizji.
command type f:)
Dodając do obecnych odpowiedzi, ważną rzeczą do zrozumienia o tym, jak działają aliasy, jest to, że wszystkie parametry wpisane po aliasowanym poleceniu zostaną użyte dosłownie na końcu. Nie ma więc możliwości użycia aliasu dla dwóch poleceń (potokowych lub nie), z których pierwsza powinna interpretować parametry. Aby to wyjaśnić, oto przykład czegoś, co nie działałoby zgodnie z oczekiwaniami:
alias lsswp="ls -l | grep swp"
(przykład zainspirowany tym pytaniem ) to zawsze użyje danych wyjściowych ls -lwykonanych w bieżącym katalogu i wykona grep na tym - więc używając
lsswp / tmp /
byłoby równoważne ls -l | grep swp /tmp/ i nie ls -l /tmp/ | grep swp .
Do wszystkich celów, w których argumenty powinny być użyte gdzieś pośrodku, należy użyć functionzamiast alias.
Właściwie nie musisz nic robić; aliasy robią to automatycznie. Na przykład:
$ alias less="less -eirqM"
$ less foo.txt
Zobaczysz pierwszą stronę foo.txt i lesswyjdziesz z EOF (-e), w wyszukiwaniu nie będzie rozróżniana wielkość liter (-i) itp.
Odpowiadam na csh:
Tak, możesz używać parametrów w aliasach i - w odróżnieniu od tego, co powiedziano powyżej - możesz odwoływać się do nich w dowolnym miejscu definicji aliasu - nie tylko na końcu.
Przykład tar-gz -ing coś:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
, gdzie !:1i !:2są parametrami, które podasz, dzwoniąc do swojego aliasu.
Przykład zastosowania:
$ 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
Co faktycznie oznacza, że użyłeś dwóch parametrów, które wstawiłeś w dowolnych miejscach komendy tar, co czyni z nich alias tgz
shsą zdefiniowanemy_program_wrapper() { ...; }. Bash obsługuje słowo kluczowe,functionale dlaczego nie pójść z tym, co jest bardziej przenośne?