В отличие от POSIX sh, bash
предоставляет явный способ попросить оболочку избежать данных, чтобы они были безопасными по значению, с printf %q
.
Таким образом, с Баш:
$ command_str=date
$ nest() { printf 'sh -c %q\n' "$1"; }
$ nest "$command_str"
sh -c date
$ nest "$(nest "$command_str")"
sh -c sh\ -c\ date
$ nest "$(nest "$(nest "$command_str")")"
sh -c sh\ -c\ sh\\\ -c\\\ date
... и так далее, до бесконечности.
В POSIX ш, третья сторона библиотека Push может быть использована для того же цели:
$ source push.sh
$ command_str=date
$ Push -c command_str sh -c "$command_str"; echo "$command_str"
sh -c date
$ Push -c command_str sh -c "$command_str"; echo "$command_str"
sh -c 'sh -c date'
$ Push -c command_str sh -c "$command_str"; echo "$command_str"
sh -c 'sh -c '\''sh -c date'\'
$ Push -c command_str sh -c "$command_str"; echo "$command_str"
sh -c 'sh -c '\''sh -c '\''\'\'\''sh -c date'\''\'\'
... и т.д..
Если вы хотите автоматизировать вложенности для произвольного числа уровней:
nest() {
local cmd_str level >/dev/null 2>&1 ||: "in POSIX sh, local may not exist"
level=$1; shift
## in bash
printf -v cmd_str '%q ' sh -c "[email protected]"; cmd_str=${cmd_str%" "}
## in POSIX sh, using https://github.com/vaeth/push
#Push -c cmd_str sh -c "[email protected]"
if [ "$level" -gt 1 ]; then
nest "$((level - 1))" "$cmd_str"
else
printf '%s\n' "$cmd_str"
fi
}
Тогда:
nest 5 date
... даст вам (с printf %q
, против толчка) ...
sh -c sh\ -c\ sh\\\ -c\\\ date
'/ bin/sh' - это POSIX sh, а не Bou на современных системах. Борн - гораздо более древняя оболочка (70-е, против начала 90-х годов). –
Кстати, если вы работаете с bash, а не с POSIX sh, универсальный способ избежать произвольного содержимого, который должен быть передан другой оболочке, - это 'printf% q'. (Таким образом: поскольку ваш вопрос явно спрашивает о '/ bin/sh', его не следует помечать' bash', ответ для bash будет другим). –
«bash/sh» так же плохо, как «C/C++». Это два отдельных языка. Они должны получить два отдельных вопроса, если вам действительно нужно знать оба. –