Jak przekazać parametry do aliasu?

64

W przypadku skryptu bash mogę uzyskać "$@"dostęp do argumentów. Jaki jest odpowiednik, gdy używam aliasu?

prosseek
źródło

Odpowiedzi:

50

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 "$@"
}
amfetamachina
źródło
3
opengroup.org/onlinepubs/009695399/utilities/… Funkcje w shsą zdefiniowane my_program_wrapper() { ...; }. Bash obsługuje słowo kluczowe, functionale dlaczego nie pójść z tym, co jest bardziej przenośne?
ephemient
2
@ephemient Very true. Mam na myśli poza tym, że wszyscy używają GNU Bash, a nie boso powłoki POSIX.
amfetamachina
21

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.

Tom Hale
źródło
Humm? wrap_args x y zdaje mi: bash: błąd składniowy w pobliżu nieoczekiwanego tokena `('
Eliptyczny widok
@Elipticalview Hmm, problem z wklejaniem? Potwierdzono pracę nad bash 4.4.12.
Tom Hale,
1
Miałem faliasem. Po niezalokowaniu fdziała dobrze. Stara nazwa kolizji.
Widok eliptyczny
command type f:)
Tom Hale
1
świetny! to najbardziej leniwy wariant!
Sergius
19

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.

rozcietrzewiacz
źródło
15

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.

Warren Young
źródło
Czy możesz spojrzeć na moje pytanie - żadne z rozwiązań nie działa dla mnie i nie wolno mi rozpocząć nagrody.
JJD
1
@JJD Ten, który odpowiedział na twoje pytanie, ma rację: w tym przypadku potrzebujesz funkcji, a nie aliasu. Ponieważ zaakceptowana odpowiedź na to pytanie jest zasadniczo taka sama, twoje pytanie zostało słusznie zamknięte.
Warren Young,
1

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

stewica
źródło