【发布时间】:2020-11-03 21:29:48
【问题描述】:
我不能强制 KSH 将 \" 作为参数传递给命令。
我想被执行的字面意思是:
command \"foo bar\"
以下示例在 ksh 中执行,并预先执行 set -x 以显示每个命令的回显,以将其执行的确切格式(在它被 ksh 解析之后)
[oracle@localhost sf_vm]$ ksh
$ set -x
我尝试并得到的是:
$ command \"foo bar\"
+ command '"foo' 'bar"'
不是我需要的:缺少 \ 和额外的 ' 和 "
$ command \\\"foo bar\\\"
+ command '\"foo' 'bar\"'
又不走运了:在 foo 和 bar 之外和之间增加了 '
$ command "\\\"foo bar\\\""
+ command '\"foo bar\"'
几乎正确,但在外面仍然不需要 '
$ command '\"foo bar\"'
+ command '\"foo bar\"'
再次几乎正确,但仍然'在外面
实际用例是我将 USERID 参数传递给 oracle expdb 命令,格式为
expdp USERID=/ AS SYSDBA 需要用转义双引号括起来,如下所示:
expdp USERID=\"/ AS SYSDBA\"
我知道我可以通过为 expdp 使用 prm 文件来解决此问题,但在我的情况下它非常不方便(自动导出)
如果有什么不同,我使用的是 ksh93 版本:
[oracle@localhost sf_vm]$ ll /etc/alternatives/ksh
lrwxrwxrwx. 1 root root 10 Oct 15 2018 /etc/alternatives/ksh -> /bin/ksh93
【问题讨论】:
-
set -x记录的内容是传递给您的命令的人类可读表示。 实际数据是一个C字符串数组;它必须被转义才能成为人类可读的。 -
那么,当您说要执行
command \"foo bar\"时,您希望执行的C 字符串数组究竟 是什么?因为我希望运行的是数组——以 JSON 格式表示——["command", "\"foo", "bar\""]。是你要使用的数组吗? -
(要清楚:
command '"foo' 'bar"'是与 JSON 字符串["command", "\"foo", "bar\""]对齐的 argv 的有效 shell 语法,也就是说,shell 告诉你它做了什么您要求,而您只是误解了它用于此的语法)。 -
相比之下,如果你想要的是
command "foo bar",那么不要使用反斜杠。当它们被省略时,双引号被视为语法而不是文字数据。 -
谢谢查尔斯,你指出的让我找到了问题的真正根本原因,正如我在答案中描述的那样。