Pipe方法父进程执行失败,wc命令报无效选项错误求助
这问题我之前调试迷你shell实现时也碰到过类似的,结合你给出的报错信息,大概率是命令参数拆分或管道进程的参数传递环节出了问题,给你几个具体的排查方向:
先检查
wc进程的参数列表
你可以在代码里加个调试输出,把传给wc的argv数组每个元素都打印出来,看看有没有空字符串("")、多余的横杠(比如"-")或者奇怪的垃圾值。报错里的invalid option --''说明wc接收到了一个空的选项参数,很大概率是你的令牌拆分逻辑在处理管道前后的空格时,生成了空令牌,然后被塞进了wc的参数列表里。比如拆分ls -l | wc -l时,不小心把管道前后的空格拆成了空字符串,最后wc的argv变成了["wc", "-l", ""],这时候wc会把空字符串当成参数解析,就可能触发这个错误。验证令牌拆分逻辑是否正确处理了管道符号
你的execstring方法是不是把管道符号|也当成了普通令牌?正常来说,解析带管道的命令时,应该把|作为分隔符,将整个命令拆成左右两个独立的命令单元(ls -l和wc -l),而不是把|作为某个命令的参数。如果错误地把|传给了wc,报错会是wc: |: No such file or directory,和当前报错不符,但还是要确认拆分逻辑是否正确分割了两个命令。检查
exec系列函数的参数是否符合要求
用execvp或类似函数时,argv数组必须以NULL结尾,否则函数会读取内存中后续的垃圾数据,这些垃圾数据可能被解析成奇怪的参数(比如空字符串或无效选项)。你可以检查一下传递给wc的argv最后有没有正确设置为NULL,这是很容易忽略的细节。确认管道进程的IO重定向是否正确
虽然报错是参数问题,但可以顺便检查管道的IO处理:fork子进程执行ls后,父进程要关闭管道的写端,然后把自己的标准输入重定向到管道的读端,再执行wc。如果写端没关闭,wc可能会一直等待输入,但不会触发参数错误,这个概率相对低,但也是shell实现里容易踩的坑。
内容的提问来源于stack exchange,提问作者Zeedig

