基本的にシェルのデフォルトからいくつかのコマンドで機能するまでの、分割画面xtermで動作する最終的な製品を次に示します。
スクリーンショットに示されているよりも大まかな方法は、次のようになります。
PS1='$( { date ; fc -l -0 ; } >${TGT_PTY} )'$PS1
どこに${TGT_PTY}
あなたが出る何だろうtty
、実際にあなたがあなたの出力をしたい画面上のインタラクティブシェルを実行しているときにコマンド。または、実際には、ファイルリダイレクトのターゲットにすぎないため、書き込み可能なファイルを使用することもできます。
私はそれが何らかのxtermであると想定しているので、疑似端末にpty構文を使用しますが、vtを専用にするのは簡単かもしれません-ストリーミングされた履歴は常に重要な組み合わせです。それが私なら、2つの概念を組み合わせて、専用のvtでセッションにすることもできますが、私は余談です。CTRL-ALT-Fn
screen
tmux
新しく起動したマシンでは/bin/login
、典型的なLinux getty
コンソールの典型的なプロンプトが表示されます。私は押しCTRL-ALT-F2
少なく、一般的なアクセスするためにkmscon
、より多くのように振る舞うコンソールxterm
よりをtty
。コマンドを入力し、tty
応答を受け取り/dev/pts/0
ます。
一般的にxtermは、疑似端末を使用して単一の端末デバイスを複数に多重化します。そのため、X11で端末のタブまたはウィンドウを切り替えることで同様のことを行うと、同様に出力を受け取る可能性があります/dev/pts/[0-9]*
。ただし、CTRL-ALT-Fn
キーの組み合わせでアクセスされる仮想端末コンソールはtrue(er)端末デバイスであるため、独自の/dev/tty[0-9]*
指定を受け取ります。
これが、コンソール2にログインした後tty
、プロンプトで入力すると応答/dev/pts/0
が表示されるのに、コンソール1で同じように入力すると、出力が表示されるため/dev/tty1
です。いずれにせよ、コンソール2に戻って、次のようにします。
bash
PS1='$( { date ; fc -l -0 ; } >/dev/tty1 )'$PS1
認識できる影響はありません。さらにいくつかのコマンドを入力し続け、CTRL-ALT-F1
もう一度押してコンソール1に切り替えます。そして<date_time>\n<hist#>\t<hist_cmd_string>
、コンソール2で入力したすべてのコマンドのようなエントリが繰り返し見つかります。
ただし、端末デバイスに直接書き込むことを除いて、別のオプションは次のようになります。
TGT_PTY=
mkfifo ${TGT_PTY:=/tmp/shell.history.pipe}
{ echo 'OPENED ON:'
date
} >${TGT_PTY}
そして多分...
less +F ${TGT_PTY}
大まかなプロンプトコマンドは仕様に適合していません。フォーマット文字列date
もフォーマットオプションfc
もありませんが、そのメカニズムはそれほど必要ではありません。プロンプトが最後の履歴コマンドを表示するたびに、現在の日付と時刻が書き込まれます。${TGT_PTY}
指定したファイル それはそれと同じくらい簡単です。
シェル履歴の監視と印刷は、fc
の主な目的です。組み込まれてdate
いない場合でも、組み込みのシェルです。中には、zsh
fc
タイムスタンプには適用されそのうちのいくつかは空想の書式設定オプションのすべての種類を提供することができます。もちろん、上記のように、bash
さんhistory
も同じことができます。
よりクリーンな出力のために、ここで説明した手法を使用して、現在のシェルに永続的な追跡変数を設定できます。追跡してプロンプトシーケンス内のサブシェルで処理する必要があります。
仕様に合わせてフォーマットするポータブルな方法を次に示します。
_HIST() { [ -z ${_LH#$1} ] ||
{ date "+${1}%t[%F %T]"
fc -nl -0
} >${TGT_PTY}
printf "(_LH=$1)-$1"
}
: "${_LH=0}"
PS1='${_LH##*[$(($(_HIST \!)))-9]}'$PS1
最新の更新を追跡するだけのlast_historyカウンターを実装している$_LH
ため、同じ履歴コマンドを2回書き出さないでください。たとえば、Enterキーを押すだけです。現在のシェルで変数をインクリメントして、関数がサブシェルで呼び出されてもその値を保持するために、少しラングリングが必要です。これも、リンクで詳しく説明されています。
その出力は次のようになります <hist#>\t[%F %T]\t<hist_cmd>\n
しかし、それは完全に移植可能なバージョンです。でbash
、それが少ないと、唯一のシェル組み込みコマンドを実装することによって行うことができます-あなたは、これはあなたが押すたびに実行するコマンドであることを考えると望ましい可能性があります[ENTER]
。2つの方法は次のとおりです。
_HIST() { [ -z ${_LH#$1} ] || {
printf "${1}\t[%(%F %T)T]"
fc -nl -0
} >${TGT_PTY}
printf "(_LH=$1)-$1"
}
PROMPT_COMMAND=': ${_LH=0};'$PROMPT_COMMAND
PS1='${_LH##*[$(($(_HIST \!)))-9]}'$PS1
または、bash
のhistory
コマンドを使用して、次のように_HIST
関数を定義できます。
_HIST() { [ -z ${_LH#$1} ] ||
HISTTIMEFORMAT="[%F %T]<tab>" \
history 1 >${TGT_PTY}
printf "(_LH=$1)-$1"
}
どちらのメソッドの出力も次のようになります。<hist#>\t[%F %T]\t<hist_cmd>\n
ただし、history
メソッドにはいくつかの先行空白が含まれています。それでも、history
メソッドのタイムスタンプは、参照されたコマンドが完了するのを待ってからスタンプを取得する必要がないので、より正確になると思います。
あなたが何らかの形でストリームをフィルタリングする場合にのみ、両方のケースではまったくの状態を追跡避けることができるuniq
-あなたがするかもしれないとmkfifo
私は前に述べたように。
しかし、このようにプロンプトでそれを行うことは、プロンプトを更新するという単なるアクションによって必要になったときにのみ、常に更新されることを意味します。それは簡単です。
あなたはまた、あなたがやっていることと同様のことをするかもしれませんtail
が、むしろ設定されます
HISTFILE=${TGT_PTY}
fn+1
て比較すると、最初は表示が速くなり、うまく機能します!ありがとう!