Bash:“历史编号”与“命令编号”

Bash:“历史编号”与“命令编号”

在谷歌搜索如何通过 PS1 变量自定义 shell 提示符时,我看到了可以使用的特殊字符表。尤其:

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

“历史编号”似乎更常用,我知道如何使用诸如!523重做历史命令之类的命令。但我不知道“命令号”是否具有类似的功能。我尝试放入\#PS1 变量,它似乎输出在特定会话中输入的命令数(与 不同\!,它在注销/退出后仍然存在)。

有人知道如何以方便或有意义的方式使用“命令号”吗?

答案1

据我所知(这似乎已被您的研究证实),没有办法以交互方式或不通过快捷方式引用该神奇fc数字!n。这些当然似乎仅指历史列表中的绝对位置,而不是自该特定 shell 启动以来的相对位置(\#正如您正确指出的那样,这是 waht 所指的)。

我发现让这个变得更好的唯一方法是设置以下内容:

export HISTFILESIZE=1001
export HISTSIZE=-1

那样:

  1. 新会话的历史记录从 开始1000,这样可以更轻松地识别我在会话中所处的位置
  2. (有些不相关)我不会在给定会话中丢失较旧的历史记录(但仍然不会淹没文件)

基本上,它把我修改后的提示(PS1="\\!$ ")从:

499$ 

到:

1000$ 

...这使得它在开始时更干净一些。但这可能不是您正在寻找的答案。 :)

(顺便说一句,我还查看了 zsh 来寻找解决方案,似乎它根本没有相当于 的解决方案\#,所以这也没有任何帮助。)

答案2

Bash 的命令编号仅用于显示。

首先,一些背景bashref:

命令编号和历史编号通常是不同的:命令的历史编号是它在历史列表中的位置,其中可能包括从历史文件恢复的命令(*note Bash History Facilities::),而命令编号是在当前 shell 会话期间执行的命令序列中的位置。

潜入源头,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 会忘记哪个命令与哪个命令编号相关联,从而导致命令编号无法用于除显示和滚动引用之外的任何用途。

相关内容