关于 export 和 $() 双引号的小问题

Small question about export and $() double quotes

当我在文件 test.sh 中写入 export X="test" 并在 shell 中执行 $(cat test.sh) 引用时,即 echo $X 给出 "test"export X="test" 直接在 shell 中使引号消失,即 echo $X 给出 test 为什么?

我似乎在执行相同的代码,它一直在扰乱我的路径:)

两者的区别在于引号去除。从手册页,

Quote Removal

After the preceding expansions, all unquoted occurrences of the characters \, ', and " that did not result from one of the above expansions are removed.

$(cat test.sh) 中,最终命令包含未加引号的 " 字符,这些字符确实是由命令替换产生的。命令替换生成 export X="test",它拆分为命令词 export 及其文字参数 X="test".

export X="test" 中,命令再次 export 带有一个参数 X="test" 但是 这些引号没有被引用并且不是由任何扩展,所以它们被删除。结果是命令 export 接收 X=test(不是 X="test")作为其参数。

每个 export 命令然后在 = 上拆分其参数,将 X 视为要定义的变量。一个看到 test 的右侧用作值,另一个看到 "test" 用作值,导致您观察到的不同赋值。

给定一个包含短语 export X="test" 的文件 test.sh,命令 cat test.sh 输出带有转义双引号 export X=\"test\" 的字符串,该字符串在 bash 控制台为 export X="test".

这就是为什么我的印象是我执行了相同的代码,但是在第一种情况下我影响了 \"test\"X 而在第二种情况下我影响了 test 给它。

我第一次使用然后在其他地方看到的解决方案是将 cat 的输出通过管道传输到 sed 's/"//g',注意单引号 ' 而不是双引号 ".

感谢 Hendrik Prinsloo 提供上述参考。