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


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.