Bash: «numéro d'historique» vs «numéro de commande»

11

Pendant que Google cherche à personnaliser mon invite de shell via la variable PS1, je vois des tableaux de caractères spéciaux qui peuvent être utilisés. En particulier:

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

Le «numéro d'historique» semble être plus couramment utilisé, et je sais comment utiliser des commandes comme !523pour refaire des commandes de l'historique. Mais je ne peux pas savoir si "numéro de commande" a des fonctionnalités similaires. J'ai essayé de mettre \#ma variable PS1, et il semble afficher le nombre de commandes entrées dans une session particulière (contrairement à \!ce qui persiste après déconnexion / sortie).

Quelqu'un sait comment utiliser le "numéro de commande" d'une manière pratique ou significative?

Lagrangien
la source
2
J'ai cherché assez profondément sur le net - près que je sache, ce "numéro de commande" n'a de valeur que dans la mesure où il vous indique le nombre de commandes que vous avez entrées. Je ne peux pas trouver un moyen d'utiliser ce numéro de manière interactive, comme avec l'expansion de l'histoire
Lagrangian
1
Question interessante. Si vous répondez à ce commentaire, je voterais pour.
Peter Cordes

Réponses:

1

Le numéro de commande de Bash est uniquement à afficher.

Tout d'abord, quelques informations sur bashref:

Le numéro de commande et le numéro d'historique sont généralement différents: le numéro d'historique d'une commande est sa position dans la liste d'historique, qui peut inclure des commandes restaurées à partir du fichier d'historique (* remarque Bash History Facilities: :), tandis que le numéro de commande est le position dans la séquence de commandes exécutées pendant la session shell en cours.

En plongeant à travers la source, parse.ynous voyons que se '\#'résout la variable statique 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;                                                            

qui n'a qu'une seule autre utilisation: dans eval.c, il est incrémenté lors de l'exécution d'une commande:

# ...
current_command_number++;                                                  

executing = 1;                                                             
stdin_redir = 0;                                                           

execute_command (current_command);                                         

Tout ce qui est conservé est un nombre, pas la commande réelle ou même le numéro d'historique équivalent. Ainsi, lors de l'exécution de chaque commande, bash oublie quelle commande associée à quel numéro de commande, rendant le numéro de commande inutilisable pour autre chose que l'affichage et la référence de défilement.

évêque
la source
5

Pour autant que je peux dire (et cela semble confirmé par votre recherche), il n'y a aucun moyen de se référer à ce numéro de magie interactive ou non par fcou !nraccourcis. Celles-ci semblent certainement se référer uniquement à la position absolue dans la liste historique, pas à la position relative depuis le début de ce shell spécifique (ce qui est ce qui se \#réfère, comme vous l'avez correctement souligné).

La seule façon que j'ai trouvée pour rendre cela plus agréable ici est de définir ce qui suit:

export HISTFILESIZE=1001
export HISTSIZE=-1

De cette façon:

  1. l'historique d'une nouvelle session commence à 1000, ce qui facilite l'identification de ma position dans une session
  2. (un peu sans rapport) je ne perds pas l'historique plus ancien dans une session donnée (mais n'inonderai pas le fichier)

Fondamentalement, il a transformé mon invite modifiée ( PS1="\\!$ ") de:

499$ 

à:

1000$ 

... ce qui le rend un peu plus propre au démarrage. Mais ce n'est probablement pas la réponse que vous cherchiez. :)

(Soit dit en passant, j'ai également examiné zsh pour une solution, et il semble qu'il n'a tout simplement pas l'équivalent de \#, donc cela n'aide pas du tout non plus.)

anarcat
la source