バッシュ:「履歴番号」と「コマンド番号」


11

PS1変数を使用してシェルプロンプトをカスタマイズする方法をグーグルで調べているときに、使用できる特殊文字の表が表示されます。特に:

          \!     the history number of this command
          \#     the command number of this command

「履歴番号」はより一般的に使用されているようで、コマンドを使用!523して履歴からコマンドをやり直す方法を知っています。しかし、「コマンド番号」に同様の機能があるかどうかはわかりません。私は\#PS1変数を入れてみましたが、特定のセッションで入力されたコマンドの数を出力しているようです(とは異なり\!、ログアウト/終了後も存続します)。

誰もが「コマンド番号」を便利または意味のある方法で使用する方法を知っていますか?


2
私はネットでかなり深く検索しました-私の知る限りでは、この「コマンド番号」は、入力したコマンドの数がわかる限り、価値があります。履歴の拡張のように、この数値をインタラクティブに使用する方法が見つかりません
Lagrangian

1
興味深い質問です。あなたがそのコメントを答えにしたら、私はそれに投票します。
Peter Cordes

回答:


1

Bashのコマンド番号は表示専用です。

最初に、いくつかの背景bashref

コマンド番号と履歴番号は通常異なります。コマンドの履歴番号は履歴リスト内の位置であり、履歴ファイルから復元されたコマンドを含めることができます(* bash履歴機能::)。コマンド番号は現在のシェルセッション中に実行された一連のコマンド内の位置。

ソースparse.y'\#'分割すると、グローバル静的変数に解決されることがわかりますcurrent_command_number

case '#':                                                                     
  n = current_command_number;                                                 
  /* If we have already incremented current_command_number (PS4,              
 ${var@P}), compensate */                                                     
  if (orig_string != ps0_prompt && orig_string != ps1_prompt && orig_string != ps2_prompt)
n--;                                                                          
  temp = itos (n);                                                            
  goto add_string;                                                            

これには他に1つの用途しかありません:ではeval.c、コマンドを実行するとインクリメントされます:

# ...
current_command_number++;                                                  

executing = 1;                                                             
stdin_redir = 0;                                                           

execute_command (current_command);                                         

保持されるのは、実際のコマンドや同等の履歴番号ではなく、番号だけです。そのため、各コマンドの実行時に、bashはどのコマンド番号に関連付けられているどのコマンドを忘れて、表示およびスクロール参照以外には何も使用できないようにします。


5

私が知る限り(これはあなたの研究で確認されているようです)、そのマジックナンバーをインタラクティブに参照しfcたり、!nショートカットを介して参照したりする方法はありません。これらは確かに、この特定のシェルが起動してからの相対位置ではなく、履歴リスト内の絶対位置のみを参照しているように見え\#ます(正しく指摘したとおり、これは実際に参照されています)。

ここでこれをより良くするために見つけた唯一の方法は、以下を設定することです:

export HISTFILESIZE=1001
export HISTSIZE=-1

そのように:

  1. 新しいセッションの履歴はから始まります1000。これにより、セッションのどこにいるかを簡単に特定できます
  2. (やや無関係)特定のセッションで古い履歴を失わない(ただし、ファイルをフラッディングしない)

基本的に、変更されたプロンプト(PS1="\\!$ ")は次のようになりました。

499$ 

に:

1000$ 

...起動時に少しクリーンになります。しかし、それはおそらくあなたが探していた答えではありません。:)

(ちなみに、私はzshも解決策を探しました、そしてそれは単に同等のものを持っ\#ていないようですので、それもまったく助けにはなりません。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.