Bash: "numero storico" vs "numero comando"


11

Mentre su Google come personalizzare il mio prompt della shell tramite la variabile PS1, vedo tabelle di caratteri speciali che possono essere utilizzati. In particolare:

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

"Numero di cronologia" sembra essere più comunemente usato e so come usare comandi come !523ripetere comandi dalla cronologia. Ma non riesco a capire se il "numero di comando" ha funzionalità simili. Ho provato a inserire la \#mia variabile PS1 e sembra emettere il numero di comandi immessi in una sessione particolare (diversamente \!, che persiste dopo il logout / exit).

Qualcuno sa come utilizzare il "numero di comando" in un modo conveniente o significativo?


2
Ho cercato abbastanza in profondità in rete - vicino a quanto posso dire, questo "numero di comando" è prezioso solo nella misura in cui ti dice quanti comandi hai inserito. Non riesco a trovare un modo per usare questo numero in modo interattivo, come con l'espansione della storia
Lagrangian

1
Domanda interessante. Se fai di quel commento una risposta, voterei per questo.
Peter Cordes,

Risposte:


1

Il numero di comando di Bash è solo per la visualizzazione.

Innanzitutto, alcuni retroscena di bashref:

Il numero di comando e il numero di cronologia sono generalmente diversi: il numero di cronologia di un comando è la sua posizione nell'elenco cronologico, che può includere comandi ripristinati dal file di cronologia (* nota Bash History Facilities: :), mentre il numero di comando è il posizione nella sequenza di comandi eseguiti durante la sessione di shell corrente.

Immergersi attraverso la sorgente, parse.yvediamo che si '\#'risolve nella variabile statica globale 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;                                                            

che ha solo un altro uso: in eval.c, viene incrementato quando si esegue un comando:

# ...
current_command_number++;                                                  

executing = 1;                                                             
stdin_redir = 0;                                                           

execute_command (current_command);                                         

Tutto ciò che viene mantenuto è un numero, non il comando effettivo o anche il numero di cronologia equivalente. Quindi, dopo l'esecuzione di ogni comando, bash dimentica quale comando è associato a quale numero di comando, rendendo il numero di comando inutilizzabile per qualsiasi cosa diversa dalla visualizzazione e dal riferimento di scorrimento.


5

Per quanto ne so (e questo sembra confermato dalla tua ricerca), non c'è modo di fare riferimento a quel numero magico in modo interattivo, o non attraverso fco !nscorciatoie. Quelli sembrano certamente riferirsi solo alla posizione assoluta nell'elenco cronologico, non alla posizione relativa da quando è iniziata questa specifica shell (che è waht \#, come hai giustamente sottolineato).

L'unico modo in cui ho trovato per renderlo più bello qui è impostare quanto segue:

export HISTFILESIZE=1001
export HISTSIZE=-1

Quel modo:

  1. inizia una nuova cronologia di sessione 1000, che semplifica l'identificazione di dove mi trovo in una sessione
  2. (in qualche modo non correlato) non perdo la cronologia precedente in una determinata sessione (ma continuo a non inondare il file)

Fondamentalmente, ha trasformato il mio prompt modificato ( PS1="\\!$ ") da:

499$ 

per:

1000$ 

... che lo rende un po 'più pulito all'avvio. Ma questa probabilmente non è la risposta che stavi cercando. :)

(A proposito, ho anche cercato zsh per una soluzione, e sembra che semplicemente non abbia l'equivalente di \#, quindi anche questo non aiuta affatto.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.