echo $(pwd) 和 echo "$(pwd)" 有什么区别?

Qia*_*nba 6 linux bash shell

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
Run Code Online (Sandbox Code Playgroud)

好像掉了很多字符echo $(pwd),所以很多脚本不能正常运行。例如,我必须使用eval "$(something --alias)"而不是eval $(something --alias).

我尝试过echo $(pwd)echo "$(pwd)"在 docker 容器中,输出是相同的。

我的系统有问题吗?

Rav*_*ina 6

这完全是关于分词,有一个变量名为IFS:内部字段分隔符,在扩展或替换之后,bash 会根据 IFS 的值将该过程的结果拆分为不同的词。

此变量的默认值是:"<space><tab><newline>",表示将考虑由空格或制表符或换行符分隔的单词并将其作为单独的单词传递给您的命令。

所以一个值为“hello name is foo”的变量,展开后会被认为是4个不同的词:

$ printf "%s\n" hello name is foo
hello
name
is
foo
Run Code Online (Sandbox Code Playgroud)

如果我想把它看作一个词,我应该引用它:

$ printf "%s\n" "hello name is foo"
hello name is foo
Run Code Online (Sandbox Code Playgroud)

如果我将 IFS 设置为/它将/用作字段分隔符,因此:

$ export IFS='/'
$ var=/some/thing/here
$ echo $var
 some thing here
Run Code Online (Sandbox Code Playgroud)

这可能是你的情况(/在 IFS 中有一个),但是如果你引用这样的替代:"$( ... )"那么 bash 将跳过分词。

然后再次尝试运行您的命令,现在它不应该/用于分隔包含在路径中的单词 (pwd)。