画面の一番上の行にbash入力を保持する


12

bash古いコマンドからの出力が上ではなく下にプッシュされるように、コマンドプロンプトの入力を画面の上部に保持したいと思います。

どうすればこれを達成できますか?


6
それで、あなたcatがファイルなら、それは逆順でしょうか?
カオス

いいえ、しかし、出力のチャンクを下方にプッシュしたいと思います
トムプライス

1
bashこれはできません。bash画面の位置すら知らないからです。出力ファイルに書き込むだけです。bashカーソルをリセットするタイミングとウィンドウをスクロールするタイミングを知るには、の対話型プロンプトについて知っているターミナルエミュレータが必要です。
-chepner

@chepnerに感謝します。私はこの問題を再検討しており、あなたのコメントはbashの外を見て、ディスプレイスタック全体を見始めました。私はテキストベースの仮想コンソール(つまりX Windowsなし)にとどまりたいので、今のところはターミナルエミュレーターを避けたいと思いますが、GUIセッションについては確かに調べます。誰かがこの質問に出くわした場合、私の推測はttyに関係していると私は現在インスピレーションを探しています... linusakesson.net/programming/tty
トムプライス

回答:


7

以下にこれらの行を追加します.bashrc

prompt_on_top() {
  tput cup 0 0
  tput el
  tput el1
}

pre_cmd() {
  if [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] || [ -n "$COMP_LINE" ]; then
    return
  fi
  printf "\33[2J"
}

PROMPT_COMMAND="prompt_on_top"
trap 'pre_cmd' DEBUG

bash持ってPROMPT_COMMANDコマンドを保持し、前に実行されますbashプロンプトを示しています。ここでは、関数に設定し、tputprompt_on_top使用して画面の上部にカーソルを設定します。

bashまた、trapを使用してsignalを処理し、コマンドを実行する前にコマンドを実行する方法もありDEBUGます。ここではpre_cmd、古い画面をクリアするfunctionに設定し、完了(COMP_LINEが空ではない)またはでコマンドを実行しても何もしませんBASH_PROMPT


このアプローチには制限があります。コマンド出力が長すぎて画面に収まらない場合、出力はprompt_on_topアクションによってオーバーライドされます。この場合、出力をページャーにパイプして出力全体を読み取る必要があります。


1
あなたのよく説明された答えをありがとう、私が読んで学べることはたくさんあります。スクリプトをテストしましたが、現在は、コマンド間で画面からの古い出力を効果的に消去します。以前の出力を画面の下のプロンプトの下に保持し、プロンプトと古い出力の間に新しい出力が挿入されるようにして、古い出力を画面の下に押し下げたいと思います。
トムプライス

ウェブ検索でここにアクセスする人のために、このコードgithub.com/swirepe/alwaysontopは、「画面上部にbashプロンプトを表示します」に加えて、他のいくつかの機能も備えています。ただし、元の質問には答えません。古いコマンドの出力は、cuonglmのコードと同様に削除されます。
-WillC

このソリューションのその他の欠点は、最後に実行されたコマンドに関するフィードバックがないことです。つまり、コンテンツcat fileが表示fileされますが、実行された正確なコマンドのフィードバックはすぐには得られません。理想的には、プロンプトの後に実行されたコマンドの非拡張+拡張バージョンが続き、その後にstd ouputが続きます。
精神奴隷
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.