重击:“历史编号”与“命令编号”


11

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

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

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

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


2
我在网上进行了非常深入的搜索-据我所知,这个“命令号”仅在告诉您输入了多少个命令时才有价值。我找不到互动使用此数字的方法,例如历史扩展
Lagrangian

1
有趣的问题。如果您将该评论作为答案,我会投赞成票。
彼得·科德斯

Answers:


1

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;                                                            

它仅具有其他用途:in中eval.c,在运行命令时会递增:

# ...
current_command_number++;                                                  

executing = 1;                                                             
stdin_redir = 0;                                                           

execute_command (current_command);                                         

保留的只是一个数字,而不是实际命令甚至是等效的历史记录编号。因此,在执行每个命令时,bash会忘记与哪个命令编号关联的命令,从而使该命令编号不可用于显示和滚动参考之外的任何其他操作。


5

据我所知(您的研究似乎证实了这一点),没有办法交互式地引用该魔术数字,或者不通过fc!n快捷方式来引用该魔术数字。那些肯定似乎仅指历史列表中的绝对位置,而不是相对于此特定shell启动以来的相对位置(\#正如您正确指出的那样,这是指)。

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

export HISTFILESIZE=1001
export HISTSIZE=-1

那样:

  1. 新会话的历史记录始于1000,这使识别会话中的位置更加容易
  2. (有点无关)我不会在给定会话中丢失较旧的历史记录(但仍不会淹没文件)

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

499$ 

至:

1000$ 

...这使它在启动时更加清洁。但这可能不是您想要的答案。:)

(顺便说一句,我也查看了zsh的解决方案,看来它根本没有等效的\#,因此也完全没有帮助。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.