考虑以下两个命令及其结果:
14:57 : echo $(echo " ABC")
ABC
14:57 : echo " ABC"
ABC
zsh版本:zsh 5.0.5 (x86_64-apple-darwin14.0)
为什么第一个要删除前导空格?我在文档中找不到解释或理由。
答案1
结果是命令替换使用字符 from 作为分隔符将其分解为单词IFS
,除非命令替换用双引号引起来。因此" ABC"
被分成一个单词列表,其中包含一个元素"ABC"
。用于echo "$(echo " ABC")"
将命令替换的结果用作字符串。
与普通的 Bourne/POSIX 风格的 shell 不同,zsh 不会将命令替换产生的单词视为 glob 模式:echo $(echo "*")
prints *
,而不是文件列表(除非glob_subst
设置了该选项)。另外,与普通的 Bourne/POSIX 风格 shell 不同,分割仅在未加引号的命令替换上执行,而不是在未加引号的变量替换上执行,除非删除了未加引号的变量替换所产生的空字。
答案2
因为echo ABC
和echo ABC
给出相同的输出:ABC
,并且第一个命令echo $(echo " ABC")
==> echo ABC
==> ABC
。 shell 只是删除了多个空格,因此echo
甚至不知道命令行中存在多少个空格。
您可以通过按以下方式引用整个表达式来保留空格:
$ echo "$(echo " ABC")"
ABC
或者
$ echo "$(echo ' ABC')"
ABC