【问题标题】:echo won't output multiple lines [duplicate]echo不会输出多行[重复]
【发布时间】:2017-07-16 01:00:39
【问题描述】:

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

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 行得到输出。

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

非常感谢任何帮助。

编辑:

感谢几个cmets,我意识到我不需要回声,我可以这样输出:

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

【问题讨论】:

  • 这并没有解决您的问题,但是如果您希望输出到文件,为什么还要麻烦echo 部分?只需删除反引号和回声。
  • 为什么不直接做who | cut -d' ' -f1 | sort | uniq >> users.txt
  • @EricRenouf Gee,我很笨!我认为它只适用于回声。非常感谢!
  • 但是请注意,您可以通过引用您的命令替换 echo "$(who | cut -d' ' -f1 | sort | uniq)" > users.txt(将反引号替换为 $() 以允许代码格式化)来使您的原始版本工作。虽然不是实现您既定目的的最佳方式,但了解它的工作原理很有用,原因是引号可以防止发生分词。

标签: linux bash shell output echo


【解决方案1】:

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

这会起作用(虽然它是无用的冗长):

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

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

【讨论】:

  • 这应该是公认的答案。
【解决方案2】:

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

如前所述,如果您只想将命令的输出放入文件中,echo 经常会妨碍您,这不是必需的。您可以将任何命令的输出重定向到文件,而不仅仅是echo,因此您可以将管道中最后一个命令的输出重定向,例如

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多