Bash 在捕获命令结果时是否执行分词?

Bash 在捕获命令结果时是否执行分词?

前言:我已经看过可能相关的问题“ls”和“echo $(ls)”之间的区别

bash 是否对输出捕获执行分词?本指南 - mywiki.wooledge.org/WordSplitting 说“不”:

作业中的扩展不会执行分词。因此,不需要在命令中引用任何内容,如下所示:[...]bar=$(a command)

但是当我做res=$(find); echo $res输出时,它与以下内容不同find

$ find
.
./file2
./file1
./test.sh
$ res="$(find)"; echo $res
. ./file2 ./file1 ./test.sh
$ res=$(find); echo $res
. ./file2 ./file1 ./test.sh

 

答案1

请注意,您引用的文本仅与变量的赋值相关res。这部分没有问题。

find实用程序生成以换行符分隔的路径名作为输出,如您所示。

将此输出分配给变量将保留换行符(最后一个除外,它被删除)。

到目前为止一切都很好,但是接下来......

当您echo在 中 使用不带引号的变量进行调用时bash,变量的值将按空格、制表符和换行符分割(默认情况下),并且生成的字符串将进行文件名生成(通配)。然后将得到的单词作为单独的参数给出echo

echo实用程序将输出由空格字符分隔的参数(并在末尾添加换行符)。这就是您所展示的情况echo $res

要查看变量的值而不让 shell 将其拆分为多个单词并对它们进行文件名通配,请双引号变量的扩展:echo "$res",甚至更好,printf '%s\n' "$res"(请参阅为什么 printf 比 echo 更好?)。

简而言之,调用中变量的扩展echo必须加引号。

相关内容