이전 명령이 여전히 포그라운드에서 실행 중인 동안 명령을 입력할 수 있도록 허용하는 것은 무엇입니까?

이전 명령이 여전히 포그라운드에서 실행 중인 동안 명령을 입력할 수 있도록 허용하는 것은 무엇입니까?

때로는 프로그램(예: A)이 포그라운드에서 실행되고 해당 출력을 stdout으로 인쇄할 때 다른 명령(예: )을 입력하면 해당 명령을 누르면 실행됩니다 . B그때부터 Enter입력하라는 메시지가 표시되지 않고 BA아직 실행되지 않았습니다. tcsh 쉘에서 이 작업을 수행할 수 있으며 최종 결과 BA.

이 기능을 뭐라고 부르나요? 이 쉘에 특정한 것이 있습니까? 프롬프트에 명령을 입력하지 않으면 어떻게 작동하나요?

답변1

이것은 ... 불리운다미리 입력하세요, 이는 쉘에만 국한되지 않습니다. 입력한 내용은 결국 터미널에 버퍼링되며, 다음에 터미널에서 실행 중인 프로그램이 입력 준비가 되면 버퍼에 대기 중인 내용을 읽습니다. 귀하의 예에서 프로그램은 셸이므로 A입력하기 전에 완료되기를 기다리는 것처럼 입력한 명령을 실행합니다.

일부 프로그램은 입력을 받아들이기 전에 명시적으로 버퍼를 지웁니다. 예를 들어, 암호를 요구하는 대부분의 프로그램은 사용자가 입력된 내용을 알 수 있도록 버퍼를 지웁니다(입력이 에코되지 않기 때문).

답변2

설명하신 내용은 실제로 프로그램 A가 백그라운드에서 실행되는 것 같습니다. 프로세스가 백그라운드에서 실행 중이더라도 여전히 터미널에 인쇄할 수 있습니다.

배쉬 예시:

#----background_program----#
#!/bin/bash

for ((i=0;i<=10;i++)); do
    echo "$i"
    sleep 5
done

exit 0

백그라운드에서 실행하고 터미널에서 출력 팝업을 볼 수 있습니다. 첫 번째 출력 메시지 후에 커서가 프롬프트 밖으로 이동합니다. 그런 다음 background_program실행하는 동안 포그라운드에서 다른 명령을 실행할 수 있습니다 .

./background_program &     # '&' to put in background
echo "wut"
echo "foo"
echo "bar"

그러면 다음과 같은 내용이 제공됩니다.

sandbox@Dionysus:~$ ./background_program &
[1] 6197
sandbox@Dionysus:~$ 0
echo "wut"
wut
sandbox@Dionysus:~$ 1
echo "foo"
foo
sandbox@Dionysus:~$ 2
echo "bar"
bar
sandbox@Dionysus:~$ 3
4
5
6
7
8
9
10

gnome 터미널에서 이 작업을 수행했지만 이러한 동작이 드문 일은 아니라고 생각합니다.

프로그램 A를 전경에서 실행한다면 @Stephen이 말한 내용을 미리 입력해 얻을 수 있습니다. 명령이 버퍼에 로드되고 프로그램 A가 완료된 후 해석되면 프로그램이 실행되지 않습니다.

관련 정보