我怎么能复制“ls”的功能|wc -l〈myinputfile.txt”在C中的bash?

3bygqnnd  于 2023-02-15  发布在  其他
关注(0)|答案(1)|浏览(121)

我正在做一个C minishell项目,我正在做|<,它们复制了一个管道和一个输入重定向的行为,问题是我不知道如何在bash中复制这个输入的行为:

ls | wc -l < myinputfile.txt

因为它在bash中所做的是提示输出第一个进程的行(ls)和myinputfile.txt的行的总和,所以首先ls | wc -l10wc -l < myinputfile.txt15,所以输出应该是25
对于管道|,我使用C中的pipe()函数,并在fork()的子进程中执行两个进程,如果它检测到<,我将stdin更改为dup2(myinputfile, 0),因此在前面的示例中,我的输出将是15,而不是两者之和。为了执行这个进程,我需要使用execve,这样每个子进程都会在命令执行后立即完成(如果没有错误的话)。我如何像在bash中那样以简单的方式提示输出两者之和呢?

qq24tv8q

qq24tv8q1#

ls | wc -l < myinputfile.txt的行为恐怕不是您所解释的那样: shell 打开文件myinputfile.txt用于输入,并将输入文件重定向到wc -l命令,替换为|设置的管道读取端,该管道读取端被关闭。
一方面,ls输出到管道(通过printf(),调用write()),该管道在读取端关闭,因此它获得SIGPIPE信号并终止,或者如果它捕获到该信号,则write系统调用失败并出现EPIPE错误,导致写入过程退出或继续,具体取决于此时的错误处理。
另一方面,wc -l读取文件的内容并输出读取的行数。
不发生隐式串联。
相反,如果编写ls & wc -l < myinputfile.txt,则lswc -l < myinputfile.txt的输出会以不可预知的方式混合到当前shell输出中。
要获得串联输出,可以写入ls && wc -l < myinputfile.txtlswc -l < myinputfile.txt的输出都得到串联,假设ls0状态退出。

相关问题