将多行命令输出传递给echo只输出一行

时间:2017-05-10 12:57:06

标签: 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

列出文件显示正常。但是为什么下面的命令会在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

2 个答案:

答案 0 :(得分:4)

要补充Colwin's effective answer 为什么需要双引号

如果您传递 未加引号命令替换(例如,`ls -l`better, $(ls -l)或变量引用 (例如,$var), shell 在将参数传递给命令之前修改命令输出/变量值。 /> 这适用于所有与POSIX兼容的shell,而不仅仅是bash

具体来说,以下所谓的shell expansions  执行:

  • 分词:输出被空格拆分为(可能)多个字词,包括换行符(默认情况下;可以通过$IFS

  • 设置拆分字符
  • globbing(文件名扩展):每个结果单词都被解释为文件名模式并匹配当前目录中的agains文件,每个匹配的文件名变为其自己的话,所有结果的单词取代原来的单词;默认情况下,如果没有匹配,则该字保持原样。

结果词然后作为单独的参数 传递给目标命令。

相比之下,如果双引号命令替换("$(ls -l)"或变量引用("$var"),则不会发生这些扩展,并且输出/值以原样 传递给目标命令。

因此,在手头的情况下:

  • shell从ls -l
  • 的输出中删除所有换行符
  • 然后将结果单词单独传递,将多个参数传递给echo

echo简单地连接用空格传递给它的多个参数,这就是你在问题中看到单行输出的原因。

简而言之:由于不是双引号`ls -l`echo `ls -l`会打印ls -l输出中包含的单词的空格分隔的单行列表。

答案 1 :(得分:3)

由于你在这里使用命令替换和echo,为了获得echo以在多行显示输出,你需要引用输出。

$ echo "`ls -l`"