W przypadku skryptu bash mogę uzyskać "$@"
dostęp do argumentów. Jaki jest odpowiednik, gdy używam aliasu?
64
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 "$@"
}
sh
są zdefiniowanemy_program_wrapper() { ...; }
. Bash obsługuje słowo kluczowe,function
ale dlaczego nie pójść z tym, co jest bardziej przenośne?Rozwiązanie Alias
Jeśli naprawdę nie chcesz używać funkcji jako takiej, możesz użyć:
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.źródło
wrap_args x y z
daje mi: bash: błąd składniowy w pobliżu nieoczekiwanego tokena `('f
aliasem. Po niezalokowaniuf
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:
(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ąclsswp / tmp /
byłoby równoważne
ls -l | grep swp /tmp/
i niels -l /tmp/ | grep swp
.Do wszystkich celów, w których argumenty powinny być użyte gdzieś pośrodku, należy użyć
function
zamiastalias
.źródło
Właściwie nie musisz nic robić; aliasy robią to automatycznie. Na przykład:
Zobaczysz pierwszą stronę foo.txt i
less
wyjdziesz z EOF (-e), w wyszukiwaniu nie będzie rozróżniana wielkość liter (-i) itp.źródło
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ś:
, gdzie
!:1
i!:2
są parametrami, które podasz, dzwoniąc do swojego aliasu.Przykład zastosowania:
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
źródło