我有一些C代码叫做c-shell,它执行以下操作。父c-shell在Linux命令行中读取,并分叉子进程以执行该命令。孩子不会执行命令,直到它收到来自父母的信号,表示它已准备好执行命令。它可以处理用于给命令参数的输入文件,或者它可以从命令行读取它们。它可以处理发送输出到输出文件,而不仅仅是将执行的命令输出打印到标准输出。它将输出发送到输出文件的方式是由孩子将其stdout重定向到一个管道,并且一旦它接收到子进程完成运行的sig-child信号,父进程就从该管道读取数据。它可以处理多个命令(在命令之间放置分号的地方)。它可以将第一个命令的管道输出处理为命令行中的第二个命令。然而 - 这是我的问题 - 它不能处理一个命令,你将一个命令的输出作为第二个命令的输入,然后将第二个命令的输出发送到输出文件。我感到困惑,因为所有上述情况都很好。我可以将输出从执行的子进程重定向到父进程完成后,以便它可以完成它。我可以将运行的第一个命令的输出重定向为第二个运行命令的输入。但是如果我尝试将输出发送到第二个命令到输出文件,我不能这样做。如果这个问题没有意义,我会发表更多细节。Linux操作系统 - 父,子,父进程的输入输出管道
例如:如果我进入我的c-shell下面的命令行:ls -l | grep lsOut(意思是,我做了一个详细的目录列表,并且在该目录列表输出中,有一些文件包含字符“lsOut”(来自ls命令的输出文件),并且grep命令应该过滤掉所有其他文件在不包含这些字符的目录列表中,当它打印到标准输出时工作得很好,当我执行如下命令时:ps> psOut,ps命令的输出写入psOut文件没有问题,但是,如果我执行以下命令:ls -l | grep lsOut> lsOutFile,会发生什么令人困惑的事情,它将第一个命令ls -l输出到stdout,虽然我在打印语句中看到第二个命令grep lsOut正在运行,并且应该接收来自ls -l的输出作为grep lsOut的输入,它似乎没有任何影响。唯一的输出是整个ls -l目录,没有grep过滤,尽管它说它将它写入输出文件,它不会到达那里,如果你想让我发布一个代码链接,我可以做到这一点非常感谢!我花了数小时试图调试这个问题。
墙上的文字,难以阅读,与您的实际问题在中间的某个地方。您可能需要使用更多段落。 – Evert
有没有订单问题:'ls -l | grep lsOut> lsOutFile'评估为'ls -l | (grep lsOut> lsOutFile)'而不是'(ls -l | grep lsOut)> lsOutFile'? (括号可能只是为了排序,而不是为了任何其他含义。) – Evert
不解析'ls' http://mywiki.wooledge.org/ParsingLs – jkdba