Bash: "número de historial" vs "número de comando"

11

Mientras busco en Google cómo personalizar mi indicador de shell a través de la variable PS1, veo tablas de caracteres especiales que se pueden usar. En particular:

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

Parece que el "número de historial" se usa más comúnmente, y sé cómo usar comandos como !523rehacer comandos del historial. Pero no puedo entender si el "número de comando" tiene una funcionalidad similar. Intenté poner \#mi variable PS1, y parece que muestra el número de comandos ingresados ​​en una sesión particular (a diferencia \!, que persiste después de cerrar sesión / salir).

¿Alguien sabe cómo usar el "número de comando" de una manera conveniente o significativa?

Lagrangiana
fuente
2
He buscado bastante profundamente en la red, cerca de lo que puedo decir, este "número de comando" solo es valioso en la medida en que te dice cuántos comandos has ingresado. No puedo encontrar una manera de usar este número de manera interactiva, como con la expansión de la historia
Lagrangian
1
Interesante pregunta. Si haces que ese comentario sea una respuesta, votaría por ello.
Peter Cordes

Respuestas:

1

El número de comando de Bash es solo para visualización.

Primero, algunos antecedentes de bashref:

El número de comando y el número de historial generalmente son diferentes: el número de historial de un comando es su posición en la lista de historial, que puede incluir comandos restaurados desde el archivo de historial (* note Bash History Facilities: :), mientras que el número de comando es el posición en la secuencia de comandos ejecutados durante la sesión de shell actual.

Al bucear a través de la fuente, parse.yvemos que se '\#'resuelve en la variable estática global 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;                                                            

que solo tiene otro uso: en eval.c, se incrementa al ejecutar un comando:

# ...
current_command_number++;                                                  

executing = 1;                                                             
stdin_redir = 0;                                                           

execute_command (current_command);                                         

Todo lo que se mantiene es un número, no el comando real o incluso el número de historial equivalente. Entonces, al ejecutar cada comando, bash olvida qué comando está asociado con qué número de comando, haciendo que el número de comando sea inutilizable para cualquier otra cosa que no sea la referencia de visualización y desplazamiento.

obispo
fuente
5

Por lo que yo puedo decir (y esto parece confirmado por su investigación), no hay manera de referirse a ese número mágico de forma interactiva o no a través de fco !naccesos directos. Esos ciertamente parecen referirse solo a la posición absoluta en la lista del historial, no a la posición relativa desde que comenzó este shell específico (que es lo que se \#refiere, como usted señaló correctamente).

La única forma que encontré para hacer esto más agradable aquí es establecer lo siguiente:

export HISTFILESIZE=1001
export HISTSIZE=-1

De esa manera:

  1. el historial de una nueva sesión comienza en 1000, lo que facilita identificar dónde estoy en una sesión
  2. (algo no relacionado) no pierdo el historial anterior en una sesión determinada (pero aún así no inunda el archivo)

Básicamente, convirtió mi prompt modificado ( PS1="\\!$ ") de:

499$ 

a:

1000$ 

... lo que lo hace un poco más limpio al inicio. Pero esa probablemente no sea la respuesta que estabas buscando. :)

(Por cierto, también busqué en zsh una solución, y parece que simplemente no tiene el equivalente de \#, por lo que tampoco ayuda en absoluto).

anarcat
fuente