7

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

$ 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

5 回答 5

4

了解外壳扩展

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

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

于 2013-01-08T18:00:09.430 回答
2

(好问题)

' 字符实际上并不存在。

我将描述您所看到的功能,因为这些-x功能试图消除它是如何处理保持您的字符串完好无损的。+单独一行前面的符号echo显示这是 shell 调试/跟踪输出。

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

IHTH

于 2013-01-08T17:25:26.027 回答
1

你的困惑似乎更多地来自于此+ echo --vendor 'Bleep\' Bloop。它看起来像这样的原因是因为它正在打印展开时的样子X。换句话说,做$X评估是将独立的“单词” --vendor, Bleep\, 和Bloop放在命令行上。但是,这意味着 thatBloop\是一个单词,并且为了防止\被解释为转义(空格),它保留了\. 如果这些是不同命令的参数,我建议您执行以下任一操作:

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

或者

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

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

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

然后将它们用作:

echo ${ARGS[@]}
于 2013-01-08T17:35:29.547 回答
1

这段代码

echo --vendor 'Bleep\' Bloop

产生完全相同的输出

echo "--vendor Bleep\ Bloop"

Bash 只是通过调试/跟踪选项将您的代码重新解释为它自己的代码。造成这种情况的原因可能是历史性的,不应在意。

于 2013-01-08T17:53:56.723 回答
0

当你set -x告诉 Bash 打印它对你输入的每个命令的解释时。

所以当你投入

export X="--vendor Bleep\ Bloop"

Bash 将其视为

export 'X=--vendor Bleep\ Bloop'

和这样的打印。

于 2013-01-08T17:23:08.960 回答