Ответ 1
Вы говорите "подоболоть" - вы можете получить один из них, просто поместив круглые скобки вокруг команды:
x=outer
(x=inner; echo "x=$x"; exit)
echo "x=$x"
производит следующее:
x=inner
x=outer
Что такое процедура для украшения произвольной команды bash для ее выполнения в подоболочке? Я не могу изменить команду, мне нужно ее украсить снаружи.
лучшее, что я могу придумать, это
>bash -c '<command>'
работает над этим:
>bash -c 'echo'
>bash -c 'echo foobar'
>bash -c 'echo \"'
но как насчет команд, таких как
echo \'
и особенно
echo \'\"
Украшение всегда должно быть одинаковым для всех команд. Он всегда должен работать.
Вы говорите "подоболоть" - вы можете получить один из них, просто поместив круглые скобки вокруг команды:
x=outer
(x=inner; echo "x=$x"; exit)
echo "x=$x"
производит следующее:
x=inner
x=outer
Это один из способов без использования опции -c:
bash <<EOF
echo \'\"
EOF
То, что вы хотите сделать, точно такое же, как escapeshellcmd()
в PHP (http://php.net/manual/fr/function.escapeshellcmd.php)
Вам просто нужно избежать # &; `| *? ~ < > ^() [] {} $\,\x0A и \xFF. 'и "экранируются только в том случае, если они не спарены.
Но будьте осторожны с проблемами безопасности...
Вы можете (ab) использовать heredocs:
bash -c "$(cat <<-EOF
echo \'\"
EOF
)"
Пусть bash позаботится об этом следующим образом:
1) подготовьте команду как массив:
astrCmd=(echo \'\");
2) экспортируйте массив как простую строку:
export EXPORTEDastrCmd="`declare -p astrCmd| sed -r "s,[^=]*='(.*)',\1,"`";
3) восстановить массив и запустить его как полную команду:
bash -c "declare -a astrCmd='$EXPORTEDastrCmd';\${astrCmd[@]}"
Создайте функцию, чтобы сделать эти шаги более легкими, например:
FUNCbash(){
astrCmd=("[email protected]");
export EXPORTEDastrCmd="`declare -p astrCmd| sed -r "s,[^=]*='(.*)',\1,"`";
bash -c "declare -a astrCmd='$EXPORTEDastrCmd';\${astrCmd[@]}";
}
FUNCbash echo \'\"