AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 488382
Accepted
Max Koretskyi
Max Koretskyi
Asked: 2014-06-27 02:33:30 +0800 CST2014-06-27 02:33:30 +0800 CST 2014-06-27 02:33:30 +0800 CST

为什么使用管道而不是输入重定向

  • 772

我是 linux 系统的新手,我真的不明白为什么我们需要两个可以重定向输出的运算符:pipe as|和 ouput redirection operator >?我们不能总是使用第二个吗?大多数时候,如果多个命令链接在一起,我会看到使用管道。但是,如果输出重定向到文件,如中echo 'hello' > filename,则使用输出重定向运算符。我在这里错过了什么?

output
  • 4 4 个回答
  • 2180 Views

4 个回答

  • Voted
  1. John Hunt
    2014-06-27T02:34:52+08:002014-06-27T02:34:52+08:00

    我相信 < > 运算符用于读/写文件,而 | 符号用于将一个命令的标准输出通过管道传输到另一个命令。

    cal | less 
    

    允许您在名为 less 的命令中查看 cal 的输出。

    cal > less
    

    将 cal 的输出放入名为 less 的文件中。

    • 4
  2. Avinash Raj
    2014-06-27T02:37:24+08:002014-06-27T02:37:24+08:00
    • |用于将一个命令的输出作为输入发送到管道符号之后的另一个命令。

      $ echo foo | grep -o 'f'
      f
      
    • 要将一个命令的输出重定向到文件,您可以使用输出重定向>运算符。

      $ echo foo > file1
      

      它写入foofile1。您不需要手动创建该文件。

    • 如果你想将输出重定向到许多文件,那么你必须使用tee命令。

      echo foo | tee file1 file2
      

      它写入foo文件 1 和文件 2。您不需要手动创建该文件。现在 file1 和 file2 只包含字符串foo。

    • 4
  3. Oli
    2014-06-27T05:51:14+08:002014-06-27T05:51:14+08:00

    有很多关于输出重定向的讨论,但我认为这个问题是关于输入的。我将忽略>and>>因为它们与输入无关。相反,我将专注于<,<(...)和|:

    • <期望从文件中读入STDINwhile,
    • <(...)提供STDOUT命令的文件句柄(...此处)
    • |STDOUT从一个进程到STDIN下一个进程的管道

    所以<它不直接等同于管道(它从文件<(...)中读取)并且是从正确的位置读取,但它提供文件句柄作为输出。您需要将它们组合起来以提供相当于管道的功能。

    a | b
    < <(a) b
    

    只是阅读,我希望完整解释管道存在的原因。它更具可读性。

    • 3
  4. Best Answer
    Sergiy Kolodyazhnyy
    2018-08-20T17:43:28+08:002018-08-20T17:43:28+08:00

    要记住的关键点是管道是进程间通信设备,它允许两个进程(这就是命令的真正含义)交换数据,而重定向运算符用于操纵特定进程写入的位置。

    在视频Unix Pipeline中,语言的创造者awk和 AT&T Unix 的创始人之一 Brian Kernighan 解释道:

    首先,您不必编写一个庞大的大型程序 - 您已经拥有可能已经完成部分工作的现有较小程序......另一个是您正在处理的数据量可能不适合如果你将它存储在一个文件中......因为记住,我们回到了这些东西上的磁盘的日子,如果你幸运的话,一兆字节或两兆字节的数据......所以管道永远不必实例化整个输出

    如您所见,在创建管道的上下文中,它们实际上不仅仅是通信设备,还可以节省存储空间并简化开发。当然,我们可以对所有内容使用输出/输入重定向(尤其是现在存储容量在 TB 范围内),但是从存储和处理速度的角度来看,这将是低效的——记住你是直接提供输出从一个命令到另一个命令|。考虑类似的东西command1 | grep 'something'。如果将command1first 的输出写入文件,则写入所有内容需要时间,然后让grep浏览整个文件。有了管道和输出被缓冲这一事实(意味着左侧进程在右侧进程准备好再次读取之前暂停),输出直接从一个命令转到另一个命令,从而节省了时间。

    值得注意的是,对于进程间通信,有一个named pipes的用例,您可以使用>运算符从一个命令写入,并<让另一个命令从中读取,这是一个您确实想要的用例在文件系统上有特定的目的地,多个脚本/命令可以写入并就该特定目的地达成一致。但在不必要的时候,匿名管道|才是你真正需要的。

    • 2

相关问题

  • 当将输入从一个程序传递到另一个程序时,如果接收输出的程序被终止,原始程序会发生什么?

  • 如何监控已经运行的程序的输出?

  • 如何将顶部的输出回显到文本文件中?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve