![Bash:“历史编号”与“命令编号”](https://linux22.com/image/62182/Bash%EF%BC%9A%E2%80%9C%E5%8E%86%E5%8F%B2%E7%BC%96%E5%8F%B7%E2%80%9D%E4%B8%8E%E2%80%9C%E5%91%BD%E4%BB%A4%E7%BC%96%E5%8F%B7%E2%80%9D.png)
在谷歌搜索如何通过 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
那样:
- 新会话的历史记录从 开始
1000
,这样可以更轻松地识别我在会话中所处的位置 - (有些不相关)我不会在给定会话中丢失较旧的历史记录(但仍然不会淹没文件)
基本上,它把我修改后的提示(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 会忘记哪个命令与哪个命令编号相关联,从而导致命令编号无法用于除显示和滚动引用之外的任何用途。