cat 进入标准输入,然后通过管道进入程序,使分叉的 shell 保持打开状态,为什么?

cat 进入标准输入,然后通过管道进入程序,使分叉的 shell 保持打开状态,为什么?

我不确定发生了什么,但我一直在尝试了解输入和输出发生了什么。这是我的程序。

#include <stdio.h>
#include <stdlib.h>
int main(){
    char pass[8];
    fgets(pass, 8, stdin);
    if (pass[1] == 'h'){
        printf("enter shell\n");
        system("/bin/bash");
        printf("leave shell\n");
    }
    return 0;
}

这是一些终端命令。当我定期运行它并输入“hh”时,外壳保持打开状态。

idkanything ~ $ ./a.out
hh
enter shell
bash-3.2$

现在我尝试回显然后管道,但是 shell 立即关闭。

idkanything ~ $ echo "hh" | ./a.out
enter shell
leave shell

所以现在是它起作用的时候了:

idkanything ~ $ cat <(python -c 'print "hh"') - | ./a.out
enter shell
this work
/bin/bash: line 1: this: command not found
leave shell

但是当我省略标准输入的“-”时,它不起作用,因为外壳会立即关闭。

idkanything ~ $ cat <(python -c 'print "hh"') | ./a.out
enter shell
leave shell

当我这里最后有猫时,它也有效。

idkanything ~ $ (python -c 'print "hh"'; cat) | ./a.out
enter shell
this works
/bin/bash: line 1: this: command not found
leave shell

有人可以解释一下发生了什么事吗?哪些命令可以使 shell 保持打开状态?为什么 shell 只对这些命令保持打开状态,而不对其他命令(例如回显“hh”然后通过管道输入)保持打开状态。

我相信这可能与标准输出有关。

答案1

对于“有效”的情况,您将让进程保持运行状态cat正在阅读它是标准输入,尚未关闭。由于该项目(尚未)尚未关闭,cat继续奔跑,离开它是标准输出打开,由 shell 使用(也未关闭)。

相关内容