Bash: “число истории” по сравнению с “числом команды”

Одним центральным различием является намного больше применимой командной строки в системах Linux (подобные UNIX системы в целом, действительно). Таким образом Введение в Командную строку по flossmanuals.net не могло бы быть худшим запуском.

Это покрывает основной (синтаксис, перемещение), усовершенствованный выход (например, передача по каналу, процессы, структура файловой системы) и усовершенствованные темы (например, полномочия, SSH, устанавливая программное обеспечение), а также различные текстовые редакторы, основы о сценариях..., о, и глоссарии, который мог бы быть полезен для начинающего.

11
30.03.2015, 18:04
2 ответа

Номер команды Bash предназначен только для отображения.

Во-первых, немного предыстории изbashref:

The command number and the history number are usually different: the history number of a command is its position in the history list, which may include commands restored from the history file (*note Bash History Facilities::), while the command number is the position in the sequence of commands executed during the current shell session.

Копаясь в исходниках, в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 забывает, какая команда связана с каким номером команды, что делает номер команды непригодным для чего-либо, кроме отображения и ссылки на прокрутку.

1
27.01.2020, 19:59

Насколько я могу сказать (и это, кажется, подтверждено вашим исследованием), нет способа обратиться к этому магическому номеру, или не через Fc ] или ! N ярлыки. Те, кто, как, кажется, называют только абсолютному положению в списке истории, а не относительное положение, поскольку эта специфическая оболочка началась (что является Waht \ # относится к, как вы правильно указали).

Единственный способ, которым я обнаружил, что это приятнее здесь - установить следующее:

export HISTFILESIZE=1001
export HISTSIZE=-1

Таким образом:

  1. История нового сеанса начинается в 1000 , что облегчает идентификацию, где я В сеансе
  2. (несколько не связан), я не теряю всю историю в данной сессии (но все еще не заполнил файл)

в основном, он повернул мою модифицированную подсказку ( PS1 = «\\! $» ) От:

499$ 

к:

1000$ 

... Что делает его небольшим уборщиком на старте. Но это, вероятно, не ответ, который вы искали. :)

(Кстати, я также смотрел на ZSH для решения, и кажется, что он просто не имеет эквивалента \ # , так что это тоже не помогает. )

5
27.01.2020, 19:59

Теги

Похожие вопросы