Bash 자체의 출력은 어디로 가나요?

Bash 자체의 출력은 어디로 가나요?

sleep 100&스크립트의 경우 명령 다음에 쉘에 나타나는 "[1]00000" 메시지를 리디렉션하고 싶습니다 . 더 이상 필요하지 않지만 이 문제를 해결하는 동안 Bash 자체의 출력은 어디로 가는지 생각하기 시작했습니다. 왜 bash > test, bash &> test아니면 bash | [some program]작동하지 않습니까? 파일 디스크립터 1과 2는 단지 터미널에 쓰여질 파일 디스크립터겠죠? 그렇다면 bash나 다른 프로그램이 사용자에게 인쇄하려는 경우 어떻게 표준 출력을 우회합니까?

답변1

메시지는 stderr로 전송되었지만배쉬의명령의 stderr이 아닌 stderr이므로 명령의 출력 및 오류를 리디렉션해도 영향을 받지 않습니다.

이를 설명하기 위해 명령 그룹의 stderr을 리디렉션하여 메시지를 리디렉션할 수 있습니다.

$ { sleep 100& } 2>test
$ more test
[1] 94358
$ 
$ 
$ # Then, 100 seconds later:
[1]+  Done                    sleep 100
$ 

"완료"와 같은 상태 메시지를 원하지 않는 경우(그리고 해당 메시지가 일반적으로 표시되는 상황에 있는 경우) disown백그라운드 작업을 수행할 수 있습니다.

$ { sleep 10& disown $!; } 2>test
$ more test
[1] 94400
$ 
$ # After 10 seconds:
$ 

답변2

상호 작용하는 기능을 작업 제어라고 합니다. POSIX 표준화된 API 함수를 기반으로 합니다.

작업 제어는 터미널 세션을 중심으로 구성됩니다. 작업 제어 셸(이 경우 Bash)은 세션의 "교통 경찰"입니다. 작업 제어의 포그라운드에 있는 프로세스 그룹과 백그라운드에 있는 프로세스 그룹을 제어합니다. 동일한 셸은 >, 등 의 구문을 사용할 때 모든 간접 참조도 정렬합니다. 쉘이 터미널에 뭔가를 출력하고 싶을 때, 보스이기 때문에 쉽게 할 수 있습니다.<|

특정 명령이 전경에서 실행되면 쉘은 배경에 놓입니다. 그 순간에는 모든 것이 조용해진다. 쉘은 포그라운드에 있을 때 정보 메시지를 배치합니다. 예를 들어 현재 포그라운드에 있는 프로그램에 - 를 실행하면 Ctrl다음과 같은 메시지가 표시됩니다.Z

[1]+  Stopped                 vi

메시지를 인쇄하기 전에 Bash는 먼저 프로그램을 배경에 두고 자신을 전경에 놓습니다. 그런 다음 "TTY 스틱을 보유"합니다. 터미널에서 입력을 받아 터미널에 쓸 수 있습니다. 이때 작업 제어와 관련된 정보 메시지를 인쇄합니다.

리디렉션은 셸 자체에서 이러한 메시지를 캡처하지 않습니다. 작업 1이 백그라운드에서 실행 중이고 pid 가 있음을 나타내는 메시지를 입력하면 해당 메시지 command > file &는 입력되지 않습니다. 이는 말이 되지 않습니다. 쉘은 이에 대한 리디렉션만 정렬합니다. 쉘 자체는 터미널의 파일 설명자를 저장하고 메시지를 보냅니다.[1] nnnnnnnnnnfile> filecommand[1] ...

관련 정보