我正在做一个C minishell项目,我正在做|
和<
,它们复制了一个管道和一个输入重定向的行为,问题是我不知道如何在bash中复制这个输入的行为:
ls | wc -l < myinputfile.txt
因为它在bash中所做的是提示输出第一个进程的行(ls)和myinputfile.txt的行的总和,所以首先ls | wc -l
是10
,wc -l < myinputfile.txt
是15
,所以输出应该是25
。
对于管道|
,我使用C中的pipe()
函数,并在fork()
的子进程中执行两个进程,如果它检测到<
,我将stdin
更改为dup2(myinputfile, 0)
,因此在前面的示例中,我的输出将是15
,而不是两者之和。为了执行这个进程,我需要使用execve
,这样每个子进程都会在命令执行后立即完成(如果没有错误的话)。我如何像在bash中那样以简单的方式提示输出两者之和呢?
1条答案
按热度按时间qq24tv8q1#
ls | wc -l < myinputfile.txt
的行为恐怕不是您所解释的那样: shell 打开文件myinputfile.txt用于输入,并将输入文件重定向到wc -l
命令,替换为|
设置的管道读取端,该管道读取端被关闭。一方面,
ls
输出到管道(通过printf()
,调用write()
),该管道在读取端关闭,因此它获得SIGPIPE
信号并终止,或者如果它捕获到该信号,则write
系统调用失败并出现EPIPE
错误,导致写入过程退出或继续,具体取决于此时的错误处理。另一方面,
wc -l
读取文件的内容并输出读取的行数。不发生隐式串联。
相反,如果编写
ls & wc -l < myinputfile.txt
,则ls
和wc -l < myinputfile.txt
的输出会以不可预知的方式混合到当前shell输出中。要获得串联输出,可以写入
ls && wc -l < myinputfile.txt
,ls
和wc -l < myinputfile.txt
的输出都得到串联,假设ls
以0
状态退出。