catは標準入力に移動し、プログラムにパイプを接続して分岐シェルを開いたままにします。なぜですか?

catは標準入力に移動し、プログラムにパイプを接続して分岐シェルを開いたままにします。なぜですか?

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

#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に関連していると思います。

ベストアンサー1

「有効な」場合は、プロセスを実行状態のままにしてください。cat読書それ標準入力が閉じていません。 (まだ)プロジェクトが終了していないため、cat走り続けて、去るそれ標準出力はシェルで使用するために開きます(閉じていません)。

おすすめ記事