2017-04-15 24 views

回答

1

它的工作原理,因为它预计:

cat命令按顺序读取文件,将它们写入标准输出为 。文件操作数按命令行顺序处理 。如果文件是单个短划线(` - ')或不存在,则cat从标准输入中读取。

创建一些演示文件:

for i in 1 2 3; do echo this is d$i > d$i; done 

cat d1显示

this is d1 

这是你有什么期望 - 在d1cat的说法。该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个文件描述符。该stdinstdoutstderr什么程序与他们,(以及如何)它完全在给定的计划责任。 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
0

这不是一个shell的问题,但由于方式cat的行为。

要么cat

  1. 从标准输入(如果没有文件给定参数)
  2. 从参数读取读取指定的文件

但不同时(在基本行为)。正如您以file2.txt作为参数cat仅读取该文件并忽略其标准输入(从file1.txt重定向)。

存在一个特殊的参数来强制读取标准输入(-),您必须使用cat来考虑重定向。

相关问题