현재 터미널 콘텐츠의 텍스트 "스크린샷"을 찍습니다.

현재 터미널 콘텐츠의 텍스트 "스크린샷"을 찍습니다.

특정 터미널이나 터미널 에뮬레이터의 모든 텍스트 를 30초마다 파일로 복사하여 conky. command > file게임.

어떻게 해야 하나요?

답변1

터미널 에뮬레이터에 화면 덤프를 요청하는 이식 가능한 방법은 없습니다. GNU screen 또는 tmux에서 애플리케이션을 실행하고 이를 사용하여 화면 덤프를 수행하면 이 문제를 해결할 수 있습니다.

GNU 화면은 다음을 수행할 수 있습니다:

마찬가지로,tmux 플러그인스크린샷을 찍으세요.

답변2

*표시되는 프로세스 출력 캡처(텍스트 스크린샷)

\r그러면 캐리지 리턴( ) 및 기타 특수 문자가 렌더링됩니다.터미널 제어 코드사람 눈에 보이기 때문에

예를 들어, 실시간 진행률 표시줄은 다음을 생성해야 합니다.

[================================>] 100%          

설마

[==>                               ]  9%
[========>                         ] 28%
[==============>                   ] 47%
[=====================>            ] 65%
[===========================>      ] 84%
[================================>] 100%
#! /usr/bin/env bash

# text screenshot
# capture the visible output of a process
# https://unix.stackexchange.com/a/697804/295986

captureCommand="$(cat <<'EOF'
  # example: progress bar
  # https://stackoverflow.com/a/23630781/10440128
  for ((i=0; i<100; i++)); do
    sleep 0.1
    printf .
  done | pv -p -c -s 100 -w 40 > /dev/null
EOF
)"
# note: to stop the captureCommand after some time
# you can wrap it in `timeout -k 60 60`
# to stop after 60 seconds
# or use `for waiterStep in $(seq 0 60)`
# in the waiter loop

# create a new screen session. dont attach
screenName=$(mktemp -u screen-session-XXXXXXXX)
screen -S "$screenName" -d -m

# create lockfile
screenLock=$(mktemp /tmp/screen-lock-XXXXXXXX)
# remove lockfile after captureCommand
screenCommand="$captureCommand; rm $screenLock;"

echo "start captureCommand"
# send text to detached screen session
# ^M = enter
screen -S "$screenName" -X stuff "$screenCommand^M"
hardcopyFile=$(mktemp /tmp/hardcopy-XXXXXXXX)

enableWatcher=true
if $enableWatcher; then
  echo "start watcher"
  (
    # watcher: show live output while waiting
    while true
    #for watcherStep in $(seq 0 100) # debug
    do
      sleep 2
      # take screenshot. -h = include history
      screen -S "$screenName" -X hardcopy -h "$hardcopyFile"
      cat "$hardcopyFile"
    done
  ) &
  watcherPid=$!
fi

echo "wait for captureCommand ..."
while true
#for waiterStep in $(seq 0 60) # debug
do
  sleep 1
  [ -e "$screenLock" ] || break
done
echo "done captureCommand"

if $enableWatcher; then
  kill $watcherPid
fi

# take a last screenshot
screen -S "$screenName" -X hardcopy -h "$hardcopyFile"
echo "done hardcopy $hardcopyFile"

# kill the detached screen session
screen -S "$screenName" -X quit

관련 정보