如何从C#向Cygwin管道写入数据

8
我希望创建一个C#应用程序,可以在cygwin管道中使用"tail -f"命令。
例如:
tail -f SomeFile | MyCSharpApp 我可以看到(从调试中),我能够正确读取stdinput,但是没有任何东西写回到cygwin终端窗口。
然而,
tail -n10 SomeFile | MyCSharpApp 完美地工作。
class Program
{
    static void Main(string[] args)
    {

        string s;
        while ((s = Console.ReadLine()) != null)
        {
           //Potentially process s here
           Console.WriteLine(s);
        }
    }
}

所以这不是C#的问题。 - Marco Salerno
@MarcoSalerno 我认为是这样的。当我不将我的应用程序包含在管道中时,tail -f 和 tail -n10 都可以正常工作。 - ManInMoon
Cygwin,哦,好的上帝啊。先将所有输入读入,这样就不会在管道缓冲区大小上发生死锁。 - Hans Passant
@HansPassant,您能建议我如何使用Tail -f实现连续输出吗? - ManInMoon
我对你帖子中的这句话感到困惑:“我可以看到(通过调试),我能够正确读取stdinput,但是没有任何东西被写回cygwin终端窗口。”当你说你能够正确读取stdin时,你是指什么?Console.ReadLine返回信息吗?出于好奇,你尝试过使用Console.Read而不是Console.ReadLine吗? - SeeJayBee
我的意思是,如果我使用VS调试器逐步执行,我可以看到循环中的每一行代码。ReadLine是有效的,只是输出有问题。 - ManInMoon
2个回答

0

目前 SomeFile 的情况还不太清楚。 tail -f SomeFile 打开了 SomeFile 文件描述符并监视它。如果描述符发生了变化,例如你在记事本中打开文件并点击“保存”,那么就不会被监视到任何内容。这是因为记事本会删除该文件并使用相同的名称写入新文件。我建议尝试使用 tail -F SomeFile-F 重新打开文件描述符。


我已经尝试了两种方法 - 问题依旧。该文件是一个不断更新的日志文件。 - ManInMoon

0

编辑:这个答案关于问题的相反方面写错了。也就是说,它是为尝试myApp > tail -f而不是tail -f file.txt > myApp而编写的。

tail -f适用于文件而不是管道。我能想到的唯一方法来输出另一个命令的输出是使用tail -F <(ls -lthr),其中ls -lthr可以是任何打印输出的命令。

让我们思考一下为什么会这样。 tail 打印文件的内容(特别是最后几行)。 如果您有将内容打印到控制台或标准输出的能力,则不需要tail

补充:此外,如果您决定需要将输出输出到文件中,则可以简单地使用> file.txt将该控制台输出放入文件中。


我需要使用tail命令,因为这是一个不断更新的日志文件。 - ManInMoon
@ManInMoon,不知怎么的,我完全误解了你的意图。我以为你试图通过tail输出而不是通过tail输入。你尝试做的问题在于管道将数据作为参数传递给下一个命令。这只会发生一次,而不是持续进行。对于你的应用程序来说,定期检查文件是否有更改可能是一个更好的主意。一旦你知道了上一次检查的最后一行号码,那么你就可以从下一行开始。我从未见过任何建议要将“tail -f”输出导入管道。 - Xander YzWich
看一下这个似乎回答了真正问题的问题:https://superuser.com/questions/742238/piping-tail-f-into-awk - Xander YzWich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接