有人可以向我解释一下吗?
$ 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
行会插入'
我没有要求的字符,为什么它会使字符串看起来未终止?
Bash 以固定的顺序执行shell 扩展。-x 标志允许您查看 Bash 在标记和扩展组成输入行的单词时所采取的步骤的中间结果。
换句话说,输出按设计运行。除非您尝试调试标记化、分词或扩展,否则中间结果对您来说并不重要。
(好问题)
' 字符实际上并不存在。
我将描述您所看到的功能,因为这些-x
功能试图消除它是如何处理保持您的字符串完好无损的。+
单独一行前面的符号echo
显示这是 shell 调试/跟踪输出。
请注意,最终输出与您的作业完全相同,即X=...
IHTH
你的困惑似乎更多地来自于此+ 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[@]}
这段代码
echo --vendor 'Bleep\' Bloop
产生完全相同的输出
echo "--vendor Bleep\ Bloop"
Bash 只是通过调试/跟踪选项将您的代码重新解释为它自己的代码。造成这种情况的原因可能是历史性的,不应在意。
当你set -x
告诉 Bash 打印它对你输入的每个命令的解释时。
所以当你投入
export X="--vendor Bleep\ Bloop"
Bash 将其视为
export 'X=--vendor Bleep\ Bloop'
和这样的打印。