【问题标题】:Why is `ls hello.txt | cat` different from `cat hello.txt`? [closed]为什么是`ls hello.txt | cat`与`cat hello.txt`不同? [关闭]
【发布时间】:2016-02-20 05:54:48
【问题描述】:

我想知道为什么ls hello.txt|cat 不做与cat hello.txt 相同的事情?我试图将ls 的结果传递给cat,这似乎是有道理的,因为'ls hello.txt' 的结果就是hello.txt 本身。

【问题讨论】:

  • ls 代表listcatconcatenate 的缩写。为什么你会期望它们是一样的? (ls 列出文件信息(例如大小、所有权),cat 连接文件(默认为 stdout)。如果您的系统默认为 ls 添加其他选项(例如 --color),那么它们将不会一样的。

标签: linux pipe cat ls


【解决方案1】:

如果您将输入输入到cat,则结果就是输入。这就是cat 处理标准输入的方式。一般来说,程序对待标准输入的方式应该不同于对待参数的方式。

也许这些可以帮助你更清楚地看到它:

echo "hello" | cat
=> hello

echo "hello"cat 输入“hello”,cat 对标准输入的行为只是打印出它在标准输入中接收到的任何内容。所以它会打印出“hello”。

cat hello.txt | cat
=> prints out the text of hello.txt

第一个cat 输出file.txt 的内容,第二个cat 输出它在stdin 中接收到的任何内容——file.txt 的内容。

那么,ls hello.txt 输出什么?

ls hello.txt 不输出hello.txt 内的文本。相反,如果文件存在,它实际上只输出字符串"hello.txt"

ls hello.txt
=> hello.txt

ls hello.txt | cat
=> hello.txt

就像这样:

echo "hello"
=> hello

echo "hello" | cat
=> hello

我猜最大的误解之一可能是您认为ls hello.txt 输出hello.txt内容...但它没有,它只是输出名称。 cat 接收该名称,并将该名称直接打印出来。 ls hello.txtresult 实际上只是字符串“hello.txt”......它不是文件的内容。而cat 只是输出它收到的内容——字符串“hello.txt”。 (不是文件的内容)

【讨论】:

  • 荣誉 - 一个很好的解释 :) 你是绝对正确的!
【解决方案2】:
  1. David C. Rankin 和 Ben Voigt 都是正确的。

  2. cat hello.txt 将文件“hello.txt”的输出写入标准输出(例如,写入您的命令提示符。

  3. ls hello.txt 将值“hello.txt”写入标准输出。 cat,没有参数,从它的标准输入读取(而不是解析命令行参数)。因此,ls hello.txt | cat 执行以下操作:

    一个。 shell 执行“ls hello.txt”并生成输出“hello.txt”。

    b.然后,shell 创建一个到第二个命令“cat”的管道,并将“hello.txt”定向到 cat 的标准输入。

    c。 "cat" 读取标准输入并将文件 "hello.txt" 的值输出到它的标准输出。

【讨论】:

    【解决方案3】:

    命令ls hello.txt|cat 有点模棱两可,因为您通过放置管道(|)来传递ls命令的结果,您想做的事情可以通过

    ls hello.txt|xargs cat
    

    我能弄清楚的是 ls 将输出作为标准输入提供给 cat 而 cat 期望文件名作为参数。

    实现的另一种方法是通过

    cat $(ls hello.txt)
    

    【讨论】:

    • 谢谢。但实际上我正在尝试将 ls 的结果传递给 cat。为什么不正确,因为 'ls hello.txt' 的结果是 hello.txt?
    • @zell:因为cat 不会从stdin 读取要读取的文件列表,所以如果您不指定其他文件,它只会使stdin 成为要读取的文件。所以ls 将单词“hello.txt”打印到它的stdout,它通过管道成为catstdin。由于cat正在打印出它的stdin(你没有指定不同的文件),它就乖乖地打印出“hello.txt”这个词。
    • 否:cat $(ls hello.txt) != ls hello.txt|cat。输出恰好看起来相同;在 shell 级别实际发生的事情完全不同。
    • @paulsm4 我提出了另一种方法,我的第二个代码实际上是原始答案。
    • @paulsm4 为什么不呢?您能否详细说明一下作为答案?
    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 2016-09-11
    • 2015-09-15
    • 1970-01-01
    相关资源
    最近更新 更多