Вы неправильно интерпретируете справочную страницу. Во-первых, часть о том, как --
сигнализировать об окончании опций, не имеет отношения к тому, что вы пытаетесь сделать. С этого -c
момента переопределяет остальную часть командной строки, так что она больше не проходит обработку опций bash, то есть, --
она будет передана команде, а не bash как маркер конца опций.
Вторая ошибка заключается в том, что дополнительные аргументы присваиваются в качестве позиционных параметров запущенному процессу оболочки, а не передаются в качестве аргументов команды. Итак, то, что вы пытаетесь сделать, можно сделать одним из следующих способов:
/bin/bash -c 'echo "$0" "$1"' foo bar
/bin/bash -c 'echo "$@"' bash foo bar
В первом случае передаются эхо-параметры $0
и $1
явно, а во втором случае используется "$@"
расширение как обычно, как «все позиционные параметры, кроме $ 0». Обратите внимание, что в этом случае мы также должны передать что-то для использования $0
; Я выбрал «bash», так как это то, $0
что обычно будет, но все остальное будет работать.
Что касается причины , это делается таким образом, вместо того , чтобы просто передавая любые аргументы , которые вы даете непосредственно к команде вы перечисляете: обратите внимание , что документация говорит «команда s считывается из строки», во множественном числе. Другими словами, эта схема позволяет вам:
/bin/bash -c 'mkdir "$1"; cd "$1"; touch "$2"' bash dir file
Но, обратите внимание , что лучший способ , чтобы удовлетворить ваши первоначальной цели может быть использовать env
вместо bash
:
/usr/bin/env -- "ls" "-l"
Если вам не нужны какие-либо функции, предоставляемые оболочкой, нет причин использовать ее - использование env
в этом случае будет быстрее, проще и меньше набирает текст. И вам не нужно думать так усердно, чтобы убедиться, что он будет безопасно обрабатывать имена файлов, содержащие метасимволы оболочки или пробелы.