화면을 지우지 않고 명령 출력의 마지막 줄을 계속 표시합니다.

화면을 지우지 않고 명령 출력의 마지막 줄을 계속 표시합니다.

화면을 지우지 않고 명령 출력의 마지막 줄을 같은 줄에 계속해서 인쇄하고 싶습니다. 이것은 또 다른 기능의 일부가 될 것입니다. 내 스크립트에 다음과 같은 의사 코드가 있다고 가정해 보겠습니다.

test_project_local_install(){
  install_project
  setup_venv
  run_tests
}

다음과 같이 사용할 수 있는 명령을 원합니다.

test_project_local_install(){
  printf "Install Project: "
  install_project | magic_command
  printf "Setup Venv: "
  setup_venv | magic_command
  printf "Run Tests: "
  run_tests | magic_command
}

따라서 test_project_local_install명령 출력은 다음과 같습니다.

$ > test_project_local_install
$ Install Project: install_project updated output on one line
$ Setup Venv: setup_venv updated output on one line
$ Run Tests: run_tests updated output on one line

인정받은 솔루션이 문제내가 원하는 것을 수행하고 명령의 마지막 몇 줄만 연속적으로 출력하지만 화면도 지워지는데 이는 내가 원하는 것이 아닙니다. 코드를 조정할 방법을 찾을 수 없습니다. 다른 제안된 답변도 내가 찾고 있는 답변과 맞지 않습니다. 감사해요!

답변1

가장 쉬운 방법은 제어 문자를 사용하는 것입니다.입력하다커서를 줄의 시작 부분으로 이동하고 이전 내용을 공백으로 덮어쓴 후 Enter를 다시 누르고 다음 줄을 인쇄합니다.

다음 Bash 코드에 표시된 것처럼 실제로 시작하는 것은 쉽습니다. (독립형 스크립트 또는 셸 함수로 사용할 수 있습니다(그러나 종료 줄을 제거할 수도 있음))

#!/usr/bin/env bash

# exit if stdin is connected to terminal (script should filter piped input)
[[ -t 0 ]] && exit 0

: "${COLUMNS:=$(tput cols)}"
clear_str=$'\r'"$(printf "%$((COLUMNS-2))s" ' ')"$'\r'

while IFS= read -r line; do
  printf '%s%s' "$clear_str" "${line:0:$COLUMNS}"
done

이와 같은 파이프라인의 경우 ping 1.1 | statusline.sh한 줄에 지속적으로 업데이트되는 일종의 ping 상태 줄이 표시됩니다.

더 필요한 경우 ncurses실제 라이브러리를 만드는 것과 같이 라이브러리를 살펴보는 것이 좋습니다.TUI.

추신: [[ -n "$line" ]] || continuewhile 루프의 첫 번째 문으로 추가하면 빈 줄이 마지막 상태를 덮어쓰는 것을 방지할 수도 있습니다.

관련 정보