echo不会输出多行

时间:2017-02-25 02:54:53

标签: linux bash shell output echo

我一直试图将命令输出到这样的文件:

echo `who | cut -d' ' -f1 | sort | uniq` > users.txt

users.txt的内容在一行上。

但是,如果我只是执行这样的命令:

who | cut -d' ' -f1 | sort | uniq

输出在多行上。

如果我使用echo输出如下命令:

echo `who | cut -d' ' -f1 | sort | uniq`

我在1行输出了输出。

这里发生了什么?如何将此命令的输出写入具有多行的文件?

非常感谢任何帮助。

编辑:

感谢一些评论,我意识到我不需要回声,我可以这样输出:

who | cut -d' ' -f1 | sort | uniq > users.txt

3 个答案:

答案 0 :(得分:5)

实际上,echo可以在多行字符串上正常工作,如果您实际通过防止发生单词分割来提供多行字符串。你可以通过将命令替换括在双引号中来阻止分词而不是扩展。

这将有效(尽管它无用冗长):

echo "`who | cut -d' ' -f1 | sort | uniq`" > users.txt

当然,这里正确的解决方案是避免命令替换(反引号,相当于封闭在$()内),如另一个答案中所建议的那样,但是在很多情况下使用引用命令替换(即将参数传递给echo以外的命令是有用的。

答案 1 :(得分:3)

发生这种情况的原因是命令的结果正在通过bash处理的单词拆分阶段传递。由IFS中的任何字符分隔的所有部分将被分隔为不同的单词,因此您最终会将每个名称作为echo的单个参数结束。

如上所述,如果您只是希望命令的输出进入文件,echo通常会妨碍,并且没有必要。您可以将任何命令的输出重定向到文件,而不仅仅是echo,这样您就可以重新定向管道中最后一个命令的输出,如

who | cut -d' ' -f1 | sort | uniq > users.txt

答案 2 :(得分:1)

假设您只是为了帮助使用uniq选项,awk将是一个更好的选择:

who | awk '!_[$1]++{print $1}' > users.txt