echo $(pwd)
和有什么不同echo "$(pwd)"
?
我记得它们是同一件事,但是这两个命令给了我不同的输出。
这是我的输出:
/usr/share/locale ⌚ 21:19:24
$ echo $(pwd)
usr shar l cal
/usr/share/locale ⌚ 21:19:32
$ echo "$(pwd)"
/usr/share/locale
似乎很多字符都被 删除了echo $(pwd)
,因此很多脚本无法正确运行。例如,我必须使用eval "$(something --alias)"
而不是eval $(something --alias)
。
我尝试过echo $(pwd)
,echo "$(pwd)"
在 docker 容器中,输出是相同的。
我的系统有问题吗?
答案1
这都是关于单词分割的,有一个名为IFS
:内部字段分隔符的变量,在扩展或替换之后,bash 会根据 IFS 的值将该过程的结果分割成不同的单词。
此变量的默认值为:"<space><tab><newline>"
,表示由空格或制表符或换行符分隔的单词将被视为单独的单词并传递给您的命令。
因此,值为“hello name is foo”的变量,扩展后将被视为 4 个不同的单词:
$ printf "%s\n" hello name is foo
hello
name
is
foo
如果我想将其视为一个单词,我应该引用它:
$ printf "%s\n" "hello name is foo"
hello name is foo
如果我将 IFS 设置为,/
它将用作/
字段分隔符,因此:
$ export IFS='/'
$ var=/some/thing/here
$ echo $var
some thing here
这可能是你的情况(/
在 IFS 中有一个),但是如果你引用类似这样的替换情况:"$( ... )"
那么 bash 将跳过单词拆分。
然后尝试再次运行您的命令,现在它不应该用于/
分隔路径(pwd)中的单词。