任意 bash 命令以在子 shell 中执行它的过程是什么? 我不能改变命令,我必须在外面装饰它。
我能想到的最好的是
>bash -c '<command>'
适用于这些:
>bash -c 'echo'
>bash -c 'echo foobar'
>bash -c 'echo "'
但是命令呢,例如
echo '
尤其是
echo '"
所有命令的装饰必须始终相同。它必须始终有效。
你说"subshell" - 你可以通过在命令周围加上括号来获得其中之一:
x=outer
(x=inner; echo "x=$x"; exit)
echo "x=$x"
产生这个:
x=inner
x=outer
你可以(滥用)使用heredocs:
bash -c "$(cat <<-EOF
echo '"
EOF
)"
这是不使用 -c 选项的一种方式:
bash <<EOF
echo '"
EOF
你想做的和 PHP 中的escapeshellcmd()
完全相同(http://php.net/manual/fr/function.escapeshellcmd.php)
你只需要转义 #&;'|*?~<>^()[]{}$\, \x0A 和 \xFF。' 和 " 仅在未配对时才进行转义。
但要注意安全问题...
让 bash 这样处理它:
1) 将命令准备为数组:
astrCmd=(echo '");
2) 将数组导出为简单字符串:
export EXPORTEDastrCmd="`declare -p astrCmd| sed -r "s,[^=]*='(.*)',1,"`";
3) 恢复阵列并将其作为完整命令运行:
bash -c "declare -a astrCmd='$EXPORTEDastrCmd';${astrCmd[@]}"
创建一个函数以使这些步骤更加简单,如下所示:
FUNCbash(){
astrCmd=("$@");
export EXPORTEDastrCmd="`declare -p astrCmd| sed -r "s,[^=]*='(.*)',1,"`";
bash -c "declare -a astrCmd='$EXPORTEDastrCmd';${astrCmd[@]}";
}
FUNCbash echo '"