当我已经在引用地狱时使用带有撇号的变量

问题描述 投票:0回答:1

我正在跑步...

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 问题,我有一个螺丝需要拧进去。我不能使用铆钉。我想问哪里可以找到合适的螺丝刀。谢谢!

bash double-quotes heredoc single-quotes
1个回答
0
投票

使用

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"
© www.soinside.com 2019 - 2024. All rights reserved.