Shell 终端中的猫似乎表现出不规则的随机行为

Shell 终端中的猫似乎表现出不规则的随机行为,shell,terminal,cat,Shell,Terminal,Cat,我有一个文件,包含以下内容: 2) Wiegley Maths 90 3) Artur Biology 87 4) Drew English 85 5) Phils History 89 我将它存储在一个名为marks.txt的文件中 在shell中,我使用sed和awk(使用xfce4终端仿真器)运行了一些操作 当我快速执行相同的命令时(向上箭头并回车),它有时会给我文件foo.txt的输出。但有时当我快速重复

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

2)    Wiegley   Maths      90
3)    Artur     Biology    87
4)    Drew      English    85
5)    Phils     History    89
我将它存储在一个名为
marks.txt
的文件中

在shell中,我使用
sed
awk
(使用xfce4终端仿真器)运行了一些操作

当我快速执行相同的命令时(向上箭头并回车),它有时会给我文件
foo.txt
的输出。但有时当我快速重复同一个命令时,它不会给我任何输出


我无法从我的外壳中理解这一点,这似乎是一种随机行为。有人能解释为什么当我快速重复同一命令时,
cat
有时会给出输出吗?它不是先等待
awk
sed
的输出吗?

cat
的管道是没有意义的,因为您没有通过它传递任何数据,也没有尝试使用它(为此,您将使用
cat-

您的命令将打开三个子shell。中间的<代码> <代码>将在等待任何输入之前截断文件<代码> fo.txt<代码>。code>cat 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

开头的任何行的第三个和第四个字段。您的问题似乎与管道和重定向之间的优先级有关

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

发件人:

您可以在这里找到一些示例:


您希望cat foo.txt做什么?这几乎肯定是错的。@Tom我不是说对错。我试图理解为什么终端有时会显示输出,而在命令相同的情况下,有时不会显示输出。你可以试一下,然后你就明白我的意思了。谢谢你的回复。当
试图截断文件
foo.txt
时,我如何“测量”或检测
cat foo.txt
是否正在访问文件
foo.txt
?在我看来,有时
cat
命令在输出被写入之前就出现了。我想了解在哪种情况下,
cat
会更早。您基本上要求三个程序同时运行,而操作系统正试图满足这一要求。我不确定输出是否可以可靠地预测。您可以使用另一个工具来执行此操作,但在运行此操作时,它可能已经关闭。
awk -v OFS='\t' '$3 !~ /^E/ { print $3, $4 }' marks.txt | tee foo.txt