假设我有三个文件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新手。还有任何我可以了解这些重定向运算符的网站。
谢谢
答案 0 :(得分:8)
考虑shell在解析命令时如何处理命令的每个部分:
cat file1 > file2 >file3
cat file1
:使用带有参数cat
的{{1}}程序图像准备一个新流程。 (给定1个或多个参数,file1
将从每个参数读取为文件并写入其输出文件描述符)cat
:将新进程的输出文件描述符更改为写入> file2
而不是当前输出接收器(最初是交互式shell的控制台) - 如有必要,创建`file2。file2
:更改新进程的输出文件描述符以写入> file3
而不是当前输出接收器(file3
) - 如有必要,创建file2
file3
:生成新流程最后,End of command
被创建,但未使用。 file2
获取数据。
file3
cat > file1 > file2 > file3
:使用cat
程序/图像准备一个没有参数的新进程。 (没有参数,cat
将从其输入文件描述符读取并写入其输出文件描述符)cat
:将新进程的输出文件描述符更改为写入> file1
而不是当前输出接收器(最初是交互式shell的控制台) - 如有必要,创建file1
。 file1
:更改新进程的输出文件描述符以写入> file2
而不是当前输出接收器(file2
) - 如有必要,创建file1
。 / LI>
file2
:将新进程的输出文件描述符更改为写入> file3
而不是当前输出接收器 - (file3
})必要时创建file2
file3
:生成新流程最后,End of command
和file1
已创建,但尚未使用。 file2
获取数据。 file3
等待其输入设备上的输入(控制台设备作为交互式shell的默认设置)。 cat
收到的任何输入都将转到其输出设备(在shell完成处理命令并调用cat
时)最终为file3
。
cat
cat > file1 > file2 < file3
:使用cat
程序/图像准备一个没有参数的新进程。 (没有参数,cat
将从其输入文件描述符读取并写入其输出文件描述符)cat
:将新进程的输出文件描述符更改为写入> file1
而不是当前输出接收器(最初是交互式shell的控制台) - 如有必要,创建file1
。 file1
:更改新进程的输出文件描述符以写入> file2
而不是当前输出接收器(file2
) - 如有必要,创建file1
。 / LI>
file2
:将新进程的输入文件描述符更改为从< file3
而不是当前输入源(最初是交互式shell的控制台)读取file3
:生成新流程最后,End of command
被创建,但未使用。 file1
获取数据。 file2
等待输入设备上的输入(在shell完成处理命令并调用cat
时设置为file3
)。 cat
收到的任何输入都将转到其输出设备(在shell完成处理命令并调用cat
时)最终为file2
。
-
请注意,在第一个示例中,cat
是处理/打开cat
的人。 shell简单地将单词file1
作为参数传递给程序。但是,shell打开/创建了file1
和file2
。 file3
对cat
一无所知,也不知道它写入标准输出的内容在哪里。
在其他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。