当我在文件export X="test"
中写入test.sh
并在外壳引号中执行$(cat test.sh)
时,即echo $X
给出"test"
而export X="test"
直接在外壳中会使引号消失,即echo $X
给出test
为什么?
我似乎正在执行相同的代码,并且它弄乱了我的路径:)
答案 0 :(得分:1)
两者之间的区别是引号删除。在手册页中,
删除行情
在前面的扩展之后,所有非引号出现的字符\,'和“不是由 上述扩展之一被删除。
在$(cat test.sh)
中,最终命令包含由命令替换引起的未加引号的"
字符。命令替换产生了export X="test"
,该命令分为命令字export
及其字面量X="test"
。
在export X="test"
中,命令再次是export
,参数为X="test"
,但是这些引号未加引号,也不由任何扩展产生,因此它们被删除。结果是命令export
接收到X=test
(而不是X="test"
)作为参数。
每个export
命令然后在=
上拆分其参数,将X
视为要定义的变量。一个人看到test
的右侧用作值,另一个人看到"test"
用作值,导致观察到的分配不同。
答案 1 :(得分:0)
给出一个包含短语test.sh
的文件export X="test"
,命令cat test.sh
输出带有转义双引号export X=\"test\"
的字符串,该字符串在bash控制台中打印为{ {1}}。
这就是为什么我给我留下的印象是我执行了相同的代码,但是在第一种情况下,我影响了export X="test"
至\"test\"
,而在第二种情况下,我影响了X
它。
我首先使用然后在其他地方看到的解决方案是将test
的输出传递到cat
,注意单引号sed 's/"//g'
而不是双引号'
。
感谢亨德里克·普林斯露提供以上参考。