为什么命令扩展中的嵌入换行符被替换为空格?

为什么命令扩展中的嵌入换行符被替换为空格?

来自 Bash 手册关于命令扩展的结果

嵌入的换行符不会被删除,但它们可能会在分词过程中被删除。

例如

$ cat myfile
1
2
3

$ echo $(cat myfile)
1 2 3

我想知道为什么嵌入的换行符被替换为空格?说明书上没这么说吧?

答案1

在 bash(和许多其他 shell)中,$()用于获取命令的输出,并将其用作另一个命令的参数。

在这里,它的作用是:

首先执行cat

1
2
3

然后$()用这个替换该块:

echo 1
2
3

现在 shell 需要解释此输入,并将正确的参数发送到echo.为此,它必须 split 12换句话说3:这是删除换行符的地方。

最后,shell 发送以下内容:

程序 :echo

论据:1 2 3

这将显示您所看到的内容:

1 2 3

因为当echo有多个参数时,它会显示所有参数并用空格分隔。

答案2

bew78 已经回答了这个问题,但只是为了更明确——

从...开始命令替换在源代码中,它调用word_list_split(),然后它本身调用word_split(), 哪个然后来电列表字符串(), 哪个具体来说跳过 IFS 分隔符。这将创建单独的“单词”,然后 list_string() 函数将其返回堆栈。这就是 1、2 和 3 最终作为命令的单独参数的原因echo

相关内容