UNIX中的重定向运算符

时间:2010-12-04 13:08:06

标签: shell redirect unix

假设我有三个文件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新手。还有任何我可以了解这些重定向运算符的网站。

谢谢

3 个答案:

答案 0 :(得分:8)

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

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

    file3
    1. cat > file1 > file2 > file3 :使用cat程序/图像准备一个没有参数的新进程。 (没有参数,cat将从其输入文件描述符读取并写入其输出文件描述符)
    2. cat:将新进程的输出文件描述符更改为写入> file1而不是当前输出接收器(最初是交互式shell的控制台) - 如有必要,创建file1
    3. file1:更改新进程的输出文件描述符以写入> file2而不是当前输出接收器(file2) - 如有必要,创建file1。 / LI>
    4. file2:将新进程的输出文件描述符更改为写入> file3而不是当前输出接收器 - (file3})必要时创建file2
    5. file3:生成新流程
    6. 最后,End of commandfile1已创建,但尚未使用。 file2获取数据。 file3等待其输入设备上的输入(控制台设备作为交互式shell的默认设置)。 cat收到的任何输入都将转到其输出设备(在shell完成处理命令并调用cat时)最终为file3

      cat
      1. cat > file1 > file2 < file3 :使用cat程序/图像准备一个没有参数的新进程。 (没有参数,cat将从其输入文件描述符读取并写入其输出文件描述符)
      2. cat:将新进程的输出文件描述符更改为写入> file1而不是当前输出接收器(最初是交互式shell的控制台) - 如有必要,创建file1
      3. file1:更改新进程的输出文件描述符以写入> file2而不是当前输出接收器(file2) - 如有必要,创建file1。 / LI>
      4. file2:将新进程的输入文件描述符更改为从< file3而不是当前输入源(最初是交互式shell的控制台)读取
      5. file3:生成新流程
      6. 最后,End of command被创建,但未使用。 file1获取数据。 file2等待输入设备上的输入(在shell完成处理命令并调用cat时设置为file3)。 cat收到的任何输入都将转到其输出设备(在shell完成处理命令并调用cat时)最终为file2

        -

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

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


        Per @Sorpigal评论 - BASH manual对不同的重定向操作符的作用有一些很好的描述。其中大部分在不同的Unix shell中都有不同程度的相同,但请参考您的特定shell手册/联机帮助页进行确认。谢谢@Sorpigal。

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

答案 1 :(得分:1)

您可以重定向标准输入<标准输出1>>错误输出2>或两个输出&>但您只能重定向1:1 ,你不能将一个输出重定向到两个不同的文件。

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

答案 2 :(得分:1)

如果您不想丢失原创内容,则应使用重定向并附加 >><<运营商。您可以阅读更多here