새 터미널을 열거나 새 로그인을 할 때마다 실행되는 명령이 있습니다.
이 프로그램은 명령 프롬프트 앞에 나오는 출력(컬러)을 생성합니다. 실행하는 데 몇 초가 걸릴 수 있으며, 이로 인해 그때까지 터미널을 사용할 수 없게 됩니다(백그라운드에서 실행되지 않는 한).
zsh에는 기존 텍스트를 파괴하지 않고 터미널을 다시 그리는 고급 방법이 있으므로 터미널을 사용하기 전에 완료될 때까지 기다릴 필요 없이 이 명령을 실행하는 방법을 알고 싶습니다. 하지만 일단 완료되면 마치 처음부터 백스테이지가 없었던 것처럼 출력이 인쇄됩니다.
실제로 나는 다음과 같은 일을 하고 싶습니다.
Command output:
... (running on background)
me@computer: somecommand
me@computer: someothercommand
명령이 완료되면 다음을 얻습니다.
Command output:
* Output foo
* Multiple lines bar
* and some yada
me@computer: somecommand
me@computer: someothercommand
시작 시 프로세스를 백그라운드에 넣으려고 했지만 출력이 명확하게 표시되지 않습니다. 나는 다음과 같은 것을 얻습니다 :
Command output:
[2] 32207
me@computer: somecommand
me@computer: someother * Output foo
* Multiple lines bar
* and some yada
[2] + done command
me@computer: someothercommand
그렇다면 이것이 가능합니까? zsh를 사용하지 않고 이를 수행할 수 있는 솔루션이 있습니까?
어떤 지침이나 정보라도 환영합니다.
답변1
현재 프롬프트 줄 위의 출력을 수락하려는 경우 이는 간단한 솔루션입니다.
bufferout () {
local buffer
while IFS= read -r line; do # buffer stdin
buffer="$buffer$line\n"
done
print -rn -- $terminfo[dl1] # delete current line
printf "$buffer" # print buffer
kill -USR1 $$ # send USR1 when done
}
TRAPUSR1 () { # USR1 signal handler
zle -I # invalidate prompt
unhash -f TRAPUSR1 bufferout # remove ourselves
}
./testout 2>&1 | bufferout &! # run in background, disowned
작업이 완료된 후 현재 프롬프트와 입력 버퍼가 삭제되고 stdout
전체 명령의 합계가 인쇄됩니다.stderr
이는 한 번만 실행되고 나중에 자체적으로 삭제된다고 가정합니다. unhash -f
동일한 셸에서 이 기능을 계속 재사용하려면 TRAPUSR1
.
이 답변에는 다음이 포함됩니다.의견에서 Clint Priest가 제안한 개선 사항. 감사해요!