최종 터미널 후처리 결과만 유지되도록 tput을 사용하여 명령의 출력을 어떻게 "렌더링"할 수 있습니까? [복사]

최종 터미널 후처리 결과만 유지되도록 tput을 사용하여 명령의 출력을 어떻게 "렌더링"할 수 있습니까? [복사]

tput을 사용하여 화면에 무언가를 그리는 스크립트의 출력을 캡처했습니다. cat myoutput을 실행하면 모든 것이 명확해집니다(터미널이 처음부터 다시 해석하는 것처럼 보입니다). 그러나 출력을 편집하거나 파이프할 때 tputclear wait와 같이 많은 ansi 시퀀스와 이전의 모든 항목에 대한 파괴적인 인쇄가 표시됩니다.

최종 "렌더링"만 얻을 수 있도록 후처리하려면 어떻게 해야 합니까?

더 좋은 점은 현재 스크립트를 작성 중이므로 터미널을 제외한 모든 항목을 파일로 인쇄한다는 것입니다.

그리고exec > >(tee /dev/tty)

저장하기 전에 stdout 채널에 모든 것을 "렌더링"하도록 지시하는 방법이 있습니까?

답변1

당신이 원하는 것은 프로그램입니다분명한이러한 터미널은 시퀀스를 제어하고 최종 뷰를 렌더링할 수 있습니다. 그런 다음 그러한 프로그램을 호출합니다.터미널 에뮬레이터. 그 중 일부는 gnome-terminal 또는 alacritty와 같은 셸을 사용하는 프로그램을 시작할 때와 같이 그래픽이며 다른 일부는 주로 헤드가 없습니다.

여기에는 더 오래되었거나 screen더 현대적인 tmux것이 모두 관련됩니다.

  1. "외부" 스크립트를 작성합니다:
    1. 명명된 파이프 만들기
    2. tmux백그라운드에서 "내부" 스크립트(즉, 콘텐츠를 출력하는 스크립트)를 시작하세요.
    3. 외부 스크립트에서 FIFO를 읽습니다(아무것도 기록되지 않기 때문에 차단됩니다).
    4. 읽기가 완료된 후 tmux출력 스크린샷을 표시합니다.
  2. 내부 스크립트에서 Named Pipe에 무언가를 작성하여 스크린샷을 찍고 싶은 상태에 있음을 나타냅니다.

종합해보면 이렇습니다

#!/usr/bin/zsh
# outer script
# SPDX-License-Identifier: WTFPL

# Make a temporary directory
tmpdir="$(mktemp -d)"

# Prepare the FIFO
fifo="${tmpdir}/fifo"
mkfifo "${fifo}"

# Start the inner script in tmux
tmux new-session -d -s "${tmpdir}" -e "FIFO=${fifo}" ./inner-script.sh …
#^   ^           ^  ^------+-----^ ^------+--------^ ^                 ^
#|   |           |         |              |          |                 |
#\------run tmux, the terminal emulator
#    |           |         |              |          |                 |
#    \---in tmux, run the "new-session" command to, well, get a new session
#                |         |              |          |                 |
#                \---detach that session, i.e. *don't* connect it to the current terminal
#                          |              |          |                 |
#                          \--specify the session name. Conveniently, we abuse the name
#                             of our temporary directory, as it's inherently unique
#                                         |          |                 |
#                                         \-- for the started command, set the environment
#                                             variable FIFO to the name of our FIFO
#                                                    |                 |
#                                                    \-- launch your script
#                                                …with its arguments--/

# Wait for something to be written to our FIFO
cat "${fifo}" > /dev/null

# instruct tmux to take a "pane shot"
tmux capture-pane -t "${tmpdir}" -p > "/path/to/capture"
#                 ^------+-----^  ^ ^---------+--------^
#                        |        |           |
#                        \-------------------------------- target (session name as above)
#                                 |           |
#                                 \----------------------- print to stdout
#                                             |
#                                             \----------- redirect stdout to file

# Finally, clean up session and temporary directory
tmux kill-session -t "${tmpdir}"
rm -rf "${tmpdir}"

fifo에 작성한 내용을 추가하기만 하면 됩니다 inner-script.sh(예: ) echo done > "${FIFO}"; sleep 100.

이미 "로깅" 출력이 있는 경우 inner-script.sh다음을 수행할 수 있습니다.cat recording.txt; echo done > "${FIFO}"; sleep 100

관련 정보