Aby zapewnić uzupełnienia i wyjaśnienia niektórych innych odpowiedzi, jeśli używasz opcji zbiorczej dla exec
lub execdir
( -exec command {} +
) i chcesz odzyskać wszystkie argumenty pozycyjne, musisz rozważyć obsługę $0
z bash -c
. Mówiąc bardziej konkretnie, rozważ poniższe polecenie, które używa bash -c
jak zasugerowano powyżej, i po prostu wyświetla ścieżki plików kończące się na „.wav” z każdego znalezionego katalogu:
find "$1" -name '*.wav' -execdir bash -c 'echo $@' _ {} +
Podręcznik bash mówi:
If the -c option is present, then commands are read from the first non-option argument command_string. If there are arguments after the command_string, they are assigned to the
positional parameters, starting with $0.
Oto 'check $@'
ciąg polecenia i _ {}
argumenty występujące po nim. Zauważ, że $@
jest to specjalny parametr pozycyjny w bash, który rozszerza się na wszystkie parametry pozycyjne, zaczynając od 1 . Zauważ również, że przy tej -c
opcji pierwszy argument jest przypisywany do parametru pozycyjnego $0
. Oznacza to, że jeśli spróbujesz uzyskać dostęp do wszystkich parametrów pozycyjnych za pomocą $@
, otrzymasz parametry tylko od początku $1
do góry. Dlatego odpowiedź Dominika zawiera _
argument, który jest fikcyjnym argumentem służącym do wypełnienia parametru $0
, więc wszystkie argumenty, które chcemy, będą dostępne później, jeśli użyjemy $@
na przykład rozszerzenia parametrów lub pętli for jak w tej odpowiedzi.
Oczywiście, podobnie jak w przypadku zaakceptowanej odpowiedzi, bash -c 'shell_function $0 $@'
działałby również jawnie $0
, ale trzeba pamiętać, że $@
nie będzie działać zgodnie z oczekiwaniami.
$0
.