【问题标题】:Redirection operator in UNIXUNIX 中的重定向运算符
【发布时间】:2010-12-04 13:08:05
【问题描述】:

假设我有三个文件 file1 file2 file3 有一些内容 现在,当我在 shell 提示符下执行此操作时 cat file1 > file2 >file3

file1的内容被复制到file3,file2为空

同样,当我做cat > file1 > file2 > file3 它要求输入,这个输入存储在 file3 中,file1 和 file2 都是空的

同样对于cat > file1 > file2 < file3,file3 的内容被复制到 file2 并且 file1 为空。

有人可以向我解释发生了什么我是 UNIX 新手。还有我可以了解更多关于这些重定向操作符的任何网站。

谢谢

【问题讨论】:

  • 因为这在很大程度上是无效的语法,所以很难解释。您应该只使用一个>< 运算符。使用两个是一个错误,这很难解释。你读过man bash 来了解shell 吗?您是否尝试过阅读数千个可用的 bashshell 教程?请 (1) 阅读 shell 教程,然后 (2) 根据您所学的内容更新您的问题。这是第一个谷歌点击:gd.tuwien.ac.at/linuxcommand.org/lts0060.html。从这里开始。

标签: shell redirect unix


【解决方案1】:

考虑 shell 在解析命令时如何处理命令的每个部分:

cat file1 > file2 >file3
  1. cat file1:使用cat 程序映像和参数file1 准备一个新进程。 (给定 1 个或多个参数,cat 将从每个参数作为文件读取并写入其输出文件描述符)
  2. > file2:将新进程的输出文件描述符更改为写入file2,而不是当前的输出接收器(最初是交互式 shell 的控制台) - 如有必要,创建 `file2。
  3. > file3:将新进程的输出文件描述符更改为写入file3,而不是当前的输出接收器(原为file2) - 如有必要,创建file3
  4. End of command:生成新进程

所以最后,file2 被创建,但未被使用。 file3 获取数据。

cat > file1 > file2 > file3
  1. cat:使用不带参数的cat 程序/图像准备一个新进程。 (如果没有参数,cat 将从其输入文件描述符中读取并写入其输出文件描述符)
  2. > file1:将新进程的输出文件描述符更改为写入file1,而不是当前的输出接收器(最初是交互式 shell 的控制台) - 如有必要,请创建 file1
  3. > file2:将新进程的输出文件描述符更改为写入file2,而不是当前的输出接收器(原为file1) - 如有必要,创建file2
  4. > file3:将新进程的输出文件描述符更改为写入file3,而不是当前的输出接收器——(原为file2)如有必要,创建file3
  5. End of command:生成新进程

所以最后,file1file2 被创建,但未被使用。 file3 获取数据。 cat 在其输入设备(交互式 shell 的默认控制台设备)上等待输入。 cat 接收到的任何输入都将发送到它的输出设备(当 shell 完成处理命令并调用 cat 时,它最终是 file3)。

cat > file1 > file2 < file3
  1. cat:使用不带参数的cat 程序/图像准备一个新进程。 (如果没有参数,cat 将从其输入文件描述符中读取并写入其输出文件描述符)
  2. &gt; file1:将新进程的输出文件描述符更改为写入file1,而不是当前的输出接收器(最初是交互式shell的控制台)-如有必要,请创建file1
  3. &gt; file2:将新进程的输出文件描述符更改为写入file2,而不是当前的输出接收器(原为file1) - 如有必要,创建file2
  4. &lt; file3:将新进程的输入文件描述符更改为从 file3 读取而不是当前输入源(最初是交互式 shell 的控制台)
  5. End of command:生成新进程

所以最后,file1 被创建,但未被使用。 file2 获取数据。 cat 在其输入设备上等待输入(在 shell 完成处理命令并调用 cat 时设置为 file3)。 cat 接收到的任何输入都将发送到它的输出设备(当 shell 完成处理命令并调用 cat 时,它最终是 file2)。

--

请注意,在第一个示例中,cat 是处理/打开file1 的人。 shell 只是将单词file1 作为参数传递给程序。但是,shell 打开/创建了file2file3catfile3 一无所知,也不知道它写入其标准输出的内容去了哪里。

在其他 2 个示例中,shell 打开了所有文件。 cat 对任何文件一无所知。 cat 不知道它的标准输入来自哪里以及它的标准输出要去哪里。


根据@Sorpigal 评论-BASH manual 对不同重定向运算符的作用有一些很好的描述。在不同的 Unix shell 中,大部分内容在不同程度上是相同的,但请参阅您的特定 shell 手册/手册页以确认。谢谢@Sorpigal。

http://gnu.org/software/bash/manual/html_node/Redirections.html

【讨论】:

  • 非常感谢。这真的很有帮助。谢谢一百万
  • bash 手册在 REDIRECTION 下很好地涵盖了很多内容。
  • @Sorpigal - True - gnu.org/software/bash/manual/html_node/Redirections.html - 很有用,尽管 OP 没有说他们专门使用 bash(甚至是`Bourne shell)。重点不是要解释重定向操作符做什么,而是要说明如何处理命令。对于难以理解正在发生的事情的新手来说,一步一步的描述是一个很大的帮助(特别是如果它自己的例子)。现在他们有了这个工作原理的心智模型,手册可以提供详细信息。
  • 我同意,你的文章直接有用,而且比仅仅阅读 REDIRECTION 更清晰。我当然没有错,这就是我投票的原因。包含对实际文档的引用以供进一步阅读是一个好主意。
【解决方案2】:

您可以重定向标准输入&lt; 标准输出1&gt;&gt; 错误输出2&gt; 或同时输出&amp;&gt; 但您只能重定向1:1,您不能将一个输出重定向为两个不同的文件。

您正在寻找的是tee 实用程序。

【讨论】:

  • 这如何解释为什么file2 为空而file3 包含来自file 的数据?
  • 好吧,在您的 shell 中,重定向被简单地覆盖,因此 &gt; file2 可能被完全忽略,但这是特定于 shell 的。
  • file2 似乎没有被忽略,因为它是创建的并且是空的。很有趣。
  • @khachik 哦,好吧,shell 特定的东西。
【解决方案3】:

如果您不想丢失原始内容,则应使用 redirect 和 append &gt;&gt;&lt;&lt; 运算符。你可以阅读更多here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多