Dee*_*ula -3 linux bash parameter-passing command-substitution
我的文件夹中有 2 个文件,如下所示
$ ls -l
total 1
-rw-r--r-- 1 user user-group 0 May 10 14:49 test
-rw-r--r-- 1 user user-group 0 May 10 14:49 test1
Run Code Online (Sandbox Code Playgroud)
列出文件显示正常。但是为什么下面的命令显示两行在 bash 中合并为一行?
$ echo `ls -l`
total 1 -rw-r--r-- 1 user user-group 0 May 10 14:49 test -rw-r--r-- 1 user user-group 0 May 10 14:49 test1
Run Code Online (Sandbox Code Playgroud)
为了补充科尔温的有效答案,为什么需要双引号:
如果传递的未引用的命令替换(例如,`ls -l`或者,更好的,$(ls -l))或可变参考(例如,$var),所述壳修改命令输出/变量值之前使所述参数的命令。
这适用于所有 POSIX 兼容的 shell,而不仅仅是bash.
具体来说,执行以下所谓的壳扩展 :
word-splitting:输出被whitespace分割成(可能)多个单词,包括换行符(默认情况下;可以通过 设置分割字符)$IFS
globbing(文件名扩展):每个结果词被解释为文件名模式并与当前目录中的文件再次匹配,每个匹配的文件名成为它自己的词,所有结果词替换原来的词;默认情况下,如果没有匹配项,则单词保持原样。
然后将结果单词作为单独的参数传递给目标命令。
相比之下,如果您用双引号引用命令替换("$(ls -l)"或变量引用 ( "$var"),则不会发生这些扩展,并且输出/值会按原样传递给目标命令。
因此,在手头的情况下:
ls -l echoecho只需将您传递给它的多个参数与空格连接起来,这就是您看到问题中打印的单行输出的原因。
简而言之:由于不是双引号`ls -l`,echo `ls -l`打印输出中包含的单词的空格分隔的单行列表ls -l.
由于您在这里使用命令替换和 echo,为了让 echo 在多行上显示输出,您需要引用输出。
$ echo "`ls -l`"
Run Code Online (Sandbox Code Playgroud)