하이재킹 프롬프트 없이 백그라운드 프로세스의 진행 상황을 에코합니다.

하이재킹 프롬프트 없이 백그라운드 프로세스의 진행 상황을 에코합니다.

간단한 스크립트를 고려해보세요 hello.

#!/bin/bash

echo 'hello world!'

이제 bash에서 백그라운드로 실행하려고 하면 다음과 같습니다.

$ hello &
[1] 12345
$ hello world!
█ <--- prompt is stuck here until I hit enter!
[1]+ Done
$ █ <--- prompt back to normal

내가 보고 싶은 것은 다음과 같습니다.

$ hello &
[1] 12345
[1]+ hello world!
[1]+ Done
$ █ <--- prompt normal the whole time

이 동작을 어떻게 바꿀 수 있나요?

답변1

타이밍의 문제입니다. bash는 hello백그라운드에서 명령을 시작한 다음 새 명령을 입력하라는 프롬프트를 표시하고 백그라운드 명령이 일부 출력을 인쇄합니다. 다음 명령줄(만 누르면 빈 명령줄 Enter)을 입력하면 bash는 백그라운드 작업이 완료되었다는 알림을 표시한 후 다음 프롬프트를 표시합니다.

다음으로 시작하는 스크립트를 시도해보고 sleep 3스크립트가 백그라운드에서 실행되자마자 입력을 시작하여 따라갈 수 있는 속도로 무슨 일이 일어나는지 확인하는 것이 좋습니다.

notify옵션을 설정하여 백그라운드 작업이 종료되면 bash가 즉시 알림을 받도록 할 수 있습니다.set -b. 그러면 다음이 표시됩니다.

$ set -b
$ hello &
[1] 12345
$ hello world!
[1]+ Done

이 경우 Bash는 프롬프트를 다시 그리지 않습니다. 스풀 작업이 인쇄되기 전에 나타난 프롬프트에서 여전히 명령줄을 편집하고 있습니다 hello world!. Esc 1 Ctrl+ 를 눌러 현재 줄을 다시 그릴 수 있습니다 L. 명령을 redraw-current-line보다 편리한 키에 바인딩할 수 있습니다. 예를 들어 현재 줄을 Ctrl다시 그리고 화면을 지우려면 다음 줄을 에 추가하세요 .LCtrlAltL~/.inputrc

"\C-l": redraw-current-line
"\e\C-l": clear-screen

bash가 자동으로 프롬프트 줄을 다시 그리도록 하는 방법을 모르겠습니다. Zsh는 기본적으로 이를 수행합니다.

관련 정보