画面をクリアせずにコマンド出力の最後の行を同じ行に印刷し続けたいと思います。これは別の機能の一部になります。私のスクリプトに次の疑似コードがあるとしましょう。
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" ]] || continue
whileループの最初のステートメントとして追加すると、空行が最後の状態を上書きするのを防ぐことができます。