zsh 函数输出删除前导空格

zsh 函数输出删除前导空格

考虑以下两个命令及其结果:

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 ABCecho ABC给出相同的输出:ABC,并且第一个命令echo $(echo " ABC")==> echo ABC==> ABC。 shell 只是删除了多个空格,因此echo甚至不知道命令行中存在多少个空格。

您可以通过按以下方式引用整个表达式来保留空格:

$ echo "$(echo "  ABC")"
    ABC

或者

$ echo "$(echo '  ABC')"
    ABC

相关内容