UNIX中的重定向运算符

Che*_*rma 1 unix shell redirect

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

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

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

并且cat > file1 > file2 < file3file3的内容也被复制到file2,file1为空.

有人可以向我解释发生了什么我是UNIX的新手.还有任何我可以了解这些重定向运算符的网站.

谢谢

Ber*_*t F 8

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

cat file1 > file2 >file3
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)
  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接收的任何输入都将转到其输出设备(最终file3在shell完成处理命令并调用时cat).

cat > file1 > file2 < file3
Run Code Online (Sandbox Code Playgroud)
  1. cat:cat使用没有参数的程序/图像准备新进程.(没有参数,cat将从其输入文件描述符读取并写入其输出文件描述符)
  2. > file1:更改新进程的输出文件描述符以写入file1而不是当前输出接收器(最初是交互式shell的控制台) - file1必要时创建.
  3. > file2:更改新进程的输出文件描述符以写入file2而不是当前输出接收器(是file1) - file2如有必要,创建.
  4. < file3:更改新进程的输入文件描述符以读取file3而不是当前输入源(最初是交互式shell的控制台)
  5. End of command:产生新的过程

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

-

请注意,在第一个示例中,cat是处理/打开的人file1.shell简单地将单词file1作为参数传递给程序.然而,外壳打开/创建file2file3. cat什么都不知道,也不知道file3它写入标准输出的东西在哪里.

在其他2个示例中,shell打开了所有文件. cat什么都不知道任何文件. cat不知道它的标准输入来自何处以及它的标准输出将在何处.


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

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