关于 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 提供上述参考。
当我在文件 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 提供上述参考。