![백그라운드 프로세스에서 $(tty)를 에코합니다.](https://linux55.com/image/206777/%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%97%90%EC%84%9C%20%24(tty)%EB%A5%BC%20%EC%97%90%EC%BD%94%ED%95%A9%EB%8B%88%EB%8B%A4..png)
왜 아무것도 인쇄되지 않습니까?
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/pty0
not 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
달성하려는 목표에 따라 를 사용 하거나 출력을 전혀 리디렉션하지 않는 것을 고려할 수도 있습니다 .