PS1 の \# と !n の n の不一致はどこから来るのでしょうか?

PS1 の \# と !n の n の不一致はどこから来るのでしょうか?

しばらくの間、何かが私を悩ませてきましたが、マニュアル ページでも「Don't be evil」検索エンジンでも、関連する答えが見つからないようです。

私の .bashrc には次の内容が含まれています:

shopt -s histappend
HISTSIZE=100
HISTFILESIZE=0   # 200 previous value

HISTFILESIZE を 0 に設定すると、新しい用語ウィンドウごとにクリーンな履歴スレートから開始できます。

を含むプロンプトの使用と組み合わせて使用​​すると実用的だと思います。または\#を使用して呼び出す前に以前のコマンドを視覚化する場合、次のようにすればよいからです。!n!-p

$ history | more 

関連する「n」値を確認する

私の場合、通常は次のような結果になります。

$ \history | tail -1 | awk '{print $1}'   # (I know this is an overkill, don't flame me)

PS1 の # の拡張値から 1 を引いた値に等しくなります。これは常に望ましい値です。しかし、そうでない場合もあります。# の拡張値が「暴走」する場合もあります。増分される方法によって、> になります。

$(( $(\history | tail -1 | awk '{print $1}')+1 ))

何かアドバイスはありますか?

答え1

最も可能性の高い原因は、HISTCONTROLを含む値を設定したことですignoredupes。実行してテストしてください。

echo $HISTCONTROL

のような結果が返された場合ignoredups、重複したコマンドは履歴に保存されていないことを意味します。ただし、PS1 によってカウントされます\#。つまり、\#同じコマンドを 2 回実行するたびに は増加しますが、 はhistory増加せず、これが観察される矛盾につながります。

したがって、ignoredupesから を削除するかHISTCONTROL(これは通常 で設定されます~/.profileが で設定することもできます~/.bashrc)、\!\#の代わりにPS1

関連情報