我正在跑步...
xargs -0 somescript -C << EOF
drush ev 'somethingelse("$STRING",[]);'
EOF
somescript
是我需要运行但我无法控制的脚本。它期望在 -C
之后有一个命令作为参数,就像 su -c
一样。
如果
$STRING
不包含撇号,则此方法有效,但如果包含撇号,则如预期的那样,它会崩溃。我试过了
xargs -0 somescript -C << "EOF1"
xargs -0 drush ev << 'EOF2'
somethingelse("$STRING",[]);
EOF2
EOF1
但这给了我
sh: syntax error: unexpected "("
。我不太明白为什么。
Ps.:请不要建议运行其他东西:这里的问题是运行这个脚本。这不是 X-Y 问题,我有一个螺丝需要拧进去。我不能使用铆钉。我想问哪里可以找到合适的螺丝刀。谢谢!
使用
sh
而不是 bash
让事情变得有点复杂——bash 可以将任意字符串转义为 bash 本身 可以计算的内容,但它没有针对基线 POSIX sh 的等效功能;因此下面使用 Python 助手。
quote() {
python -c 'import sys, shlex; print(" ".join(shlex.quote(s) for s in sys.argv[1:]))' "$@"
}
drush_arg=$(cat <<'EOF'
somethingelse("$STRING",[]);
EOF
)
drush_cmd=$(quote drush ev "$drush_arg")
somescript -C "$drush_cmd"