コンソールにすべてのコマンドを入力する前に「クリア」を実行するようにbashを構成できますか?


22

clearターミナルでコマンドを入力するたびに(コマンドを実行する前に)コマンドを実行するようにbashを構成したいと思います。どうやってやるの?

Debian Linuxを使用しています。


あなたは見つけるこのスレッドが便利。
トール

3
好奇心が強い:これにあなたは何のアプリケーションですか?大量の出力を持つプログラムをデバッグする場合を除き、通常は、作業中のコンテキストを追跡できるように、できるだけ画面に表示したいです。
Joe

回答:


22

Bashにはプリコマンドフックがあります。並べ替え。

preexec () {
  clear
}
preexec_invoke_exec () {
    [ -n "$COMP_LINE" ] && return                     # do nothing if completing
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
    local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`; # obtain the command from the history, removing the history number at the beginning
    preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG

Gilles:上記をkonsoleターミナルに貼り付け、その後入力した各コマンドの出力は、読む前にクリアされました。何か不足していますか?また、複数の行(または最後の行以外の行)が興味深い出力を生成する複数行のbashスクリプトを呼び出すと、これ(および以下の他の回答)はどうなりますか?
ジョー

@Joeこれを押すEnterと、コマンドを実行する前に画面がクリアされます。私にとってはこのように機能します。preexecフックは、対話型コマンドごとに実行されます。コマンドが組み込みコマンドであるか外部コマンドであるか、または多くのコマンドであるかは関係ありません。
ジル 'SO-悪

1
@Joe [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;は、PROMPT_COMMANDが実行されており、実際のコマンドの後にトラップされているという問題が完全な場合は、何もせずにこの行を追加する必要があり ます。また、なぜlocal this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;ここにいるのか教えてもらえ ますか?
MageProspero

@JamesAndino history -1は、前に履歴番号を付けて最後のコマンドラインを出力します。sedフィルターは履歴番号を取り除きます。
ジル 'SO-悪であるのをやめる'

@JamesAndinoそれはうまくいきました(そして、私はGilesが彼の答えにそれを追加したのを見ます。)
ジョー

6
bind 'RETURN: "\e[1~clear; \e[4~\n"'

その後、押すreturnだけ\nではなく、押すたびに行の先頭に移動し、テキストclear;を入力し、最後に移動し\nて期待どおりに入力します。


2
とにかく改行を使用すると、プロンプトが印刷されるため、プロンプトにクリアを入力すると、コマンドでコマンド履歴を汚染することなく同じことをclear実行できます。
jw013

2
@ jw013違いは、私の場合clear、コマンドとコマンド出力が消えないうちに実行されることです。ただし、プロンプトが表示された場合は実行されます。
ラッシュ

コマンドライン自体を変更せずにこれを行う方法があればいいのにと思います-これは複雑なコマンドや複数行のコマンドで面白い方法で壊れると確信していますが、これを行うより良い方法は見つかりません。
jw013

@ jw013、あなたは正しいです、それは複数行のために壊れます。それclear;は各余分の出力に挿入し\nます。
Peter.O

このヒントは非常に良いです!特定のコードをF2にバインドする必要がありましたが、行に入力したコマンドはあるが実行されていないbind "\"\\eOQ\":\"\e[1~ls;#\\n\""ことがあるため、この例では、先頭に移動し、ls;#コメントを入力して、lsコマンドを適切に実行します!THX!
アクエリアスパワー

2

今日私が尋ねた質問から(ユーザー@aecolleyの回答に感謝):

bind '"\C-m": "\C-l\C-j"'

\C-m、Enterキーをシミュレートする\C-lシミュレートするCtrl+lことは明らかだとして\C-jある「改行やインデント」、コマンドは、Ctrlキーを押しながらL&はCtrl + jにEnterキーを結合させ

GNU bash、バージョン3.2.53(1)-release(x86_64-apple-darwin14)で動作し、このスレッドの他の回答は動作しません。また、これは履歴を他のコマンドごとに「クリア」コマンドで汚染しません。


1
注:オーバーsshを使用する場合は、その環境で実行する必要があります。そうしないと、奇妙さが発生します。
-TRB

すごい、それは私のubuntu 16.04端末で動作します、ありがとう、しかしそれはどのように動作しますか、リンクやドキュメントを提供してください。
アンジェイRehmann
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.