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 ls
do ls -la
, a następnie wpisując ls foo bar
byłoby naprawdę wykonać ls -la foo bar
w 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 $1
jeś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 f
jest wywoływany na samym końcu aliasu.
unset -f
Usuwa definicja funkcji jako alias jest wykonany tak, aby nie obijać się potem.
wrap_args x y z
daje mi: bash: błąd składniowy w pobliżu nieoczekiwanego tokena `('
f
aliasem. Po niezalokowaniu f
dział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 -l
wykonanych 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ć function
zamiast 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 less
wyjdziesz 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 !:1
i !:2
są 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
sh
są zdefiniowanemy_program_wrapper() { ...; }
. Bash obsługuje słowo kluczowe,function
ale dlaczego nie pójść z tym, co jest bardziej przenośne?