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계속 달려, 떠나그것은표준 출력은 쉘에서 사용하기 위해 열립니다(또한 닫히지 않음).

관련 정보