Bash: "Verlaufsnummer" vs "Befehlsnummer"

11

Während ich google, wie ich meine Shell-Eingabeaufforderung über die PS1-Variable anpasse, werden Tabellen mit Sonderzeichen angezeigt, die verwendet werden können. Im Speziellen:

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

"Verlaufsnummer" scheint häufiger verwendet zu werden, und ich weiß, wie man Befehle verwendet !523, um Befehle aus dem Verlauf zu wiederholen. Aber ich kann nicht herausfinden, ob "Befehlsnummer" ähnliche Funktionen hat. Ich habe versucht, \#meine PS1-Variable einzugeben, und sie scheint die Anzahl der in einer bestimmten Sitzung eingegebenen Befehle auszugeben (im Gegensatz dazu \!, die nach dem Abmelden / Beenden bestehen bleiben).

Weiß jemand, wie man "Befehlsnummer" auf bequeme oder sinnvolle Weise verwendet?

Lagrange
quelle
2
Ich habe ziemlich tief im Internet gesucht - soweit ich das beurteilen kann, ist diese "Befehlsnummer" nur insofern wertvoll, als sie Ihnen sagt, wie viele Befehle Sie eingegeben haben. Ich kann keinen Weg finden, diese Zahl interaktiv zu verwenden, wie bei der Erweiterung der Geschichte
Lagrangian
1
Interessante Frage. Wenn Sie diesen Kommentar zu einer Antwort machen, würde ich dafür stimmen.
Peter Cordes

Antworten:

1

Die Befehlsnummer von Bash dient nur zur Anzeige.

Zunächst einige Hintergrundinformationen von bashref:

Die Befehlsnummer und die Verlaufsnummer sind normalerweise unterschiedlich: Die Verlaufsnummer eines Befehls ist seine Position in der Verlaufsliste, die Befehle enthalten kann, die aus der Verlaufsdatei wiederhergestellt wurden (* Hinweis Bash-Verlaufsfunktionen: :), während die Befehlsnummer die ist Position in der Reihenfolge der Befehle, die während der aktuellen Shell-Sitzung ausgeführt werden.

Wenn parse.ywir durch die Quelle tauchen, sehen wir, dass '\#'die globale statische Variable aufgelöst wird 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;                                                            

Dies hat nur eine andere Verwendung: In eval.cwird es beim Ausführen eines Befehls erhöht:

# ...
current_command_number++;                                                  

executing = 1;                                                             
stdin_redir = 0;                                                           

execute_command (current_command);                                         

Alles, was aufbewahrt wird, ist eine Nummer, nicht der eigentliche Befehl oder sogar die entsprechende Verlaufsnummer. Bei der Ausführung jedes Befehls vergisst bash also, welcher Befehl mit welcher Befehlsnummer verknüpft ist, wodurch die Befehlsnummer für andere Zwecke als die Anzeige- und Bildlaufreferenz unbrauchbar wird.

Bischof
quelle
5

Soweit ich das beurteilen kann (und dies scheint durch Ihre Forschung bestätigt zu sein), gibt es keine Möglichkeit, interaktiv auf diese magische Zahl zu verweisen, oder nicht durch fcoder !nVerknüpfungen. Diese scheinen sich sicherlich nur auf die absolute Position in der Verlaufsliste zu beziehen, nicht auf die relative Position seit dem Start dieser spezifischen Shell (worauf Sie sich \#beziehen, wie Sie richtig betont haben).

Die einzige Möglichkeit, dies hier schöner zu machen, besteht darin, Folgendes festzulegen:

export HISTFILESIZE=1001
export HISTSIZE=-1

Dieser Weg:

  1. Der Verlauf einer neuen Sitzung beginnt um 1000, wodurch es einfacher wird, festzustellen, wo ich mich in einer Sitzung befinde
  2. (etwas unabhängig) Ich verliere in einer bestimmten Sitzung keinen älteren Verlauf (aber überschwemme die Datei trotzdem nicht)

Grundsätzlich wurde meine geänderte Eingabeaufforderung ( PS1="\\!$ ") von:

499$ 

zu:

1000$ 

... was es beim Start etwas sauberer macht. Aber das ist wahrscheinlich nicht die Antwort, nach der Sie gesucht haben. :) :)

(Übrigens habe ich auch bei zsh nach einer Lösung gesucht, und es scheint, dass es einfach nicht das Äquivalent von hat \#, also hilft das auch überhaupt nicht.)

anarcat
quelle