Skip to content

fish 分卷

本页结论:fish 是「开箱即用」的现代交互 Shell——语法高亮、自动建议、合理默认一应俱全,但语法与 POSIX 不兼容:没有 $( )、没有 done/esac、没有 $?,命令替换用括号、一切变量用 set、块以 end 收尾、退出码读 $status。它适合交互与自管工具脚本,不适合直接搬 bash 脚本。本卷全部行为结论来自 alpine 3.22 内装 fish 4.0.2 容器中采集的真实输出快照(demos/fish/*.out.txt),学习路径为 syntaxargspitfalls

一句话定位

fish = 开箱即用但语法不兼容 POSIX。

  • 交互体验零配置即用,是许多人的日常终端首选;
  • 脚本语法自成一派,可读性高(所有块以 end 收尾),但 bash/zsh 脚本不能直接拿来跑;
  • 与 bash、zsh 的差异,见本目录另外两卷以及 /matrix/args-matrix

版本基线

快照 demos/fish/00_env.fish.out.txt(容器内真实采集):

text
version=fish, version 4.0.2
shell=fish
platform=linux
  • fish 没有官方独立镜像:以 tag+digest 双锁定的 alpine:3.22 为基底 apk add --no-cache fish 内装(见 demos/fish/Dockerfile,基底镜像登记在仓库根 .env.versionsALPINE_IMAGE);
  • 采集方式:scripts/run-docker-demos.js 先构建该 Dockerfile,再在容器内逐个运行 demos/fish/*.fish,stdout 写入源码旁同名 *.out.txt
  • 快照只收录 stdout:01_hello_io 里发往 stderr 的那一行不会出现在快照里。

统一任务覆盖(9 任务)

9 个统一任务在 fish 中的脚本与输出快照(快照与源码同目录,位于仓库 demos/ 内,在线浏览见 GitHub demos/fish):

#任务脚本输出快照
00环境信息(版本、平台)demos/fish/00_env.fishdemos/fish/00_env.fish.out.txt
01Hello 与 I/O(stdout/stderr、$statusdemos/fish/01_hello_io.fishdemos/fish/01_hello_io.fish.out.txt
02变量与引用(set、列表、插值)demos/fish/02_variables_quoting.fishdemos/fish/02_variables_quoting.fish.out.txt
03入参解析($argvstatus filenamedemos/fish/03_args_parsing.fishdemos/fish/03_args_parsing.fish.out.txt
04控制流(for/while、string match 过滤)demos/fish/04_control_flow.fishdemos/fish/04_control_flow.fish.out.txt
05函数与作用域(return 退出码、-l 局部)demos/fish/05_functions_scope.fishdemos/fish/05_functions_scope.fish.out.txt
06管道与文件(glob、grep|wc、列表计数)demos/fish/06_pipes_files.fishdemos/fish/06_pipes_files.fish.out.txt
07错误处理(if not、失败不中断)demos/fish/07_errors.fishdemos/fish/07_errors.fish.out.txt
08综合实战(string match; and/; ordemos/fish/08_real_world.fishdemos/fish/08_real_world.fish.out.txt

统一输入数据在 demos/shared/fixtures/orders.csv(1 表头 + 5 笔订单,其中 3 笔 paid)与 data/app.logconfig.csvreadme.txt 三个文件)。fish 九个任务的输出与 bash/zsh 完全一致(如 paidCount=3statusCounts=paid:3,pending:1,refunded:1)——同一任务,语法体系完全不同,输出逐行相同,这正是统一任务矩阵的价值。

学习路径

  1. 语法骨架set 命令、括号命令替换、end 收尾的块、$status——fish 语法的六块积木;
  2. 入参模型:没有 $0/$#/$@,fish 用 $argvcount $argvstatus filename
  3. 真实陷阱:POSIX 不兼容清单、管道子 shell 语义、$status 被快速覆盖。

相关页面

Released under the MIT License.