터미널의 특정 위치에 백그라운드 프로세스의 표준 출력을 표시합니다.

터미널의 특정 위치에 백그라운드 프로세스의 표준 출력을 표시합니다.

새 터미널을 열거나 새 로그인을 할 때마다 실행되는 명령이 있습니다.

이 프로그램은 명령 프롬프트 앞에 나오는 출력(컬러)을 생성합니다. 실행하는 데 몇 초가 걸릴 수 있으며, 이로 인해 그때까지 터미널을 사용할 수 없게 됩니다(백그라운드에서 실행되지 않는 한).

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가 제안한 개선 사항. 감사해요!

관련 정보