Как выполнить произвольную команду в разделе `bash -c`

Что такое процедура для украшения произвольной команды bash для ее выполнения в подоболочке? Я не могу изменить команду, мне нужно ее украсить снаружи.

лучшее, что я могу придумать, это

>bash -c '<command>'

работает над этим:

>bash -c 'echo'
>bash -c 'echo foobar'
>bash -c 'echo \"'

но как насчет команд, таких как

echo \'

и особенно

echo \'\"

Украшение всегда должно быть одинаковым для всех команд. Он всегда должен работать.

Ответ 1

Вы говорите "подоболоть" - вы можете получить один из них, просто поместив круглые скобки вокруг команды:

x=outer
(x=inner; echo "x=$x"; exit)
echo "x=$x"

производит следующее:

x=inner
x=outer

Ответ 2

Это один из способов без использования опции -c:

bash <<EOF
echo \'\"
EOF

Ответ 3

То, что вы хотите сделать, точно такое же, как escapeshellcmd() в PHP (http://php.net/manual/fr/function.escapeshellcmd.php)

Вам просто нужно избежать # &; `| *? ~ < > ^() [] {} $\,\x0A и \xFF. 'и "экранируются только в том случае, если они не спарены.

Но будьте осторожны с проблемами безопасности...

Ответ 4

Вы можете (ab) использовать heredocs:

bash -c "$(cat <<-EOF
    echo \'\"
EOF
)"

Ответ 5

Пусть 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 \'\"