我试过这个命令,它输出了file2.txt。为什么会发生?我问这个问题,因为我写的交流外壳,所以也许你知道如何避免这个问题cat <file1.txt file2.txt是如何解释的?
回答
它的工作原理,因为它预计:
cat命令按顺序读取文件,将它们写入标准输出为 。文件操作数按命令行顺序处理 。如果文件是单个短划线(` - ')或不存在,则cat从标准输入中读取。
创建一些演示文件:
for i in 1 2 3; do echo this is d$i > d$i; done
的cat d1
显示
this is d1
这是你有什么期望 - 在d1
是cat
的说法。该cat < d3
显示
this is d3
再次,它的工作原理是应该 - 在这里没有任何说法,因此猫显示它的标准输入。于是最后,
的cat d1 - d3 < d2
显示
this is d1
this is d2
this is d3
例如猫读取它的参数,例如首先d1
随后找到了-
(作为stdin
指示器,显示d2
因为(< d2
),并与d3
作为参数的最后一个文件继续进行。当然,
cat - d1 d3 < d2
将显示
this is d2
this is d1
this is d3
每个程序在默认情况下连接3个文件描述符。该stdin
,stdout
和stderr
什么程序做与他们,(以及如何)它完全在给定的计划责任。 cat
按照文档中的描述进行设计,例如,它从他的参数打印到stdout
文件(并在内部使用fopen
打开它们,并从打开的描述符中读取文件内容),并在找到-
(或没有参数)时读取stdin
。所以,你的问题:
cat d1 < d2
会发现d1
作为参数,所以猫打开文件d1
并打印出来的内容。而因为这里是不是-
,完全忽略了stdin
而且只打印
this is d1
还要注意,3所默认描述std(in|out|err)
已连接到进程始终。即使启动过程没有的shell。让我们从一些守护进程来说,或者从你的程序直接使用fork/exec
。区别在于:当它从shell启动时,shell已将上述所有描述符连接到您的终端。所以,当你要运行cat
的:
- 壳
fork
S本身(例如,在这里会是两个相同的过程和上同时运行并排侧 - 家长和孩子之间的只有差异。两个是PID
)。 - 分叉进程具有与父进程相同的描述符,例如,它们连接到终端,或者,如果在子shell中进行一些重定向,那么
exec
会将标准描述符替换为给定文件中的描述符。 (见dup(2)
系统调用) - 下一个,孩子被替换为
cat
程序(exec
)
这不是一个shell的问题,但由于方式cat
的行为。
要么cat
:
- 从标准输入(如果没有文件给定参数)
- 从参数读取读取指定的文件
但不同时(在基本行为)。正如您以file2.txt
作为参数cat
仅读取该文件并忽略其标准输入(从file1.txt
重定向)。
存在一个特殊的参数来强制读取标准输入(-
),您必须使用cat
来考虑重定向。
- 1. 用grep -n(数据)FILE1.TXT> FILE2.TXT
- 2. 字符串(FILE1.TXT)从FILE2.TXT
- 3. 在tcsh中,如果文件存在,cat file1.txt> file2.txt不起作用
- 4. 循环中FILE1.TXT在FILE2.TXT的所有行每行比较
- 5. Java无法打印所有从file1.txt到file2.txt的行?
- 6. 提取file1.txt行并使用shell合并到file2.txt?
- 7. 对于如果它存在于FILE2.TXT FILE1.TXT检查每一个字符串,然后做一些事情
- 8. 如何获得字符串变量值从“D:\\ Directory1 \\ file1.txt”到@“D:\ Directory1 \ file1.txt”
- 9. File1 +(File2 - first line)> File3
- 10. 如何在sed中使用变量'3d'../log/file2.txt> ../log/file8.txt
- 11. cmake:if(file1 IS_NEWER_THAN file2)是否损坏?
- 12. 测试file1中的行是否是file2中的行的子集
- 13. 制作浏览器解释TXT为HTML
- 14. 删除内容:file1.csv - file2.csv powershell
- 15. 壳:从FILE1获取一行内容FILE2
- 16. 如何阅读解释\ n的txt文件?
- 17. 如何从.txt文件制作.cat文件
- 18. 如何将file2.pdf中的页面追加到file1.pdf
- 19. 如何从编号的txt文件读取? (data1.txt,data2.txt等)
- 20. 如何解析c#中的txt文件
- 21. 在UNIX中,“cat file1> file1做了什么?”
- 22. 如何使用UNIX查找找到(file1或file2)?
- 23. 从字符串像子文件夹1/file1.txt的子串C
- 24. 解析txt文件
- 25. 解析.txt文件
- 26. 以下是做什么:(一些命令)> file1 file2
- 27. 如何解析txt网络服务
- 28. Ruby:如何在xls中解析txt?
- 29. Java的txt解析器
- 30. 如何从file1中提取行,基于它的/ file1(仅)的第一列与linux中的file2的匹配信息?