【问题标题】:why doesn't cat foo.txt | echo produce output?为什么不 cat foo.txt | echo 产生输出?
【发布时间】:2021-03-17 14:36:00
【问题描述】:

我很惭愧提出这样一个基本问题,但我对管道的理解似乎存在重大缺陷。我读到了:

Do 'cat foo.txt | my_cmd' and 'my_cmd < foo.txt' accomplish the same thing?

还有很多其他帖子,但我无法理解为什么上面提到的语句不打印 foo.txt 的内容。本来我也试过

cat /etc/passwd | cut -d: -f1 | sort | echo

并最终将问题简化为列出的内容。有趣的是,如果我在最后省略管道并回显,一切都会正常运行——尽管我不想要换行符。我也可以

cut -d: -f1 < /etc/passwd  | sort 

并得到相同的结果(不幸的是换行符。)也许 echo 不接受标准输入?手册页没有提到它。它似乎是对其功能的一个相当有用的补充,但我想如果同时提供标准输入和参数,它可能会使事情变得更加复杂。

我知道我在这件事上疯了。不急于回答这个问题——我只是好奇。感谢您的宝贵时间!

【问题讨论】:

  • 标准输入和命令参数通常不可互换。 echo 打印它作为参数接收的内容,而不是作为标准输入接收的内容。我的回答here 可能会有所帮助。 (或者它可能只会进一步混淆事情,但希望不会。)
  • 谢谢戈登。我得到的主要收获是“xargs 可以被认为是将 STDIN 样式的输入转换为参数:”而 echo 实际上或多或少地相反。我已经设法完成了多少项目,甚至不了解我实际上在做什么,只是遵循以身作则的习语,这有点疯狂。

标签: bash pipe echo


【解决方案1】:

echo 不读取标准输入 - 那是 cat 的工作。

正如您所发现的,只需从管道中删除 | echo

【讨论】:

    【解决方案2】:

    只是为了增加一些精度。

    关于echo

    • echo 永远不会读取标准输入,如您所见:

      ~ $ echo HI
      HI
      ~ $ echo HI | echo LOW
      LOW
      ~ $ echo HI | echo LOW | cat
      LOW
      ~ $ echo HI | cat | echo LOW
      LOW
      
    • echo 只是旨在输出您作为参数提供的字符。

    • 所以,像这样管道echoany_command | echo 完全没用。

    关于cat

    • cat 将始终读取标准输入,除非你给它一个文件名,例如:
     Comments      | Shell
    ---------------+-------------------------------------------------------------
                   | ~ $ cat poem.txt
                   | My super poem
                   | ~ $ cat poem.txt | cat | cat
                   | My super poem
                   | ~ $ echo HI | cat           # Read stdin because no filename
                   |                             # is given
                   | HI
                   | ~ $ echo HI | cat poem.txt  # A filename is given, so don't
                   |                             # take stdin into account
                   | My super poem
                   | ~ $ cat poem.txt | echo     # echo is not mean to be piped
                   |
                   | ~ $ cat poem.txt | echo HI  # echo is not mean to be piped
                   | HI
                   | ~ $ cat  # if no pipe or filename is given to cat, then a basic
                   |          # interactive mode is proposed, thanks to the shell
    [interactive]  | 1234
    [cat response] | 1234
    [interactive]  | Leave this hell by hitting Ctrl-D...
    [cat response] | Leave this hell by hitting Ctrl-D...
    [hit Ctrl-D]   |
                   | ~ $ cat > new-poem.txt
    [interactive]  | Looking at stars everyday
    [interactive]  | So nice
    [hit Ctrl-D]   |
                   | ~ $ cat new-poem.txt
                   | Looking at stars everyday
                   | So nice
    

    【讨论】:

      猜你喜欢
      • 2017-08-08
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 2017-01-03
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多