Bash:「記録番号」対「コマンド番号」

Bash:「記録番号」対「コマンド番号」

PS1変数を使用してシェルプロンプトをカスタマイズする方法を検索するときに使用できる特殊文字テーブルを見ました。特に:

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

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

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

答え1

fc私が知っている限り(そしてこれはあなたの研究によって確認されたようです)、対応するマジックナンバーを対話的にまたは近道で参照する方法はありません!n。もちろん、これらは特定のシェルが起動した後の相対位置ではなく、履歴リストの絶対位置のみを参照しているようです(\#正確に指摘したように、これは何を参照しているのか)。

この問題を改善するために私が見つけた唯一の方法は、次のように設定することです。

export HISTFILESIZE=1001
export HISTSIZE=-1

そのように:

  1. 新しいセッションの記録は最初から始まり、1000セッション内の現在の場所をより簡単に識別できます。
  2. (多少関係ありません)特定のセッションで以前の履歴を失うことはありません(ただしファイルはあふれません)。

デフォルトでは、以下で変更されたプロンプト()を取得しますPS1="\\!$ "

499$ 

到着する:

1000$ 

...最初はもう少しきれいになりました。しかし、これはあなたが望む答えではないかもしれません。 :)

(ところで、私はまた解決策を見つけるためにzshを見てみましたが、同等のものがまったくないようで、\#それも役に立ちません。)

答え2

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;                                                            

目的は単一です:eval.c、これはコマンドを実行すると増加します。

# ...
current_command_number++;                                                  

executing = 1;                                                             
stdin_redir = 0;                                                           

execute_command (current_command);                                         

保持されるのは単なる数字であり、実際のコマンドやそれに対応する歴史的数字でもありません。したがって、各コマンドが実行されると、bashはどのコマンドがどのコマンド番号に関連付けられているかを忘れ、参照を表示してスクロールする以外はコマンド番号を使用できません。

関連情報