我的文件夹中有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
列出文件显示正常。但是为什么下面的命令会在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
答案 0 :(得分:4)
要补充Colwin's effective answer 为什么需要双引号:
如果您传递 未加引号命令替换(例如,`ls -l`
或better, $(ls -l)
)或变量引用 (例如,$var
), shell 在将参数传递给命令之前修改命令输出/变量值。 />
这适用于所有与POSIX兼容的shell,而不仅仅是bash
。
具体来说,以下所谓的shell expansions 执行:
分词:输出被空格拆分为(可能)多个字词,包括换行符(默认情况下;可以通过$IFS
)
globbing(文件名扩展):每个结果单词都被解释为文件名模式并匹配当前目录中的agains文件,每个匹配的文件名变为其自己的话,所有结果的单词取代原来的单词;默认情况下,如果没有匹配,则该字保持原样。
结果词然后作为单独的参数 传递给目标命令。
相比之下,如果双引号命令替换("$(ls -l)"
或变量引用("$var"
),则不会发生这些扩展,并且输出/值以原样 传递给目标命令。
因此,在手头的情况下:
ls -l
echo
echo
简单地连接用空格传递给它的多个参数,这就是你在问题中看到单行输出的原因。
简而言之:由于不是双引号`ls -l`
,echo `ls -l`
会打印ls -l
输出中包含的单词的空格分隔的单行列表。 强>
答案 1 :(得分:3)
由于你在这里使用命令替换和echo,为了获得echo以在多行显示输出,你需要引用输出。
$ echo "`ls -l`"