画面を消去せずにコマンド出力の最後の行を表示し続けます。

画面を消去せずにコマンド出力の最後の行を表示し続けます。

画面をクリアせずにコマンド出力の最後の行を同じ行に印刷し続けたいと思います。これは別の機能の一部になります。私のスクリプトに次の疑似コードがあるとしましょう。

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

PS:[[ -n "$line" ]] || continuewhileループの最初のステートメントとして追加すると、空行が最後の状態を上書きするのを防ぐことができます。

おすすめ記事