화면을 지우지 않고 명령 출력의 마지막 줄을 같은 줄에 계속해서 인쇄하고 싶습니다. 이것은 또 다른 기능의 일부가 될 것입니다. 내 스크립트에 다음과 같은 의사 코드가 있다고 가정해 보겠습니다.
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" ]] || continue
while 루프의 첫 번째 문으로 추가하면 빈 줄이 마지막 상태를 덮어쓰는 것을 방지할 수도 있습니다.