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

如何在`bash-c下执行任意命令`,bash,Bash,修饰任意bash命令以在子shell中执行它的过程是什么?我不能改变命令,我必须在外面装饰它 我能想到的最好的办法就是 >bash -c '<command>' 但是像这样的命令呢 echo \' 尤其是 echo \'\" 所有命令的装饰必须始终相同。它必须一直有效 要执行的操作与PHP()中的escapeshellcmd()完全相同 你只需要逃离#&;` |*~^()[]{}$\,\x0A和\xFF和“仅当它们未配对时才转义 但是要注意安全问题…您可以(ab)使用he

修饰任意bash命令以在子shell中执行它的过程是什么?我不能改变命令,我必须在外面装饰它

我能想到的最好的办法就是

>bash -c '<command>'
但是像这样的命令呢

echo \'
尤其是

echo \'\"

所有命令的装饰必须始终相同。它必须一直有效

要执行的操作与PHP()中的
escapeshellcmd()
完全相同

你只需要逃离#&;` |*~^()[]{}$\,\x0A和\xFF和“仅当它们未配对时才转义

但是要注意安全问题…

您可以(ab)使用heredocs:

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

bash-c“$(cat这是一种不使用-c选项的方法:

bash <<EOF
echo \'\"
EOF

bash让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 \'\"
您说“subshell”-只需在命令周围加上括号即可获得其中一个命令:

x=outer
(x=inner; echo "x=$x"; exit)
echo "x=$x"
产生以下结果:

x=inner
x=outer

这是如何提供的?包含在文件、shell变量中。例如,如果您正在构建一个函数“用bash-c执行任意命令”,参数是什么?将所有单引号替换为
'\''
可以使生成的字符串安全地在单引号内使用,但我不确定这是否回答了问题。@EtanReisner可能。。。您确定这样的替换永远不会改变任何shell命令的结果吗?子shell还是单独的进程?只要在它周围加上括号,它就会成为一个子shell:
x=1;(x=2;echo$x);echo$x
输出2,然后1
bash-c
创建一个新的shell进程;但是,它不是一个子shell,它是一个由fork()创建的shell实例,没有exec()。嗯,这是一个复杂的命令,在以这种方式处理之后失败了,成功了。这正是我想要的。当我对另一个答案做
bash时,就像对另一个答案做bash一样——一个以前失败过的命令,突然通过,没有抱怨,不好
x=inner
x=outer