何が起こっているのかはわかりませんが、入力と出力で何が起こっているのかを理解しようとしています。これが私のプログラムです。
#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と関係があるのではないかと思います。
「機能する」場合は、実行中のプロセスを残しますcat
読み取り中itsクローズされていない標準入力。これは(まだ)閉じられていないため、cat
は引き続き実行され、its標準出力を開いたままにします。シェルによって使用されます(これも閉じていません)。