Чтобы предоставить дополнения и пояснения к некоторым другим ответам, если вы используете опцию массового ввода для execили execdir( -exec command {} +) и хотите получить все позиционные аргументы, вам необходимо рассмотреть обработку $0с bash -c. Более конкретно, рассмотрим приведенную ниже команду, которая использует, bash -cкак предложено выше, и просто выводит пути к файлам, заканчивающиеся на «.wav», из каждого найденного каталога:
find "$1" -name '*.wav' -execdir bash -c 'echo $@' _ {} +
Руководство по bash гласит:
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.
Здесь 'check $@'- командная строка, и _ {}аргументы после командной строки. Обратите внимание, что $@это специальный позиционный параметр в bash, который распространяется на все позиционные параметры, начиная с 1 . Также обратите внимание, что с помощью -cопции первый аргумент назначается позиционному параметру $0. Это означает, что если вы попытаетесь получить доступ ко всем позиционным параметрам с помощью $@, вы получите только параметры, начиная с $1и выше. Именно поэтому в ответе Доминика есть _фиктивный аргумент для заполнения параметра $0, поэтому все нужные нам аргументы будут доступны позже, если мы используем $@расширение параметра, например, или цикл for, как в этом ответе.
Конечно, аналогично принятому ответу, bash -c 'shell_function $0 $@'также будет работать явное прохождение $0, но опять же, вы должны иметь в виду, что $@это не сработает, как ожидалось.
$0.