백그라운드 프로세스에서 $(tty)를 에코합니다.

백그라운드 프로세스에서 $(tty)를 에코합니다.

왜 아무것도 인쇄되지 않습니까?

bash -c '(while echo "not printing" ; do sleep 1; done) > "$(tty)" & sleep 10'

예를 들면 다음과 같습니다.

bash -c '(while echo "is printing" ; do sleep 1; done) > "$(tty)" && true'

답변1

첫 번째 명령을 실행하고 임시 디렉터리에서 실행해 보겠습니다.

mkdir eg1    # Create temporary directory
cd eg1       # ...and change to it
ls           # No output (obviously, no files)

bash -c '(while echo "not printing" ; do sleep 1; done) > "$(tty)" & sleep 10'

하지만 이제 목차를 살펴보세요.

ls -l
-rw-r--r--+ 1 roaima roaima 1040 Jun  6 23:05 not a tty

여기서 일어나는 일은 터미널이 연결된 상태에서 실행될 때 tty등 명령이 터미널 장치에 보고되고 , 다른 경우에는 메시지가 표시된다는 것입니다. background()에서 하위 쉘로 실행 되면 터미널 장치가 없으므로 출력이 ./dev/pty0not a tty&( … )not a tty

이제 두 번째 경우에는 하위 쉘이 백그라운드에서 실행되지 않는다는 점을 제외하면 모든 것이 매우 유사합니다.

bash -c '(while echo "is printing" ; do sleep 1; done) > "$(tty)" && true'

이 경우 tty포그라운드에서 실행되며 현재 터미널의 장치 이름을 반환할 수 있으므로 화면에서 출력을 볼 수 있습니다.

이는 &&논리적 커넥터이며 두 번째 명령은 첫 번째 명령이 "성공"(값 0) 종료 상태를 반환하는 경우에만 실행됩니다. &이전 명령이 백그라운드에서 독립적으로 실행되도록 지시하는 this 와 혼동하지 마십시오 .

# Run the ( ... ) in the background concurrently with the foreground process
( sleep 1; echo background ) & echo foreground; wait

[1] 32301
foreground
background
[1]+  Done                    ( sleep 1; echo background )

# Run the ( ... ) and then if it's successful execute the next statement
( sleep 1; echo background ) && echo foreground; wait

background
foreground

/dev/tty달성하려는 목표에 따라 를 사용 하거나 출력을 전혀 리디렉션하지 않는 것을 고려할 수도 있습니다 .

관련 정보