我正在用C语言编写一个类似bash的程序,我在这里有一个问题--医生。目前,我的shell只能在第一个命令中执行-doc。
ls | << eof wc
bash结果:
> eof
0 0 0我的结果:
> eof
10 10 63(wc接受ls的结果,我的管道出了问题,但不知道是什么。)
在这种情况下,我可以就像我认为ls不存在一样。
wc | << eof wc
bash结果
> eof
0 0 0在这里,bash首先执行具有here-doc的命令,然后执行第二个命令(它没有输入,因此是冻结的)。
我的结果
> eof我首先像bash一样执行here-doc,eof工作,但是没有结果,然后由于第一个wc而冻结了。
所以我能把所有的病例都这样处理吗?我先用这里的doc执行命令,然后取消其他命令,除非它们不得不崩溃(如果没有输入,就像wc一样)?
发布于 2022-11-29 16:24:50
在POSIX中,重定向(如here-docs )与命令相关联,管道操作符(|)分离命令。因此,这里:
ls | << eof wc
eofhere-doc与第二个命令wc相关联(即使重定向操作符出现在命令名之前)。它将命令的标准输入重定向到here-doc的内容中。管道操作符也会影响第二个命令的标准输入,因此一个重要的问题是最后应用哪种效果,因为这将是有效的效果。POSIX指定用于表单command1 | command2的管道
command1的标准输出应连接到command2的标准输入端。命令的标准输入、标准输出或两者都应视为由管道在之前分配任何由作为命令一部分的重定向运算符指定的重定向。
(强调后加)不管它的价值是什么,巴什医生用他们自己的话说了同样的话。
那么,对于您的示例,here-doc应该替换ls的输出作为wc的输入,就像在Bash处理命令时所做的那样。
在这种情况下,我可以做的就像ls不存在,我认为。 wc的<< eof wc bash结果eof 0 0 0 在这里,bash首先执行具有here-doc的命令,然后执行第二个命令(它没有输入,因此是冻结的)。
不完全同意。它属于第二个wc命令,而不是第一个,所以第一个挂起等待交互输入。你可以通过输入ctrl来使它正常地完成。
更重要的是,如果要忽略ls,那么为什么要使用两个wc命令呢?只需完全删除ls和管道,并使用一个wc命令:
<<eof wc
eof
# OR, equivalently and more conventionally,
wc <<eof
eof所以我能把所有的病例都这样处理吗?我先在这里执行命令doc,然后取消其他命令,除非它们不得不崩溃(比如wc,如果没有输入的话)?
您似乎在尝试创建特定的规则,而不是观察更一般的规则。每个命令都有标准输入、输出和错误,这些输入、输出和错误最初是从主机外壳继承的,或者是由管道操作符指定的。重定向,包括从这里-docs,是单个命令的每个部分,它们的效果应用于该命令的初始标准流分配之上。当多个重定向应用于同一个命令时,它们将从左到右处理。
您不能根据其标准流的状态“取消”命令。他们会对他们所接收的溪流做任何事。这可能根本不算什么,以一个错误结束,或者他们无论如何都会做的事情,以及其他的可能性。shell不知道,所以它不能捷径。
https://stackoverflow.com/questions/74616437
复制相似问题