Shell脚本无法将文件数据传递给shell输入

时间:2012-04-05 13:42:11

标签: linux shell cat piping

cal April 2012 | cat > t | cat < t | more

为什么没有显示任何内容?为什么不显示

     April 2012       
Su Mo Tu We Th Fr Sa  
 1  2  3  4  5  6  7  
 8  9 10 11 12 13 14  
15 16 17 18 19 20 21  
22 23 24 25 26 27 28  
29 30  

3 个答案:

答案 0 :(得分:5)

|(匿名管道)将第一个进程的stdout(1)与第二个进程的stdin(0)连接起来。将输出重定向到文件后,没有stdout,所以没有什么可以管道。此外,cat | cat < file没有意义,它有两个输入连接到stdin(至少使用bash,重定向稍后出现并且“wins”:echo uiae | cat <somefile将输出somefile的内容)

如果要显示命令的输出,同时将其写入文件,请使用tee二进制文件。它写入文件,但仍写入stdout

cal April 2012 | tee t | more
cat t # content of the above `cal` command

答案 1 :(得分:1)

因为第一个cat > t将其所有输出发送到名为t文件,所以不再为管道留下任何内容。

如果您打算将其发送到文件并通过more发送到终端,请使用:

cal April 2012 | tee t | more

这个| cat < t构造非常奇怪,我甚至不确定它是否会起作用。它试图将两个完全不同的事物连接到cat的标准输入,当然不必要。

答案 2 :(得分:0)

如果当前目录中没有名为t的现有文件,这对我有用。我在Ubuntu Oneiric上使用bash。

$ cal April 2012 | cat > t | cat < t | more
 April 2012       
 Su Mo Tu We Th Fr Sa  
 1  2  3  4  5  6  7  
 8  9 10 11 12 13 14  
 15 16 17 18 19 20 21  
 22 23 24 25 26 27 28  
 29 30
$ cal April 2012 | cat > t | cat < t | more
$ rm t
$ cal April 2012 | cat > t | cat < t | more
 April 2012       
 Su Mo Tu We Th Fr Sa  
 1  2  3  4  5  6  7  
 8  9 10 11 12 13 14  
 15 16 17 18 19 20 21  
 22 23 24 25 26 27 28  
 29 30