如何在Fish Shell中获取完整的当前执行命令?
解决方案
你遇到的问题本质是fish默认不会实时同步命令到历史文件,且别名的静态替换特性不足以满足动态获取运行时上下文的需求,按以下方式调整即可实现预期效果:
1. 放弃别名,改用fish函数实现
将以下内容写入~/.config/fish/functions/notify.fish(如果目录不存在先手动创建),或者直接添加到~/.config/fish/config.fish中:
function notify # 提前保存上一条命令的退出状态,避免后续操作覆盖 set last_status $status # 手动同步当前会话的执行历史到历史文件 history merge # 读取最近一条执行的完整命令 set current_cmd (history | head -n1) # 生成通知标题 if test $last_status = 0 set notify_title "$current_cmd 执行成功" else set notify_title "$current_cmd 执行出错,退出码 $last_status" end # 调用terminal-notifier发送通知 terminal-notifier -message "Done with [$current_cmd]" \ -title $notify_title \ -sound default \ -ignoreDnD end
2. 方案说明
- 加
history merge的原因是fish默认只会在会话退出时将本次会话执行的命令写入历史文件,手动执行该命令可以强制实时同步,解决历史读取延迟的问题 - 函数开头先保存
$status是因为history merge执行成功后会把$status重置为0,会覆盖你之前执行的业务命令的真实退出状态 - 该方案可以完整获取包含参数、管道符、多命令分隔符的整行执行内容,完全符合你
echo 1; notify的使用场景需求
内容的提问来源于stack exchange,提问作者MLProgrammer-CiM
相关产品推荐
相关产品推荐

