web-dev-qa-db-ja.com

catをstdinに入れ、次にプログラムにパイプすると、フォークされたシェルが開いたままになりますが、なぜですか?

何が起こっているのかはわかりませんが、入力と出力で何が起こっているのかを理解しようとしています。これが私のプログラムです。

#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$

エコーしてからパイプしようとすると、シェルがすぐに閉じます。

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

しかし、stdinの「-」を省略した場合、シェルがすぐに閉じるように機能しません。

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

誰かが何が起こっているのか説明できますか?シェルが開いたままになるように機能するコマンドについて具体的にはどうですか?シェルがこれらのコマンドに対してのみ開いたままで、「hh」をエコーし​​てからパイプするような他のコマンドでは開いていないのはなぜですか。

Stdoutと関係があるのではないかと思います。

4
whoami

「機能する」場合は、実行中のプロセスを残しますcat読み取り中itsクローズされていない標準入力。これは(まだ)閉じられていないため、catは引き続き実行され、its標準出力を開いたままにします。シェルによって使用されます(これも閉じていません)。

5
Thomas Dickey