【问题标题】:Cat in terminal seems to behave erratically random终端中的猫似乎表现得异常随机
【发布时间】:2016-07-13 01:44:50
【问题描述】:

我有一个文件,内容如下:

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 的输出。但有时在快速重复相同的命令时它没有给我任何输出。

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

【问题讨论】:

  • 期待| cat foo.txt 做什么?这几乎肯定是错误的。
  • @Tom 我不是在谈论正确或错误。我试图理解为什么终端有时会显示输出,有时在命令相同时不显示。随意尝试一下,然后你就明白我的意思了。

标签: shell terminal cat


【解决方案1】:

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 开头的任何行的第三个和第四个字段。

【讨论】:

  • 感谢您的回复。如果cat foo.txt 正在访问文件foo.txt,而> 正在尝试截断文件foo.txt,我如何“测量”/检测?在我看来,有时cat 命令在输出被写入之前更早。我想了解cat在什么情况下更早。
  • 您基本上是在要求三个程序同时运行,而操作系统正试图满足该请求。我不确定是否可以以任何可靠的方式预测输出。您可以使用另一个工具来detect whether the file is open,但到它运行时,它很可能已经关闭。
【解决方案2】:

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

将命令行拆分为管道命令在之前完成 文件重定向。文件重定向第二次发生,如果存在, 优先于管道重定向。 (文件重定向总是 赢了。)

发件人:http://www.cs.colostate.edu/~mcrob/toolbox/unix/redirection

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

Pipe | Redirection < > Precedence

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2013-08-07
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2012-04-28
    相关资源
    最近更新 更多