Ответ 1
bash -c 'printf "%s %s %s\n" $0 $1 $2' param1 param2 param3
Вышеприведенные работы, но многие считают это плохой привычкой. Если вы скопировали код из строки -c
в script, это не сработает. Аналогичным образом, если вы хотите скопировать код из строки script в строку -c
, это не сработает.
В отличие от следующего вида $1
означает то же самое в строке -c
, что это означало бы в функции script или shell:
bash -c 'printf "%s %s %s\n" $1 $2 $3' _ param1 param2 param3
Консистенция стиля программирования уменьшает количество ошибок.
Оболочка рассматривает $0
иначе
Обычно для всех аргументов script используется [email protected]
или $*
. Обратите внимание, что эти переменные имеют не include $0
:
$ bash -c 'echo "$*"' param1 param2 param3
param2 param3
$ bash -c 'echo "[email protected]"' param1 param2 param3
param2 param3
$0
- это имя программы
В обычных скриптах $0
- это имя script. Следовательно, при использовании bash -c
некоторые люди предпочитают использовать какое-то значащее имя для параметра $0
, например:
bash -c 'printf "%s %s %s\n" $1 $2 $3' bash param1 param2 param3
Или:
bash -c 'printf "%s %s %s\n" $1 $2 $3' printer param1 param2 param3
Этот подход имеет явное преимущество, если строка -c
генерирует ошибку. Например, рассмотрим этот script:
$ cat script.sh
#!/bin/bash
bash -c 'grepp misspelling "$1"' BadPgm file.txt
Если мы запустим script, будет создан следующий вывод:
$ ./script.sh
BadPgm: grepp: command not found
Это идентифицирует источник ошибки как команду в строке bash -c
.