tput을 사용하여 화면에 무언가를 그리는 스크립트의 출력을 캡처했습니다. cat myoutput을 실행하면 모든 것이 명확해집니다(터미널이 처음부터 다시 해석하는 것처럼 보입니다). 그러나 출력을 편집하거나 파이프할 때 tputclear wait와 같이 많은 ansi 시퀀스와 이전의 모든 항목에 대한 파괴적인 인쇄가 표시됩니다.
최종 "렌더링"만 얻을 수 있도록 후처리하려면 어떻게 해야 합니까?
더 좋은 점은 현재 스크립트를 작성 중이므로 터미널을 제외한 모든 항목을 파일로 인쇄한다는 것입니다.
그리고exec > >(tee /dev/tty)
저장하기 전에 stdout 채널에 모든 것을 "렌더링"하도록 지시하는 방법이 있습니까?
답변1
당신이 원하는 것은 프로그램입니다분명한이러한 터미널은 시퀀스를 제어하고 최종 뷰를 렌더링할 수 있습니다. 그런 다음 그러한 프로그램을 호출합니다.터미널 에뮬레이터. 그 중 일부는 gnome-terminal 또는 alacritty와 같은 셸을 사용하는 프로그램을 시작할 때와 같이 그래픽이며 다른 일부는 주로 헤드가 없습니다.
여기에는 더 오래되었거나 screen
더 현대적인 tmux
것이 모두 관련됩니다.
- "외부" 스크립트를 작성합니다:
- 명명된 파이프 만들기
tmux
백그라운드에서 "내부" 스크립트(즉, 콘텐츠를 출력하는 스크립트)를 시작하세요.- 외부 스크립트에서 FIFO를 읽습니다(아무것도 기록되지 않기 때문에 차단됩니다).
- 읽기가 완료된 후
tmux
출력 스크린샷을 표시합니다.
- 내부 스크립트에서 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