“重定向”和“管道”有什么区别?

Modified on: Sat, 09 Jun 2018 01:30:53 +0800

这个问题可能听起来有点愚蠢,但我真的看不到重定向和管道之间的区别。

重定向用于重定向stdout / stdin / stderr,例如ls > log.txt

管道用于将命令的输出作为另一个命令的输入,例如, ls | grep file.txt

但为什么有两个运营商同样的事情呢?

为什么不写ls > grep传递输出,这不仅仅是一种重定向吗?我缺少什么?

最佳答案

管道用于将输出传递到另一个程序或实用程序

重定向用于将输出传递给文件或流

示例:thing1 > thing2 vs thing1 | thing2

thing1 > thing2

  1. 您的shell将运行名为thing1
  2. 的程序
  3. thing1输出的所有内容都将放在名为thing2的文件中。 (注意 - 如果thing2存在,它将被覆盖)
  4. 醇>

    如果要将程序thing1的输出传递给名为thing2的程序,可以执行以下操作:

    thing1 > temp_file && thing2 < temp_file

    哪个

    1. 运行名为thing1
    2. 的程序
    3. 将输出保存到名为temp_file
    4. 的文件中
    5. 运行名为thing2的程序,假装键盘上的人输入temp_file的内容作为输入。
    6. 醇>

      然而,这很笨重,因此他们将管道作为一种更简单的方法。 thing1 | thing2thing1 > temp_file && thing2 < temp_file

      编辑以提供更多详细信息以供评论:

      如果>试图同时“传递给程序”和“写入文件”,则可能会导致双向问题。

      第一个例子:您正在尝试写入文件。已存在您要覆盖的具有该名称的文件。但是,该文件是可执行的。据推测,它会尝试执行此文件,传递输入。您必须执行诸如将输出写入新文件名,然后重命名该文件之类的操作。

      第二个例子:正如Florian Diesch指出的那样,如果系统中的其他命令具有相同的名称(即在执行路径中),该怎么办?如果您打算在当前文件夹中创建一个具有该名称的文件,那么您将被卡住。

      第三:如果您输错了命令,它就不会警告您该命令不存在。现在,如果你输入ls | gerp log.txt它会告诉你bash: gerp: command not found。如果>表示两者,它只会为您创建一个新文件(然后警告它不知道如何处理log.txt)。


相关问答

添加新评论