如何在Fish Shell中获取带参数的上一条命令?
Fish Shell中获取上一条命令并实现语音通知的方案
核心方案:自动拆分同行内的前一条命令
Fish的$history会记录整行命令,我们可以通过字符串处理拆分出同行中执行的前一个命令单元。修改你的sr函数如下:
function sr # 获取上一条历史记录(整行内容) set last_line $history[1] # 按分号/逻辑运算符拆分,提取第一个命令并去除多余空格 set last_cmd (echo $last_line | awk -F '[;&]' '{print $1}' | xargs) if test $status -eq 0 say -v Samantha "$last_cmd finished" else say -v Samantha "$last_cmd failed" end end
使用时直接保持原有习惯:docker-compose build; sr,函数会自动提取docker-compose build并播报对应的结果。
纯Fish内置工具方案(无外部依赖)
如果不想依赖awk,可以用Fish自带的string工具实现更安全的解析:
function sr set last_line (history --max 1) # 优先找分号的位置,没有则找逻辑与运算符 set cmd_end (string index -of ';' $last_line) if test -z $cmd_end set cmd_end (string index -of '&&' $last_line) end # 截取并整理命令内容 if test -n $cmd_end set last_cmd (string substring -l (math $cmd_end - 1) $last_line | string trim) else set last_cmd $last_line end if test $status -eq 0 say -v Samantha "$last_cmd finished" else say -v Samantha "$last_cmd failed" end end
替代方案:显式传递命令参数
如果自动解析遇到复杂命令(比如命令本身包含分号),显式传参的方式更可靠:
function sr set cmd $argv[1] if test $status -eq 0 say -v Samantha "$cmd finished" else say -v Samantha "$cmd failed" end end
使用时写成:docker-compose build; sr "docker-compose build",虽然需要重复输入命令,但逻辑清晰,不会出现解析错误。
注意事项
- 上述自动解析方案支持
;、&&、||等常见的命令分隔符; - 若同行有多个命令(如
cmd1; cmd2; sr),会自动提取cmd2作为目标命令; - 命令本身包含分隔符时,建议使用显式传参方案。
内容的提问来源于stack exchange,提问作者MJV
相关产品推荐
相关产品推荐

