Bash: "номер історії" проти "номер команди"


11

У той час як Googling як налаштувати мою оболонку за допомогою змінної PS1, я бачу таблиці спеціальних символів, які можна використовувати. Зокрема:

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

"Історичний номер", здається, використовується частіше, і я знаю, як використовувати команди, як !523повторити команди з історії. Але я не можу зрозуміти, чи має "командний номер" подібний функціонал. Я спробував ввести \#свою змінну PS1, і, схоже, виводиться кількість команд, введених у конкретний сеанс (на відміну від \!, що зберігається після виходу з системи / виходу).

Хтось знає, як зручно чи змістовно використовувати "номер команди"?


2
Я шукав досить глибоко в мережі - наскільки я можу сказати, цей "номер команди" є цінним лише в тому випадку, коли він говорить вам, скільки команд ви ввели. Я не можу знайти інтерактивне використання цього номера, як, наприклад, із розширенням історії
Lagrangian

1
Цікаве запитання. Якщо ви зробите цей коментар як відповідь, я би проголосував за нього.
Пітер Кордес

Відповіді:


1

Номер команди Bash призначений лише для відображення.

По-перше, деякі відомості з bashref:

Номер команди та номер історії зазвичай різні: номер історії команди - це її позиція у списку історії, яка може містити команди, відновлені з файлу історії (* Примітка. Bash History Services: :), тоді як номер команди - це положення в послідовності команд, виконаних під час поточного сеансу оболонки.

Занурившись у джерело, 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 забуває, яка команда пов'язана з номером команди, що робить номер команди непридатним ні для чого, крім відображення та прокрутки посилань.


5

Наскільки я можу сказати (і це, мабуть, підтверджено вашими дослідженнями), немає жодного способу інтерактивно посилатися на це магічне число чи не через fcабо !nярлики. Вони, звичайно, посилаються лише на абсолютне положення в списку історії, а не на відносне положення, оскільки ця конкретна оболонка почалася (на що це \#посилається, як ви правильно вказали).

Єдиний спосіб, коли я знайшов зробити це приємніше, - це встановити наступне:

export HISTFILESIZE=1001
export HISTSIZE=-1

Цей шлях:

  1. починається історія нового сеансу 1000, що дозволяє простіше визначити, де я на сесії
  2. (дещо не пов'язано) я не втрачаю старішої історії за певний сеанс (але все одно не заливаю файл)

В основному, я повернув мій модифікований запит ( PS1="\\!$ ") з:

499$ 

до:

1000$ 

... що робить його трохи чистішим на старті. Але це, мабуть, не відповідь, яку ви шукали. :)

(До речі, я також розглядав zsh на вирішення, і, здається, він просто не має еквівалента \#, так що теж не допомагає.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.