来自 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 1
,2
换句话说3
:这是删除换行符的地方。
最后,shell 发送以下内容:
程序 :echo
论据:1
2
3
这将显示您所看到的内容:
1 2 3
因为当echo
有多个参数时,它会显示所有参数并用空格分隔。
答案2
bew78 已经回答了这个问题,但只是为了更明确——
从...开始命令替换在源代码中,它调用word_list_split(),然后它本身调用word_split(), 哪个然后来电列表字符串(), 哪个具体来说跳过 IFS 分隔符。这将创建单独的“单词”,然后 list_string() 函数将其返回堆栈。这就是 1、2 和 3 最终作为命令的单独参数的原因echo
。