有人可以向我解释一下吗?
$ 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
行插入'
字符我没有要求,为什么它会使字符串看起来没有终止?
答案 0 :(得分:4)
Bash按设定顺序执行shell expansions。 -x标志允许您查看Bash在标记和扩展组成输入行的单词时所采取的步骤的中间结果。
换句话说,输出按设计运行。除非您尝试调试标记化,分词或扩展,否则中间结果对您来说并不重要。
答案 1 :(得分:2)
(好问题)
'prs'并不是真的存在。我会描述你所看到的-x
功能试图消除它如何处理保持你的字符串完整的歧义。位于+
的单独行前面的echo
符号表示这是shell调试/跟踪输出。
请注意,最终输出与您的作业完全相同,即X=...
IHTH
答案 2 :(得分:1)
您的混淆似乎更多来自+ echo --vendor 'Bleep\' Bloop
。它出现的原因是因为它正在打印展开X
时的样子。换句话说,执行$X
评估是在命令行上放置独立的“单词”--vendor
,Bleep\
和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选项将代码重新解释为自己的代码。 原因可能是历史性的,不应该被关注。