为什么bash插入引号我没有要求?

时间:2013-01-08 17:20:31

标签: bash shell

有人可以向我解释一下吗?

$ set -x
$ export X="--vendor Bleep\ Bloop"; echo $X
+ export 'X=--vendor Bleep\ Bloop'
+ X='--vendor Bleep\ Bloop'
+ echo --vendor 'Bleep\' Bloop
--vendor Bleep\ Bloop
$

具体来说,为什么echo行插入'字符我没有要求,为什么它会使字符串看起来没有终止?

4 个答案:

答案 0 :(得分:4)

了解Shell扩展

Bash按设定顺序执行shell expansions。 -x标志允许您查看Bash在标记和扩展组成输入行的单词时所采取的步骤的中间结果。

换句话说,输出按设计运行。除非您尝试调试标记化,分词或扩展,否则中间结果对您来说并不重要。

答案 1 :(得分:2)

(好问题)

'prs'并不是真的存在。

我会描述你所看到的-x功能试图消除它如何处理保持你的字符串完整的歧义。位于+的单独行前面的echo符号表示这是shell调试/跟踪输出。

请注意,最终输出与您的作业完全相同,即X=...

IHTH

答案 2 :(得分:1)

您的混淆似乎更多来自+ echo --vendor 'Bleep\' Bloop。它出现的原因是因为它正在打印展开X时的样子。换句话说,执行$X评估是在命令行上放置独立的“单词”--vendorBleep\Bloop。但是,这意味着Bloop\是一个单词,并且为了防止\被解释为转义(空格),它会保留\。如果这些是不同命令的参数,我建议你做:

export X='--vendor "Bleep Bloop"'

export X="--vendor \"Bleep Bloop\""

但我100%不确定是否有效。如果要将参数存储到命令中,可以执行以下操作:

# optional:
# declare -a ARGS
ARGS=('--vendor' '"Bleep Bloop"')

然后将它们用作:

echo ${ARGS[@]}

答案 3 :(得分:1)

此代码

echo --vendor 'Bleep\' Bloop

产生与

完全相同的输出
echo "--vendor Bleep\ Bloop"

Bash只是通过debug / trace选项将代码重新解释为自己的代码。 原因可能是历史性的,不应该被关注。