납치 프롬프트없이 백그라운드 프로세스에서 진행 상황 에코


10

간단한 스크립트를 고려하십시오 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

동작을 어떻게 변경할 수 있습니까?

답변:


13

타이밍 문제입니다 : bash hello는 백그라운드에서 명령을 시작한 다음 새 명령을 입력하라는 프롬프트를 표시 한 다음 background 명령은 일부 출력을 인쇄합니다. 다음 명령 줄 (빈 명령 줄을 입력하면을 누르는 경우 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+ L다시 그리거나 Ctrl+ Alt+ L화면을 지우려면 다음 행을 추가하십시오 ~/.inputrc.

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

bash가 프롬프트 라인을 자동으로 다시 그리는 방법을 모르겠습니다. Zsh는 기본적으로이 기능을 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.