비슷한 bash 명령이 왜 이렇게 작동하는지 궁금합니다.
Bash 스크립트가 있습니다 foo
.
#!/usr/bin/env bash
while true
do
echo "reading"
read data
echo $data
echo "stderr msg" >&2
sleep 1
done
이는 stdin에서 한 번에 한 줄씩 읽고 동일한 줄을 출력하는 무한 루프입니다. bash 스크립트도 있습니다 bar
.
#!/usr/bin/env bash
./foo &
다음 명령은 bash
Ubuntu 18.04의 터미널(v.4.4.19)에서 실행됩니다(스크립트가 작업 디렉터리에 있다고 가정).
./foo &
다음에 따라 표준 입력에서 읽으려고 하면 중지됩니다.이 답변.
예상대로 제어 터미널이 종료되면 종료됩니다.
(./foo &)
새로운 입력은 표준 입력에서 자동으로 지속적으로 제공되는 것 같습니다. 표준 입력에서 읽으려고 할 때 멈춰야 하지 않나요? 무엇을 얻든 에코될 때 표시되지 않으므로 EOF 문자인 것으로 추측됩니다.
제어 터미널이 종료된 후에도 계속 실행됩니다. 출력을 보려면
ps
제어 터미널이 pts/에서 다음으로 변경됩니다.엑스도착하다? . or 를 사용하지 않고disown
어떻게 이런 일이 발생합니까nohup
? (그러나 원래 제어 터미널을 죽인 후 쓸 때마다 "쓰기 오류: 입출력 오류"가 발생하는데, 그 표준 출력이 이제 닫힌 터미널과 연결되어 있기 때문인 것 같습니다. 그렇죠?)
bash -c "./foo &"
동작은 2)와 정확히 동일한 것 같습니다.
./bar
2), 3)과 정확히 같습니다.
시작 응용 프로그램으로 추가
bash -c "~/foo"
(아니요 )&
동작은 2), 3), 4)와 유사하지만 다음과 같은 차이점이 있습니다.
- 제어 터미널은 데스크톱 tty입니다.엑스.
- 당신은 제어 터미널을 죽일 수 없습니다.
차이점은 나에게 놀라운 것이 아니며 단지 지속적으로 새로운 입력이 주입되고 있다는 것입니다.
내 생각에는 2) - 5) 모두 stdin이 비슷한 것으로 리디렉션되는 일종의 서브 쉘을 사용 /dev/null
하지만 확실하지 않고 더 정확한 답변을 찾고 있습니다.
답변1
&
쉘에서 실행할 명령아니요활성화된 작업 제어(예: 스크립트 또는 (...)
하위 셸에서)의 표준 입력은 에서 /dev/null
리디렉션 SIGINT
되고 SIGQUIT
로 설정됩니다 SIG_IGN
. susv4에서기준:
작업 제어가 비활성화된 경우(참조
set
)-m
비동기 목록의 표준 입력은 명시적 리디렉션이 수행되기 전에 동일한 속성을 가진 파일에 할당된 것처럼 처리되어야 합니다/dev/null
. 작업 제어가 활성화된 경우에는 이런 일이 발생하지 않습니다. 모든 경우에 표준 입력의 명시적인 리디렉션이 이 활동을 재정의해야 합니다.
귀하의 스크립트가 데이터를 "지속적으로 입력"하는 것이 올바르지 않습니다. ./foo
읽으려고 할 때 EOF를 수신합니다. /dev/null
확인해야 합니다 read
.
답변2
하위 쉘은 비대화형입니다. 대화형 쉘만 자동으로 종료됩니다.