CLI开发工具【免费下载链接】fish-shellThe user-friendly command line shell.项目地址https://gitcode.com/GitHub_Trending/fi/fish-shell点击查看免费下载history是 fish-shell 中用于查看、检索、删除与维护交互式命令历史的核心命令它由history函数交互式封装与historybuiltin底层实现双层协作构成。本文以 history.rst 为骨架结合 history 函数、builtin 实现 与 历史存储模块 的源码完整讲解 7 个子命令、全部选项、三种匹配模式、时间戳输出、批量删除交互以及通过fish_history变量实现会话级历史隔离与私密模式等实战能力读完即可熟练管理自己的命令历史。命令全景函数与 builtin 的双层结构在 fish 中执行history时实际先进入 share/functions/history.fish 中定义的history函数。该函数负责用argparse解析选项与子命令并校验--prefix、--contains、--exact三者互斥--exact与搜索类选项互斥提供交互式能力删除前的确认提示、清空前的确认、通过分页器展示搜索结果将参数转发给真正的builtin history完成实际读写。而 src/builtins/history.rs 中的historybuiltin 才是直接操作 src/history/history.rs 中History对象的执行者负责搜索、删除、合并、保存、清空、追加等磁盘操作。文档在描述各子命令时反复强调这是history函数的特性或这是 builtin 的行为正是因为交互行为与底层行为分属两层。命令语法Synopsishistory [search] [--show-time] [--case-sensitive] [--exact | --prefix | --contains] [--max N] [--null] [--reverse] [SEARCH_STRING ...] history delete [--case-sensitive] [--exact | --prefix | --contains] SEARCH_STRING ... history merge history save history clear history clear-session history append COMMAND ...history用于搜索、删除以及以其他方式操作交互式命令历史在文档中对应history-search一节。所有选项既可以出现在子命令之前也可以紧跟子命令之后。七个子命令详解search搜索历史默认操作history search返回匹配搜索字符串的历史条目若不提供搜索字符串则返回全部历史条目。当未指定任何子命令时search就是默认操作——只有当你恰好要搜索search、delete、merge等子命令同名关键词时才需要显式写出history search。默认使用--contains包含匹配模式除非你显式指定了其他匹配方式。条目默认按从新到旧排序使用--reverse可反转。当 stdout 连接到终端tty时history函数会把输出通过分页器展示默认调用__fish_anypager即less等工具并在$LESS未预设时为其设置--quit-if-one-screen --RAW-CONTROL-CHARS等参数见 share/functions/history.fish 第 76-100 行而 builtin 本身只把结果写入 stdout。从 src/history/history.rs 的search方法可以看到底层行为搜索按--max限制匹配数量逐条调用format_history_record格式化输出非反向时边搜边输出反向--reverse时先收集再整体输出当输出流写入失败例如用户按 Ctrl-C 中断分页时会中止搜索。delete删除历史条目history delete删除匹配的历史条目默认使用--exact精确匹配模式。若未指定--exact删除前会弹出一个交互提示让你选择要删除哪些条目输入单词all删除全部匹配条目输入方括号中的单个 ID如[3]仅删除该条目输入多个 ID或空格分隔的 ID 区间批量删除如7 10..15 35直接回车不删除任何内容。这一交互删除行为由history函数实现share/functions/history.fish 第 102-186 行函数先以--null模式搜索出匹配条目并编号打印再通过read读取用户选择支持5..12这类区间展开、path sort -u去重排序后逐条调用builtin history delete --exact --case-sensitive删除。builtin 层只支持--exact --case-sensitive的删除方式见 src/builtins/history.rs 第 296-314 行若指定了非--exact模式会报错builtin history delete only supports --exact若未加--case-sensitive会报错builtin history delete --exact requires --case-sensitive。merge立即合并其他会话的历史通常情况下fish 会忽略在当前会话之后启动的会话所做的历史变更。history merge会立即把这些外部变更吸收进当前会话底层对应history.incorporate_external_changes()。在私密模式下fish_history被置为空字符串无法执行 mergebuiltin 会报错cant merge history in private mode。save立即写入历史文件history save立即把所有变更写入历史文件。shell 本身会自动保存历史该命令是为内部使用提供的普通用户一般无需手动调用。clear清空历史文件history clear清空整个历史文件。除非使用builtin history跳过函数封装否则删除前会显示确认提示要求输入yes才真正清空见 share/functions/history.fish 第 192-211 行。builtin 层对应history.clear()后立即history.save()。clear-session清空当前会话的历史history clear-session只清空当前会话产生的历史记录。注意如果在某个会话中执行过history merge或builtin history merge那么 merge 之前被并入的内容不会被清除只有 merge 之后产生的历史会被擦除。builtin 层对应history.clear_session()后history.save()。append无需执行即可追加历史history append COMMAND ...把给定命令追加进历史而不需要真正执行它。这常用于脚本中批量注入历史或恢复误删的条目。函数在未提供参数时会交互式提示Command:见 share/functions/history.fish 第 215-222 行builtin 层则对每个参数调用history.add_commandline()。选项参考选项含义适用范围-C/--case-sensitive大小写敏感匹配。默认是大小写不敏感search / delete-c/--contains匹配包含指定文本的条目。search的默认模式。delete 暂不支持search-e/--exact精确匹配指定文本。delete的默认模式。注意默认仍然大小写不敏感真正区分大小写须加-Csearch / delete-p/--prefix匹配以指定文本开头的条目。delete 暂不支持search-t/--show-time[格式]为每条历史条目前置记录时间。默认 strftime 格式为# %c%n可自定义如--show-time%Y-%m-%d %H:%M:%S 或--show-time%a%I%p。短选项-t不接受格式串、只使用默认格式。支持任意 strftime 格式包括%s输出自 epoch 起的原始 Unix 秒search-z/--null搜索输出以 NUL 字符而非换行符结尾。便于用read -z处理多行历史条目search-n N/--max N只输出前 N 条匹配条目。仅对history search有效search-R/--reverse结果按从旧到新排序大多数 shell 的顺序默认是从新到旧search--color WHEN控制历史条目语法高亮着色时机。WHEN为auto默认仅当输出是终端时着色、always、neversearch-h/--help显示命令帮助全局源码佐证builtin 的选项解析定义在 src/builtins/history.rs 第 72-89 行SHORT_OPTIONS CRcehmn:pt::z与LONG_OPTIONS表。其中-p/-c/-e分别映射到底层SearchType::PrefixGlob、ContainsGlob、Exactsrc/history/history.rs 第 59-75 行定义了完整的SearchType枚举-t是可带可选参数的选项缺省格式串时回落到# %c%n-n/--max通过fish_wcstol解析为数字非数字时报NOT_NUMBER错误。函数层的argparse还额外注册了t/show-time?问号表示可选参数与n#max、color等并把--prefix、--contains、--exact声明为互斥--exclusive c,e,p见 share/functions/history.fish 第 7-12 行。实战示例history clear # 删除全部历史条目函数层会先要求输入 yes 确认 history search --contains foo # 输出所有包含字符串 foo 的历史命令 history delete --prefix foo # 交互式删除所有以 foo 开头的命令。 # 你可以用空格分隔的多个 ID或类似 5..12 的区间一次选中多条。更完整的组合示例# 只看最近 20 条历史并带时间戳 history --show-time%Y-%m-%d %H:%M:%S --max 20 # 大小写敏感、从旧到新查找包含 SSH 的条目 history search --contains --case-sensitive --reverse SSH # 把搜索结果以 NUL 结尾输出方便管道处理 history search --null git | read -z # 非交互式精确删除builtin 层必须同时 --exact 与 --case-sensitive builtin history delete --exact --case-sensitive rm -rf /tmp/x # 手动把另一终端会话的历史并入当前会话 history merge自定义历史文件名fish_history变量默认情况下交互式命令会被记录到$XDG_DATA_HOME/fish/fish_history通常是~/.local/share/fish/fish_history。你可以为当前 shell 会话把fish_history变量设置为其他名字变量未设置时默认值是fish对应$XDG_DATA_HOME/fish/fish_history若设为例如fun历史将被写入$XDG_DATA_HOME/fish/fun_history设置为空字符串意味着完全不存储历史——这与浏览器中的无痕/私密会话特性类似。你可以随时修改fish_history例如set -x fish_history session_name立即生效。若将其设为default则使用默认会话名即fish。源码层面src/history/history.rs 的history_id_from_var第 1690-1714 行精确实现了上述规则变量不存在 → 使用默认会话名fishDFLT_FISH_HISTORY_SESSION_ID变量为空字符串 → 返回Memory(MemoryHistoryId::PrivateMode)即纯内存私密模式不落盘变量是合法变量名 → 返回Disk { session_id }对应独立的磁盘历史文件变量名非法不是合法变量名→ 记录错误日志并回退到默认fish。而立即生效则由 src/env_dispatch.rs 第 196-199 行的handle_fish_history_change实现fish_history变更时调用reader_change_history(history_id)让读取器立即切换到新会话历史。这也解释了为何history merge在私密模式下被拒绝in_private_mode检查见 src/builtins/history.rs 第 334-339 行。与 bash/zsh 的HISTFILE有何不同bash 与 zsh 使用名为HISTFILE的变量实现类似功能。fish 使用不同名字是为了避免冲突并表明行为不同fish 接受的是会话名而非文件路径。此外只要把fish_history设为fish或default以外的值就会阻止导入 bash 历史——这个功能最常见的用途是在做演示时避免泄露私人或敏感的历史记录。底层存储原理append-only、压缩与 mmap从 src/history/history.rs 顶部的模块注释可以看到 fish 多会话并发写历史的完整策略这也是理解merge/save/clear-session语义的基础所有历史文件都是 append-only 的——数据一旦写入就不再修改历史文件可以被重写vacuum读入整个文件并写出新文件同时执行维护任务——按 LRU 方式丢弃条目直到达到期望的最大数量、去除重复条目、按时间戳排序计划中尚未实现。新文件通过rename()原子替换旧文件历史文件通过mmap()映射每个条目只需在内存中保存一个usize偏移量按需惰性加载从而降低内存消耗对历史文件的访问需要同步默认通过flock()加锁实现在src/fs.rs若不可用则使用一种不完美的回退方案——检测竞争并在检测到竞争时重试。此外模块中还定义了PersistenceModeDisk/Memory/Ephemeral用于控制单条历史项的落盘方式以及VACUUM_FREQUENCY 25的压缩频率常量。历史文件的序列化与解析位于 src/history/yaml_backend.rsYAML 风格格式src/history/file.rs 负责 mmap 映射、条目解码与文件类型推断。注意事项与兼容性--prefix与--contains同时指定时以最后一个出现的标志为准函数层用argparse --exclusive声明互斥builtin 层逐个覆盖search_type。--contains与--prefix目前不被delete子命令支持builtin 只支持--exact --case-sensitive删除函数层会对非精确模式先交互列出候选再逐个精确删除。历史子命令也可以写成对应的长选项形式这是为了向后兼容而保留的例如history search可写作history --search同理--delete、--merge、--save、--clear分别对应各子命令。这些长选项已被弃用将在未来版本中移除。函数层在 share/functions/history.fish 第 10-12 行也标注了S-search D-delete M-merge V-save X-clear为 deprecated 选项builtin 侧的LONG_OPTIONS中同样以私有字符码保留了这些映射src/builtins/history.rs 第 82-86 行源码注释明确为保持 fish 3.0 之前的行为不被破坏而暂缓移除。--max只对search有效clear、clear-session、merge、save不接受任何选项与参数builtin 的check_for_unexpected_hist_args会校验并报subcommand takes no options/ 参数个数错误。交互式补全执行history时可通过 Tab 补全子命令与选项具体规则定义在 share/completions/history.fish——--prefix/--contains/--exact/--show-time/--case-sensitive对search与delete有效--max/--null/--reverse/--color仅对search有效且刻意不为内部使用的save提供补全。赞分享CLI开发工具【免费下载链接】fish-shellThe user-friendly command line shell.项目地址https://gitcode.com/GitHub_Trending/fi/fish-shell点击查看免费下载相关推荐Arthas history 命令全解析查看、检索与清理 Java 诊断会话的命令历史Arthas history 命令全解析查看、检索与清理 Java 诊断会话的命令历史 本文以 Arthas 官方文档 history 命令说明 https:开发工具可观测性调试器性能剖析radare2历史功能命令历史与会话管理终极指南radare2历史功能命令历史与会话管理终极指南 radare2作为一款强大的UNIX like逆向工程框架提供了完整的命令历史与会话管理功能让逆向工程工逆向工程网络安全Powerlevel9k命令历史统计history segment实用配置Powerlevel9k命令历史统计history segment实用配置 你是否经常在终端中工作时忘记自己执行过哪些命令是否想快速了解当前会话的命令执行情开发工具CLI上一篇Excel VBA共通函数封装GUID生成与进度条实现高级技巧下一篇gsd-core 运行时集成边界Kiro 为何不能作为一等公民运行时进入内核wontfix 决策全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考