终端中的猫似乎行为不规律

时间:2016-03-25 09:50:41

标签: shell terminal cat

我有一个文件,其中包含以下内容:

2)    Wiegley   Maths      90
3)    Artur     Biology    87
4)    Drew      English    85
5)    Phils     History    89

我将其存储在名为marks.txt的文件中。

在shell中,我使用sedawk(使用xfce4终端模拟器)运行了一些操作

awk '{print $3 "\t" $4}' marks.txt | sed -e '/^E/d' > foo.txt | cat foo.txt

当我快速执行相同的命令(向上箭头并输入)时,它有时会为我提供文件foo.txt的输出。但有时候,当快速重复相同的命令时,它不会给我输出。

我无法理解这一点,它看起来像是一个随机行为,来自我的shell。当我快速重复相同的命令时,有人可以解释为什么cat有时会提供输出吗?是不是会先等待awksed的输出?

2 个答案:

答案 0 :(得分:2)

cat的管道没有意义,因为您没有在其中传递任何数据,或尝试使用它(为此,您将使用cat -)。

您的命令会打开三个子shell。中间的>将在等待任何输入之前截断文件foo.txtcat foo.txt会在或多或少的同时尝试访问foo.txt文件。根据首先发生的这两件事中的哪一件,foo.txt将包含上次运行命令时的内容,或者它将为空。

对于记录,您的命令最好写成:

awk -v OFS='\t' '$3 !~ /^E/ { print $3, $4 }' marks.txt > foo.txt

如果您想将结果打印到标准输出并同时写入文件,一个选项是使用tee

awk -v OFS='\t' '$3 !~ /^E/ { print $3, $4 }' marks.txt | tee foo.txt

这将打印第三个字段不以E开头的任何行的第三个和第四个字段。

答案 1 :(得分:1)

您的问题似乎与管道和重定向之间的优先级有关。

  

在之前完成将命令行拆分为管道命令   文件重定向。文件重定向发生在第二个,如果存在,   优先于管道重定向。 (文件重定向始终   胜。)

来自:http://www.cs.colostate.edu/~mcrob/toolbox/unix/redirection

你可以在这里找到一些例子:

Pipe | Redirection < > Precedence