ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

fish-shell 提示符登录信息辅助函数 prompt_login:用法、源码解析与自定义实践

fish-shell 提示符登录信息辅助函数 prompt_login:用法、源码解析与自定义实践 CLI开发工具【免费下载链接】fish-shellThe user-friendly command line shell.项目地址https://gitcode.com/GitHub_Trending/fi/fish-shell点击查看免费下载prompt_login是 fish-shell 内置的一个提示符辅助函数用于在交互式提示符prompt中描述当前登录状态显示当前用户名、主机名并自动标识 shell 是否运行在 chroot 环境中当前支持读取 Debian 系的debian_chroot文件。本文以 doc_src/cmds/prompt_login.rst 文档为主体结合 share/functions/prompt_login.fish 源码实现讲解其输出行为、配色机制与自定义 fish_prompt 的实战方法。函数定位提示符中的“登录信息”组件fish 的提示符不像其他 shell 那样由固定的 PS1 模板决定而是通过运行一个函数来构建——即fish_prompt函数它打印什么终端就显示什么见 Writing your own prompt。为了让用户快速、一致地写出信息丰富的提示符fish 提供了一组现成的辅助函数其中prompt_login描述当前登录输出用户主机并附带 chroot 环境提示见 doc_src/cmds/prompt_login.rstprompt_hostname只输出主机名prompt_pwd输出缩短后的当前工作目录fish_is_root_user判断当前是否为 root 用户供提示符切换符号或颜色fish_vcs_prompt显示版本控制信息。从 CHANGELOG.rst 的记载看prompt_login是一个后来引入的辅助函数用于在提示符中描述“登录类型”用户、主机与 chroot 状态取代了旧的 “debian chroot” 提示实现并已集成进默认提示符与 terlar 提示符。语法与基本调用prompt_login不需要任何参数prompt_login它把结果直接打印到标准输出不带换行因此典型用法是放在fish_prompt中与其他组件拼接。原文档给出了最简示例function fish_prompt echo -n (prompt_login) (prompt_pwd) $ end运行效果假设用户为 root、主机名为 bananablaster_ prompt_login rootbananablasterecho -n用于抑制换行(prompt_login)是命令替换将其输出内联进提示符字符串后面再接prompt_pwd输出的缩短路径与提示符结束符。输出内容拆解用户、主机与 chrootprompt_login的输出由三部分组成对应三个维度的登录信息用户名来自 fish 内建变量$USER以fish_color_user颜色渲染主机名来自prompt_hostname即$hostname去掉第一个.之后的后缀以fish_color_host颜色渲染两者之间用连接chroot 环境标记若检测到 chroot会在最前面额外打印形如(chroot:xxx)的黄色标记。以源码 share/functions/prompt_login.fish 中的输出语句为证echo -n -s (set_color $fish_color_user) $USER (set_color --reset) (set_color $color_host) (prompt_hostname) (set_color --reset)即完整输出为用户主机其中用户名与主机名分别着色不带颜色。chroot 检测debian_chroot 机制剖析prompt_login会判断 shell 是否运行在 chroot 环境中。当前支持 Debian 系的debian_chroot机制其检测流程在 share/functions/prompt_login.fish 中实现if not set -q __fish_machine set -g __fish_machine set -l debian_chroot $debian_chroot if test -r /etc/debian_chroot set debian_chroot (command cat /etc/debian_chroot) end if set -q debian_chroot[1] and test -n $debian_chroot set -g __fish_machine (chroot:$debian_chroot) end end要点如下全局缓存__fish_machine结果被缓存到全局变量__fish_machine中首次调用后才真正探测。由于提示符每次命令执行后都会重绘缓存避免了反复读取/etc/debian_chroot的开销两种取值来源优先使用环境变量$debian_chroot若其未定义或为空则尝试读取/etc/debian_chroot文件存在且可读时test -r通过才读取文件内容即 chroot 名称拼装格式当解析出非空 chroot 名称时__fish_machine被设为(chroot:名称)输出若缓存变量非空则以黄色打印该标记并跟一个空格if set -q __fish_machine[1] echo -n -s (set_color yellow) $__fish_machine (set_color --reset) end因此在 chroot 环境中提示符会呈现类似(chroot:buildd) roothost的效果让用户一眼看出当前命令执行环境与宿主机不同。SSH 与配色远程主机的颜色区分登录方式也会影响输出配色。源码 share/functions/prompt_login.fish 通过$SSH_TTY判断当前是否为 SSH 会话set -l color_host $fish_color_host if set -q SSH_TTY; and set -q fish_color_host_remote set color_host $fish_color_host_remote end本地会话主机名使用fish_color_hostSSH 远程会话SSH_TTY已设置且fish_color_host_remote已定义时主机名改用fish_color_host_remote从而在视觉上区分“本机”与“远程机”用户名始终使用fish_color_user。这三个颜色变量都属于 fish 的颜色变量体系可由主题theme统一定义。例如 share/themes/none.theme 中定义了fish_color_host --reset fish_color_host_remote yellow fish_color_user --reset而 share/themes/catppuccin-mocha.theme 则给出了更精细的配色如fish_color_host 89b4fa、fish_color_host_remote a6e3a1、fish_color_user 94e2d5。你也可以在~/.config/fish/config.fish中用set -g fish_color_user ...等方式自定义或用fish_config交互式调整。实战把 prompt_login 集成进自定义提示符原文档的核心示例是把prompt_login与prompt_pwd组合。下面给出一个可复制的完整fish_prompt覆盖用户、主机、目录、git 状态与退出码等常见要素function fish_prompt set -l last_status $status echo -n -s (prompt_login) (set_color $fish_color_cwd) (prompt_pwd) (set_color --reset) echo -n -s (fish_vcs_prompt) if test $last_status -ne 0 set_color red echo -n [$last_status] set_color --reset end echo -n $ end保存到~/.config/fish/functions/fish_prompt.fish后即可生效也可以先用funced fish_prompt交互编辑满意后用funcsave fish_prompt落盘相关用法参见 doc_src/cmds/funcsave.rst。在默认提示符中的实际位置值得参考的是fish 自带的默认提示符正是以prompt_login打头的。见 share/functions/fish_prompt.fishecho -n -s (prompt_login) (set_color $color_cwd) (prompt_pwd) $normal (fish_vcs_prompt) $normal $prompt_status $suffix 也就是说开箱即用的默认提示符结构为登录信息(用户主机)→ 缩短路径 → git 状态 → 管道状态 → 结束符。同一结构也出现在 share/prompts/default.fish 与 share/prompts/astronaut.fish 中而 share/prompts/terlar.fish 则直接用prompt_login作为提示符首行。想体验这些内置提示符可以运行fish_config prompt show # 列出全部示例提示符 fish_config prompt choose terlar # 为当前会话选用 terlar与相关辅助函数的分工只想要主机名用prompt_hostname其实现见 share/functions/prompt_hostname.fish本质是string replace -r -- \..* $hostname即截取主机名的第一个点之前部分root 场景prompt_login会显示真实用户名若想在 root 时切换提示符符号如#可配合fish_is_root_user见 share/functions/fish_is_root_user.fish这也是默认提示符的做法。小结prompt_login是一个小而实用的提示符组件它一次调用即可输出“用户名 主机名 chroot 标记 SSH 远程配色”等登录维度信息并自带结果缓存与颜色变量支持。掌握了它的输出规则doc_src/cmds/prompt_login.rst和实现细节share/functions/prompt_login.fish之后你就可以像 fish 的默认提示符一样在自定义fish_prompt中灵活复用并结合prompt_pwd、fish_vcs_prompt、fish_is_root_user等辅助函数搭建出信息完整、观感清爽的提示符。赞分享CLI开发工具【免费下载链接】fish-shellThe user-friendly command line shell.项目地址https://gitcode.com/GitHub_Trending/fi/fish-shell点击查看免费下载相关推荐fish shell 提示符定制完全指南从零编写 fish_prompt 与深度源码解析fish shell 提示符定制完全指南从零编写 fish_prompt 与深度源码解析 导读 fish_prompt 是 fish shell 中负责绘制命CLI开发工具pyasc 中 TPipe.release_event_id 详解HardEvent 事件 ID 的申请、使用与释放pyasc 中 TPipe.release_event_id 详解HardEvent 事件 ID 的申请、使用与释放 导读 在 CANN pyasc 项目中CLI开发工具fish 右提示符 fish_right_prompt 完整指南定义、定制与源码原理fish 右提示符 fish_right_prompt 完整指南定义、定制与源码原理 导读 fish_right_prompt 是 fish shell 中用CLI开发工具上一篇使用 Terraform Provider for Onyx 查询全部连接器onyx_connectors 数据源实战指南下一篇Story Vertical 布局规范深度解析基于 ppt-master 的 9:16 竖版故事画布设计系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表