如何在“bash -c”下执行任意命令

  • 本文关键字:执行 任意 命令 bash bash
  • 更新时间 :
  • 英文 :

装饰

任意 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 '"

相关内容

  • 没有找到相关文章

最新更新