# GNU Coreutils 兼容性审计 这里记录 WinuxCmd 需要对齐的 GNU 参数兼容清单。它是持续维护的 对照表,不是 GNU 手册的逐字复制;每一行都只摘要对兼容有价值的 参数和差异,并链接到官方手册页。 ## 依赖策略 这批工作先不引入第三方库。优先使用 C++ 标准库和 Win32 API 写小型 内部工具。只有在能显著降低维护成本、且依赖足够小、足够稳定时,才 重新评估第三方库。 ## 文档规则 - 所有 GNU 参考链接都指向官方手册页。 - 行内参数只保留与兼容性有关的短项和长项,不重复 `--help` / `--version`。 - `commands_implementation` 负责实现侧状态,这个页面负责 GNU 对照总览。 - 高频命令会写得更密一些,方便直接拿来做 AI 参数对照表。 ## 通配符展开规则 - 只有显式接入 `contains_wildcard` / `glob_expand` 的命令才会展开通配符。 - WinuxCmd 接收的是 shell 解析后的参数;支持通配符的命令会按各自的文件参数策略展开。 - 普通 `*` / `?` 模式仍然优先尝试字面路径;但 `[]` 字符类模式现在会先 按 glob 展开,即使同名的字面路径真实存在;只有在 `[]` 没有匹配结果时, 才回退到原始字面路径。 - 字符类匹配支持字面集合、范围、GNU 风格的取反 `[!...]` 和 `[^...]`,也支持 bracket expression 里前导字面 `]`, 例如 `[]]` 和 `[!]]`。 - 父目录段里的通配符现在也支持 `*`、`?`、`[]`,不再只限最后一段文件名; 例如 `dir*\*.txt`、`dir?\*.txt`、`dir[12]\*.txt` 这类模式也会跨匹配到的子目录继续展开。 - 这个展开策略只作用于文件类位置参数,例如 `ls *.txt`、`cat *.log`、 `wc *.txt`;不作用于表达式、脚本或正则参数,例如 `grep` 模式、`find -name`、`sed` 脚本、`sort` 键定义。 - 如果一个参数把通配符当数据而不是路径模式,就必须保持字面值。 - 输出目标和语法敏感参数保持字面值。 - 多参数命令可以分别展开每个文件类输入,但不能在展开后偷偷改 变参数角色。 - `diff`、`diff3`、`split`、`csplit` 这类固定参数个数的命令,必须 拒绝歧义的通配符展开,并要求最终参数个数与命令契约严格一致。 | 命令 | GNU 参考 | 当前状态 | 下一步缺口 | |---|---|---|---| | `cat` | [cat invocation](https://www.gnu.org/software/coreutils/manual/html_node/cat-invocation.html) | `-A`、`-b`、`-E`、`-n`、`-s`、`-T`、`-v` 已进入实现;文件参数走统一通配符策略,包括支持父目录 segment 里的 GNU 风格 `[]` 字符类,并且当 `[]` 有匹配结果时优先按 glob 展开,而不是优先使用同名字面路径;`-u` 只作兼容占位,而且缺失文件和目录的诊断现在也会更接近 GNU 的不带引号形状,例如 `cat: FILE: No such file or directory` 和 `cat: DIR: Is a directory`,同时目录 operand 也不再塌缩成缺失文件错误 | `-A` / `-v` 的 GNU 细节边界、二进制与旧式无缓冲语义 | | `grep` | [grep invocation](https://www.gnu.org/software/grep/manual/html_node/grep.html) | `-E`、`-F`、`-G`、可重复 `-e/--regexp`、可重复 `-f/--file`、`-i`、`-w`、`-x`、`-v`、`-m`、`-b`、`-n`、`-c`、`-l`、`-L`、`-r`、`-R`、`-A`、`-B`、`-C`、`-o`、`-q`、`-z`、`-H/-h`、`--label`、`--line-buffered`、可重复 `--include`、可重复 `--exclude`、可重复 `--exclude-from`、可重复 `--exclude-dir`、`--binary-files`、`-a/--text`、`-I`、`-D/--devices`、`--group-separator`、`--color[=WHEN]` / `--colour[=WHEN]` 等常用参数已进入实现;裸 `--color` 默认为 `auto`,接受 `always|auto|never`,非法颜色模式会失败;零字节 `-f/--file` pattern 文件提供零个 pattern、不会匹配任何行,而包含空行的 pattern 文件仍会匹配每一行;默认 `--binary-files=binary` 在未启用 `-z` 时按 NUL 判断二进制输入,抑制详细匹配输出,除 `-q` 外会输出 GNU 形状的 binary-match 诊断,且 `-s` 不会隐藏该诊断;普通换行分隔的文本匹配现在会在应用锚点、整行匹配和常规行输出前先剥掉 CRLF 记录尾部的 `\r`,而 `-z` 仍保持按字节处理;include/exclude 文件规则保留命令行顺序,最后一个匹配规则生效,且命令行文件参数按名称后缀匹配;`--exclude-dir` 也会跳过匹配的命令行目录,并忽略目录 glob 末尾斜杠;文件参数现在也会在更深路径层级消费共享的 `[]` 通配符语义,并且当字符类有匹配结果时优先按 glob 展开,而不是优先使用同名字面路径;模式/大小写/文件名前缀/上下文冲突选项按最后一次出现生效;`--label` 会在显示文件名前缀时作为 stdin 文件名;上下文区间会合并且不重复输出,匹配行前缀用 `:`,上下文行前缀用 `-`,分离区间使用 GNU 风格 group separator;`-o` 与上下文参数同用时会警告并忽略上下文;模式保持字面值,文件参数展开 | locale/单词边界细节、Windows 特殊文件边界、GREP_COLORS 细节,以及 PCRE 模式 | | `sed` | [sed invocation](https://www.gnu.org/software/sed/manual/html_node/sed-invocation.html) | 可重复 `-e/--expression` 与 `-f/--file` 会按命令行顺序执行;没有 `-e/-f` 时只有第一个非选项参数作为脚本;`-n/--quiet/--silent`、`-E/-r`、`-s`、`-z/--null-data/--zero-terminated`、`-u/--unbuffered`、`-b/--binary`、`-l/--line-length`、`-i[SUFFIX]` / `--in-place[=SUFFIX]` 已纳入;就地编辑省略 suffix 时不保留备份,suffix 不含 `*` 时追加到文件名,含 `*` 时每个 `*` 替换为当前文件名;`s///` replacement 已支持 `&`、`\1`-`\9`、数字 occurrence、`g`、`p`、`I/i`;地址取反 `!`、`first~step`、`0~step`、`/regex/I` 已支持;`=` 可输出输入行号,`l` 可用可见转义列出 pattern space 并按 line length 折行;脚本保持字面值,文件参数展开 | 更深的地址范围、NUL 数据边界、真正无缓冲流式处理和脚本边界 | | `echo` | [echo invocation](https://www.gnu.org/software/coreutils/manual/html_node/echo-invocation.html) | `-n`、`-e`、`-E` 已实现,另外还保留本地扩展 `-u/--upper` 和 `-r/--repeat`;裸 `echo` 现在也会按 GNU/uutils 语义成功输出单独一个尾随换行,而不是把空参数列表当作错误,`\n`、`\t`、`\c`、`\xHH`、`\uHHHH`、`\UHHHHHHHH` 这类常用反斜杠转义也已接入,GNU 旧式八进制转义如 `\43`、`\101`、`\777` 现在也可用,`\c` 现在也会按 GNU/Coreutils 形状同时抑制后续输出和尾随换行,`-e` / `-E` 也改成 GNU/uutils 风格的最后一次出现优先级,像 `\ `、缺少十六进制数字的 `\x`,以及裸 `\u` / `\U` 这类未知或不完整转义现在也会保留前导反斜杠,`\xFF` 这类非 UTF-8 输出字节和多字节 UTF-8 字节序列现在也有测试覆盖,同时 `POSIXLY_CORRECT` 下也会默认启用转义处理、保留 `-n`、忽略 `-E` 的关闭作用,并把非前导单独 `-n` 的“像选项的参数”当普通文本处理 | 更完整的转义集合,以及 GNU 与 shell portability 的剩余边角 | | `cp` | [cp invocation](https://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html) | `-a/--archive` 现在会触发递归复制,并保留 Windows 时间戳/属性;`-p`、`-i`、`-r/-R`、`-t`、`-v`、`-f`、`-n`、`-u`、`-T`、`-b/--backup`、`-S/--suffix`、`--strip-trailing-slashes` 已覆盖常见场景;`--strip-trailing-slashes` 现在会在查找前剥掉每个源操作数尾部的 `/` 或 `\`,因此像 `src.txt/` 这样的文件源参数也会按 GNU/微软版的方式成功处理,而目标参数保持原样;`-t` 要求目标是已存在目录,`-t` 与 `-T` 会冲突报错,自拷贝会拒绝,只有 `--force --backup` 自备份场景例外,普通文件复制不再自动创建缺失父目录;GNU 还常用 `-d`、`-l`、`-x`、`-Z`、`-H/-L/-P` | 超出 Windows 属性的 Unix owner/mode 保留、`--attributes-only`、`--reflink`、`--sparse`、`--remove-destination`、`--parents`、`--preserve` 子模式,以及完整 `--update=WHICH` 语义 | | `mv` | [mv invocation](https://www.gnu.org/software/coreutils/manual/html_node/mv-invocation.html) | 第一批里 `-t`、`-T`、`-f`、`-i`、`-I`、`--interactive[=never|once|always]`、`-n`、`-u`、`-b`、`-S`、`--strip-trailing-slashes` 已对齐;`-t` 和普通多源移动都要求目标是已存在目录,包括通配符展开后变成多源的情况,且 `-t` 与 `-T` 会冲突报错;覆盖模式选项族按 GNU 风格“最后一次出现生效”,且裸 `--interactive` 等价 `--interactive=always`;GNU 还常用 `-Z` | `--exchange`、`--no-copy`、`--context` | | `rm` | [rm invocation](https://www.gnu.org/software/coreutils/manual/html_node/rm-invocation.html) | `-f` 会忽略缺失 operand,包括无 operand 调用;普通无 operand 调用现在也会附带 GNU 风格的 `missing file operand` help hint;`-d/--dir` 会删除空目录;`-I`、`-i`、`--interactive[=never|once|always]`、递归删除、根目录保护、以及基于 Windows 卷的 `--one-file-system` 已纳入;`-f`、`-i`、`-I` 和 `--interactive=WHEN` 的提示/force 行为按 GNU 风格最后一次选项生效 | `--preserve-root=all` 和剩余 POSIX/GNU 诊断文案 | | `install` | [install invocation](https://www.gnu.org/software/coreutils/manual/html_node/install-invocation.html) | `-d`、`-b`、`-C/--compare`、`-g`、`-m`、`-o`、`-p`、`-s`、`-t`、`-T`、`-D`、`--debug`、`--strip-program`、`--preserve-context`、`-Z` 都已接入解析;源文件参数展开,目标和目录参数保持字面值;`-t` 与 `-T` 会冲突报错,通配符展开后变成多源时要求目标是已存在目录,`-D -t` 会创建目标目录,`-d` 会创建父目录 | Windows 上的 owner/mode/strip/SELinux 实际效果 | | `chmod` | [chmod invocation](https://www.gnu.org/software/coreutils/manual/html_node/chmod-invocation.html) | `-c`、`-f`、`-v`、`-R`、`--reference`、`--preserve-root`、`--no-preserve-root` 已有;`chmod -R --preserve-root /` 现在会在真正遍历前按 GNU/uutils 风格输出两行 failsafe 并拒绝执行;`chmod --reference=RFILE FILE...` 现在会先校验 reference 文件,缺失时按 GNU 形状报 `failed to get attributes of 'RFILE': No such file or directory`,并把 reference 文件的 Windows 只读属性近似复制到目标;`u+gr` 这类 malformed mode 现在也会在访问文件前按 GNU/uutils 风格报 `invalid mode` 并附带 help hint;GNU 风格的负 symbolic mode 形态如 `-w`、`file -w`、`-w -- file` 和重复的 `-w -w` 现在也已接受;GNU 还常用 `-H`、`-L`、`-P`、`--dereference` | 递归时的 symlink 策略,以及 Windows 上更深的 Unix mode 语义 | | `mkdir` | [mkdir invocation](https://www.gnu.org/software/coreutils/manual/html_node/mkdir-invocation.html) | `-p/--parents`、`-v/--verbose`、`-m/--mode`、`-Z/--context` 已有;缺少 operand 时现在会附带 GNU 风格 help hint;Windows 上 `-m` 会把命令行指定目录的写权限位映射到只读属性,`-p -m` 只应用到最终命名目录,不改变自动创建的父目录;`-Z/--context` 作为兼容占位接受 | 更完整的 chmod 风格 symbolic mode 和真实 Unix mode bits | | `mktemp` | [mktemp invocation](https://www.gnu.org/software/coreutils/manual/html_node/mktemp-invocation.html) | 常用的临时名生成功能已接入,支持 `-d`、`-u`、`-q`、`-p/--tmpdir`、`-t`;显式 `--suffix=SUFFIX` 现在也会在模板替换完成后追加后缀,因此 `mktemp --suffix=.txt file-XXXX` 会生成类似 `file-abcd.txt` 的名字;若 suffix 里包含 `/` 或 `\`,现在会用更接近 GNU/Microsoft 的 `invalid suffix 'SUFFIX', contains directory separator` 诊断拒绝;当使用 `-p/--tmpdir`,或模板本身带有目录组件时,输出现在也会像 GNU 一样保留生成出来的路径,而不是塌缩成 basename | 剩余 GNU `mktemp` 细节,包括完整默认 tempdir 行为和模板语法边界 | | `rmdir` | [rmdir invocation](https://www.gnu.org/software/coreutils/manual/html_node/rmdir-invocation.html) | `--ignore-fail-on-non-empty`、`-p/--parents`、`-v/--verbose` 已有;缺少 operand 时现在会附带 GNU 风格 help hint,把普通文件误传给 `rmdir` 时现在也会输出 `Not a directory`,不再只是裸 `failed to remove`,`-v` 现在也会在每次尝试删除前输出 GNU/uutils 形状的 `removing directory, 'DIR'` 提示行,包括失败的父目录清理尝试,而且 `-p` 在祖先目录因非空而停止时现在会返回非零退出码 | 更精确的 GNU 诊断文案和剩余父目录删除边界 | | `touch` | [touch invocation](https://www.gnu.org/software/coreutils/manual/html_node/touch-invocation.html) | `-a`、`-c`、`-d`、`-h`、`-m`、`-r`、`-t`、`--time` 已覆盖常见 GNU 用法;`-t [[CC]YY]MMDDhhmm[.ss]`、ISO 类 `-d`、紧凑纯数字 `-d` 时间串如 `YYYYMMDDhhmm` 和 `YYYYMMDDhhmmss`、UTC/GMT/Z/时区偏移后缀、`@epoch`、常见相对时间,以及以 `-r` 作为相对 `-d` 基准已覆盖;非法 `--time` 会失败 | BSD 兼容占位 `-f` 和更深的 GNU 日期语法边界 | | `ls` | [ls invocation](https://www.gnu.org/software/coreutils/manual/html_node/ls-invocation.html)、[listed information](https://www.gnu.org/software/coreutils/manual/html_node/What-information-is-listed.html)、[formatting file names](https://www.gnu.org/software/coreutils/manual/html_node/Formatting-the-file-names.html) | 常用显示/排序参数已更完整;`-i`、`-s`、`-S`、`-u`、`-h/--human-readable`、`--si`、`--block-size=SIZE`、`--sort=WORD`、`--format`、`--time`、GNU `--full-time`、GNU `--long`、GNU `--author`、`--time-style=locale|full-iso|long-iso|iso|+FORMAT`、`--indicator-style=WORD`、`--file-type`、`-Q/--quote-name`、`-b/--escape`、`-q/--hide-control-chars`、`-N/--literal`、`--show-control-chars`、`--hide=PATTERN`、常用 `--quoting-style=WORD`,以及 `--zero` 已接入;GNU `--format` 常见别名如 `vertical|columns`、`across|horizontal`、`commas`、`single-column|single|one`、`long|verbose` 现在都可接受;以 `.` 开头的名字现在会按 GNU 语义在默认模式下隐藏,而 `-A` 仍会显示这类 dotfile 但继续抑制 `.` 和 `..`;目录列表现在不仅在长格式下会输出 GNU 风格的 `total`,在 `-s/--size` 的非长格式布局下也会先输出 `total`,而且这个 `total` 头同样会跟随 `--zero` 走 NUL 结尾;`-m` 的换行逻辑现在也更接近 GNU/coreutils:当当前行放不下下一个条目时,会像 GNU 一样先在行尾输出 `,` 再换到下一行,而不是贪心地把更多条目塞进上一行;`-h` 会同时 humanize 长列表大小和 `-s`/`total`,`--si` 现在会对这些 humanized 大小使用十进制 1000 进位,而在 Windows 下 `--block-size=SIZE` / `-k` 现在只会缩放长格式 size 列,`-s` 与目录 `total` 仍保持 Microsoft/Coreutils 的分配字节口径,除非显式切到 human-readable 模式;无效 `--sort` / `--time` / `--format` / `--quoting-style` word 会失败,影响排序/时间/format/quoting 的选项按最后一次出现生效,GNU `--full-time` 现在也会按 `-l --time-style=full-iso` 生效,GNU `--long` 现在也会作为 `-l` 的直接别名生效,GNU `--author` 现在也会被接受,并且在 long format 下插入 author 列;在 Windows 上这列按 Microsoft/Coreutils 的近似做法复用 owner 名称,Windows 下的权限列现在也改成跟 Microsoft Coreutils 一样用 `rwxrwxrwx` 与 `r-xr-xr-x` 去近似只读属性,而不再按扩展名猜 Unix 执行位,GNU 的 `-g` / `-o` / `--no-group` 现在也会真的裁掉对应的 owner/group 列,而不只是进入长格式,`--hide=PATTERN` 现在也会只在默认模式下隐藏匹配项,而在 `-a` / `-A` 下被覆盖,同时 `--ignore=PATTERN` 在 all-mode 里仍会继续过滤,长格式里显示出来的 symlink target 现在也会一起跟随 quoting 规则,而不是把 `-> target` 后面的路径裸着输出,而且那些只在长格式下才应触发的 symlink 显示/跟随判断现在也会尊重这个最终胜出的 format,而不会被前面已经被覆盖的 `-l` 误导;默认输出现在也会按 GNU 的 TTY/non-TTY 分叉处理,在 stdout 不是终端且用户没有显式给出格式选项时,从隐式列布局退回单列输出,而显式 `-C` 这类格式请求仍然优先,并且不再在行尾残留 padding 空格;`-x` / 列布局在宽度边界上现在也会更接近 GNU/微软版,在还能放下时会多装入那一列,而更宽的 `-C/-x` 布局现在也会按 tab stop 输出列间 padding,并且对非默认 `-T/--tabsize` 取值、以及这两种别名之间“最后一次出现生效”的优先级也会一并对齐;symlink 解引用这一组 `-H`、`-L`、`--dereference-command-line-symlink-to-dir`、`--dereference-command-line-symlinks-to-dir` 现在也会按“最后一次出现生效”处理,因此元数据读取、长格式显示和递归跟随都会走同一套优先级;`--group-directories-first` 现在会把目录分组到普通文件前面,但在 `--sort=none` / `-U` 下会禁用,`--zero` 会把每条记录改成 NUL 结尾,并在非长格式下退回单列输出,`--time-style` 现在也会按常见 GNU/Coreutils 形状格式化 `locale`、`full-iso`、`long-iso`、`iso` 的近期/旧时间戳,并接受 `+FORMAT` 自定义格式,包括 `%s` 和 GNU 的 `+旧格式\n近期格式` 双格式写法,indicator 会附加在 C-quoted 名称外部,长格式下的符号链接现在也会显示 `name -> target`;真正的未解引用 symbolic link 仍会在 size 列里显示目标文本长度,而 Windows 目录 junction 现在会回到 `0`,从而与微软版/Coreutils 风格的 Windows 行为对齐,不再把显示出来的目标路径长度泄漏到 size 列里;长格式 `-a` 下的 `.` / `..` 现在也会重新读取真实目录元数据,而不再复用枚举阶段那份零尺寸记录,因此父目录 size 和 `total` 也会更贴近 Microsoft/Coreutils;而在 `-L` 解引用后的目录 symlink / junction 内容视图里,synthetic `.` 条目现在也会继续停留在目标目录视图上,而不会又退回成 link;命令行传入的悬空符号链接现在在长格式下也会继续列出,而不会被误报成不存在,缺失路径的 `cannot access` 诊断现在也会走 stderr,并返回 GNU/Microsoft 风格的退出码 `2`,而 Windows 目录 junction 现在会保留其存储的绝对 reparse target,不再被压缩成同目录下的相对名字,同时会去掉原始 namespace 前缀,例如 `\??\` 和 `\\?\`;命令行目录与 junction operand 现在也接受像 `dir/`、`junc/` 这样的尾分隔符写法,同时继续保留用户原始 operand spelling;长格式彩色输出里的 `name -> target` 现在也会把 link 名和 target 分开着色,而不是整个跨度只刷一种 link 颜色;`ls -R` 自己生成的递归目录头现在也会把 Win32 拼出来的 `\` 统一规范回 GNU 风格的 `/`,例如 `./subdir:`;在长格式里 `-F` / `--classify` / `--file-type` 现在会把 indicator 挂在 symlink 或 junction 名字本身,并保持显示出来的 target 不再额外带装饰,这样会和 GNU/微软版一致显示成 `link@ -> target`;命令行目录 symlink operand 在 `-d -H` 和 `-d -L` 下现在也会更接近 GNU,不再显示 `name -> target`,而是直接显示解引用后的目录元数据;命令行文件操作数和 `-d` 目录操作数现在会保留用户传入的拼写,而不是塌缩成基名,所以 `ls -dR .` 会像 GNU/Microsoft 一样输出 `.`;目录 symlink 现在会按链接而不是普通目录显示,命令行传入的目录 symlink 现在也更接近 GNU:普通模式默认列出目标目录内容,而长格式默认仍显示链接本身,除非显式启用 `--dereference-command-line-symlinks-to-dir`,同时命令行 symlink operand 现在也会在 `-H` / `-L` 下把 long format 元数据切到目标对象,但仍保留原始 operand 名称;普通目录枚举到的 symlink 条目现在也会把 `-H` 严格限制在 command-line operand 上,而 `-L` 则会像 GNU 一样把显示出来的 long format 元数据切到 target;递归 `-L` 现在也会继续进入递归过程中遇到的目录 symlink;`[]` 通配符操作数现在也会优先按字符类 glob 展开,而不是在同名字面路径存在时直接停在字面值上,因此 `ls [ab].txt` 这类调用会更接近 GNU shell 展开后的效果;只有在字符类完全无匹配时,才会回退到原始字面 operand;硬链接计数走 Windows 文件元数据;默认 `-s` 输出和目录 `total` 头现在也改成更接近 Microsoft/Coreutils 在 Windows 下的口径,按分配字节统计,而不是先按 1K block 预除;`-h` / `--si` 仍会基于这套字节口径做人类可读化;多文件 operand 不再给普通文件加 header,但当同一调用里有 sibling operand 失败时,剩余目录或 junction 仍会保留 GNU 风格的 `dir:` 目录头;通配符匹配到目录时会列目录内容,除非启用 `-d` | 精确 GNU 终端默认 quoting、context 列、剩余 `-H`/`-L` symlink 细节,以及更宽泛的 `date` 格式 token 边界 | | `tee` | [tee invocation](https://www.gnu.org/software/coreutils/manual/html_node/tee-invocation.html) | `-a`、`-i`、`-p` 已有;`-a` 现在会追加而不是截断目标文件,`-i` 现在会为当前进程忽略 `SIGINT`,`-p/--diagnose` 现在会选择 GNU 风格的 `warn-nopipe` 写错模式,非法 `--output-error=MODE` 现在会失败而不是退回成 `warn`;输出文件参数是目标路径,保持字面值,而 `-` 这个文件参数现在也会按 GNU 语义额外再向标准输出复制一份,而不是当作普通文件名;单个输出文件打开失败时,现在也会像 GNU 一样继续写标准输出和其它已成功打开的目标,最后再返回非零;主复制路径现在也会保留原始字节流,因此 CRLF 输入和末尾无换行的最后一行都会按原样透传 | 剩余 pipe 专用 `--output-error` 行为、标准输出和错误路径边界 | | `head` | [head invocation](https://www.gnu.org/software/coreutils/manual/html_node/head-invocation.html) | `-c`、`-n`、`-q`、`-v`、`-z` 已有;计数后缀支持 GNU 十进制 `KB`/`MB`/`GB`/`TB`/`PB`/`EB`/`ZB`/`YB`/`RB`/`QB`、二进制 `K`/`M`/`G`/`T`/`P`/`E`/`Z`/`Y`/`R`/`Q`,以及 IEC `KiB` 到 `QiB`,溢出会报错;另外兼容传统 `-NUM` 写法和首参数旧式 `-[num][bkm][cqv]`,把这种旧式 `-NUM` 计数放到后续选项后面时,现在也会更接近 GNU 地报 `option used in invalid context`,缺失文件时也会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,多文件模式下遇到无法打开的 operand 时现在也不会再提前打印该文件的 header,而只会给真正成功打开的文件打印 header,而目录 operand 现在会输出更接近 GNU 的 `error reading 'DIR': Is a directory` 诊断 | 剩余 GNU 混合选项诊断、非目录类打开失败文案边界,以及少见计数后缀边界 | | `tail` | [tail invocation](https://www.gnu.org/software/coreutils/manual/html_node/tail-invocation.html) | `-c`、`-n`、`-q`、`-v`、`-z`、`-f`、`-F`、`--follow=name`、`--sleep-interval`、`--max-unchanged-stats`、可重复 `--pid`、`--debug`、`--retry`,以及 GNU `--use-polling` 已有;follow 模式每轮会检查所有被跟随文件,并在所有给定 PID 都不存在后退出,`-F` / `--follow=descriptor|name` 选项族现在按最后一次出现生效,`--use-polling` 现在也会被显式接受并映射到当前基于 polling 的 follow 实现,`--pid` 在未启用 follow 时现在也会输出更接近 GNU 的 ignored warning,而显式 `--retry` 现在也会在“未启用 follow”或“descriptor-follow 下仅对首次打开有效”这两类场景输出更接近 GNU 的 warning;另外,把旧式 `-NUM` tail count 放到后续选项后面时,现在也会更接近 GNU 地报 `option used in invalid context`,而不是 generic 的 unrecognized option,同时裸 `tail +NUM FILE` 现在也改成更接近现代 GNU 的路径,把 `+NUM` 当普通文件 operand,而不是旧式 count shorthand;计数后缀支持 GNU 十进制 `KB`/`MB`/`GB`/`TB`/`PB`/`EB`/`ZB`/`YB`/`RB`/`QB`、二进制 `K`/`M`/`G`/`T`/`P`/`E`/`Z`/`Y`/`R`/`Q`,以及 IEC `KiB` 到 `QiB`,溢出会报错;另外兼容传统 `-NUM` 写法,以及在不与正常解析冲突时也能跨普通多文件 operand 工作的旧式紧凑 `-[num][bcl][f]` 和 `+[num][bcl]` 形式,缺失文件时现在也会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,多文件模式下遇到无法打开的 operand 时现在也不会再提前打印该文件的 header,而只会给真正成功打开的文件打印 header,而目录 operand 现在会输出更接近 GNU 的 `error reading 'DIR': Is a directory` 诊断 | GNU follow 边界语义、剩余 `+NUM` 传统歧义模式、POSIX 版本相关诊断,以及非目录类打开失败文案边界 | | `sort` | [sort invocation](https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html) | `-b`、`-d`、`-f`、`-g`、`-h`、`-i`、可重复 `-k/--key`(支持 `F[.C][OPTS][,F[.C][OPTS]]`)、`-M`、`-n`、`-o`、`-R`、`--random-source`、`-S/--buffer-size`、`--parallel=N`、`--batch-size=N`、`--compress-program=PROG`、`-T/--temporary-directory=DIR`、`--sort=WORD`、`-s`、`-t`、`-u`、`-V`、`-z`,以及 GNU `--check-silent` 已覆盖常见 AI 使用场景;普通换行分隔输入现在会在排序前剥掉 CRLF 记录尾部的 `\r`,避免 Windows 文本文件输出时出现空白隔行,而 `-z` 仍保持 NUL 记录按字节原样处理;`--parallel` 现在会作为带校验的并发 hint 被显式接受,但当前 Windows 实现本身仍保持单线程排序,`--batch-size` 也会作为带校验的 merge hint 被显式接受,但暂时还不改变当前 merge 策略,`--compress-program` 现在也会作为“非空即可”的压缩 hint 被显式接受,但暂时还不改变当前临时文件管线,`-T/--temporary-directory` 现在会作为“必须是已存在目录”的临时目录 hint 被显式接受,但暂时还不改变当前临时文件策略,`-t \0` / `--field-separator=\0` 会把 NUL 作为字段分隔符,全局排序模式按最后一次出现生效,`-n` 使用 GNU 风格数字前缀且不接受前导 `+` 或指数记法,`-h` 按符号、SI 后缀、数值比较,`-u` 按排序键等价去重并关闭整行兜底排序,`-c/-C/--check-silent -u` 会拒绝相邻等键记录,`-b` 会影响 `-k F.C` 字符计数,结束位置 `.0` 表示字段末尾,缺失输入文件时现在会输出 GNU 形状的 `cannot read: FILE: No such file or directory` 诊断,非 check 错误返回状态 2 | 更强的 `-m` 合并语义、精确的每键选项继承规则、`--debug`、真正的压缩临时文件接线,以及 locale 相关排序边界 | | `uniq` | [uniq invocation](https://www.gnu.org/software/coreutils/manual/html_node/uniq-invocation.html) | `-c`、`-d`、`-D`、`-f`、`-i`、`-s`、`-u`、`-w`、`-z`,以及 `--group` / `--all-repeated` 族参数的常见行为已对齐;普通换行分隔输入现在会在比较和输出前剥掉 CRLF 记录尾部的 `\r`,避免 Windows 文本文件出现空白隔行,而 `-z` 仍保持 NUL 记录按字节原样处理;缺失输入文件现在会输出更接近 GNU 的 `missing.txt: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory`,不再伪装成路径缺失 | GNU 分组分隔符的精确行为、分隔符位置边界,以及 locale 相关比较细节 | | `wc` | [wc invocation](https://www.gnu.org/software/coreutils/manual/html_node/wc-invocation.html) | `-c`、`-m`、`-l`、`-L`、`-w`、`--debug`、`--files0-from`、`--total` 已进入实现;`--debug` 会在 stderr 报告当前可移植计数路径且不改变 stdout,`-m` 会按 UTF-8 code point 计数字符而非字节,`-L` 会按 8 列 tab stop 展开并处理简单宽字符宽度;文件参数会做通配符展开,而普通输入文件和 `--files0-from` 的 list 文件现在都会在缺失时输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,目录 operand 会输出 `Is a directory`;`--files0-from` 现在也不会再静默吞掉空的 NUL 分隔文件名,遇到零长度文件名会失败,而且当列表本身来自 stdin 时也会拒绝把 `-` 再当作一个输入文件名;空的 `--files0-from` 列表现在也会按 GNU 语义返回错误,而不是静默成功;GNU 风格的 `total` 现在也会按请求的输入个数而不是仅按成功打开的文件个数决定,因此多输入里部分失败时仍会打印 `total`,同时返回非零 | 精确 locale 相关单词/显示宽度语义,以及 GNU 输出对齐边界 | | `ln` | [ln invocation](https://www.gnu.org/software/coreutils/manual/html_node/ln-invocation.html) | `-s`、`-f`、`-i`、`-v`、`-n`、`-T`、`-t`、`-b`、`-S`、`-r`、`-L`、`-P`、`--dereference`、`-d/-F` 已接入;裸 `ln TARGET` 现在会在当前目录按目标 basename 创建链接,双参 `ln SOURCE DIR` 现在也会在第二个 operand 已存在且是目录时把它当目标目录,除非显式启用 `-T`,缺失源文件失败、目标已存在失败以及强制覆盖时的删除失败现在都会输出 GNU 形状文案,而不是 Win32 数字码/本地 `exists` 文案;`-t` 要求目标是已存在目录,`-t` 与 `-T` 会冲突,普通多源调用现在也按 GNU 的 `TARGET... DIRECTORY` 语义要求最后一个 operand 是已存在目录 | 备份命名细节、符号链接权限处理,以及剩余 GNU 目录/symlink 边界 | | `find` | [find invocation](https://www.gnu.org/software/findutils/manual/html_node/find_html/Invoking-find.html)、[operators](https://www.gnu.org/software/findutils/manual/html_node/find_html/Combining-Primaries-With-Operators.html)、[`-exec ... ;`](https://www.gnu.org/software/findutils/manual/html_node/find_html/Single-File.html)、[`-exec ... {} +`](https://www.gnu.org/software/findutils/manual/html_node/find_html/Multiple-Files.html) | `-L`、`-H`、`-name`、`-iname`、`-path`、`-ipath`、`-regex`、`-iregex`、`-type`、`-size`、`-empty`、`-mtime`、`-mmin`、`-newer`、`-mindepth`、`-maxdepth`、`-depth`、`-print`、`-print0`、`-printf`(`%p`、`%f`、`%h`、`%H`、`%P`、`%d`、`%D`、`%F`、`%g`、`%G`、`%l`、`%o`、`%u`、`%U`、`%S`、`%y`、`%Y`、`%s`、`%b`、`%k`、`%m`、`%M`、`%n`、`%i`、`%A@`、`%B@`、`%C@`、`%T@`,以及零填充本地时间组件子集 `%A{Y,m,d,H,M,S,j}`、`%B{Y,m,d,H,M,S,j}`、`%C{Y,m,d,H,M,S,j}`、`%T{Y,m,d,H,M,S,j}`、`%%`,并补上 GNU 风格的 `\c` 提前停止输出、八进制 `\NNN` 转义,以及对未识别转义 / 格式符发出 warning)、`-prune`、`-quit`、`-delete`、`-exec COMMAND {} ;`、`-exec COMMAND {} +`、`-ok COMMAND {} ;`、`-ok COMMAND {} +` 已到位;谓词表达式已支持 `-true`、`-false`、`!`、`-not`、隐式 AND、`-a/-and`、`-o/-or`、逗号表达式和括号,并按 GNU 优先级求值;`-L/-H/-P` 这一组符号链接模式现在也按 GNU 风格“最后一次出现生效”,因此 `-H` 只会跟随命令行根参数上的符号链接,遍历过程中遇到的符号链接仍保持 `-P` 语义,除非后面有 `-L` 覆盖它;普通 `-print` / `-printf` 路径本来就使用 GNU 风格 `/`,现在缺失根路径时的诊断也统一走同一套显示路径,不再把原始 Windows `\` 直接漏到输出里;当前目录 root 下默认 `-print` / `-print0` 输出现在会使用更接近 Microsoft 的 `.\` 前缀,同时保持后续相对路径部分稳定;`-print`、`-print0`、`-printf`、`-exec`、`-ok`、`-delete`、`-prune` 和 `-quit` 已在表达式作用域内按短路语义执行;`-type l` 现在也会把 junction 这类目录 reparse point 当作 link-like 条目处理,而不再让它们继续命中普通 `-type d`;`-printf %l` 现在也会像 GNU 一样,对 symlink-like 条目输出其存储的目标文本,在 Windows 上包括目录 junction,而普通非链接条目仍会展开为空串;`-printf %y` 现在也会把 junction 这一类目录 reparse point 按 GNU 风格当作 link 类型 `l` 输出;`-printf %Y` 现在也会对 symlink-like 条目输出其 referent 的类型,而对普通非链接条目则回落成当前条目类型;`-printf %s` 现在也会像 GNU 一样,对 symlink-like 条目输出显示出来的目标文本长度,而不再塌成 `0`;`-printf %b` 和 `%k` 现在也会以 Win32 `AllocationSize` 作为最接近的 Windows 近似,并对非空普通文件保留 GNU 风格的最小块数下限:512-byte block 视角至少为 `2`,1K block 视角至少为 `1`;`-printf %D` 现在也会输出 Win32 volume serial number,作为 GNU device number 在 Windows 上最接近的近似;`-printf %F` 现在也会输出 Windows 卷的 filesystem name,作为 GNU filesystem type 在本地最接近的近似;`-printf %o` 现在也会输出 Windows 卷的 cluster/block size,作为 GNU optimal I/O block size 在本地最接近的近似;`-printf %u/%g` 现在也会基于文件 security SID 输出 owner/group 名称;`-printf %U/%G` 现在也会输出 owner/group SID 最后一个 RID 分量,作为 GNU numeric uid/gid 在本地最接近的近似;`-printf %S` 现在也会对普通文件输出 Win32 allocated size 与 logical size 的比值,作为 GNU sparseness 在本地最接近的近似;`-printf %A@` 现在也会以 Windows last-access time 作为 GNU access time 在本地最接近的近似;`-printf %B@` 现在也会以 Windows creation time 作为 GNU birth time 在本地最接近的近似;`-printf %C@` 现在也会以 Windows creation time 作为 GNU status-change time 在本地最接近的近似;`%A/%B/%C/%T` 的时间组件子集现在也会暴露零填充的本地时间部分,作为 `@` epoch 形式之外一组更贴近 GNU 的稳定时间字段;`-printf %M` 现在也会为普通文件、目录和 junction 风格链接输出 GNU 形状的符号权限字符串;`-printf %n` 现在也会在常见文件和目录场景下输出 Win32 的硬链接计数;`-printf %i` 现在也会输出 Win32 文件索引,因此硬链接文件会共享同一个 inode-like 标识;`-delete` 与 `-prune` 现在也会按 GNU 的安全规则处理:如果没有显式写出 `-depth`,就直接失败,因为 `-delete` 会隐式启用 depth-first 遍历 | 完整 `-printf` 和完整 GNU 正则方言细节 | | `xargs` | [xargs invocation](https://www.gnu.org/software/findutils/manual/html_node/find_html/Invoking-xargs.html)、[conflicting options](https://www.gnu.org/software/findutils/manual/html_node/find_html/Conflicting-xargs-options.html) | `-0`、`-a`、`-d`、`-E`、`-e`、`-I`、`-i`、`-L`、`-l`、`-n`、`-P`、`-p/--interactive`、`-r`、`-s`、`-t`、`-x`、`--process-slot-var`、`--show-limits` 已覆盖常见命令构造;`-p` 会在每条生成命令执行前提示,并且只在回答 `y`/`Y` 时运行;`-r/--no-run-if-empty` 现在也按 GNU 语义只在 stdin 完全为空时跳过执行,而不会把纯空白输入误判成 empty;互斥的 `-I/-i`、`-L/-l`、`-n` 族按最后出现的冲突族生效,并且现在会输出更接近 GNU 的成对 warning,明确点名被忽略的前一个选项族,同时保留 GNU 的 `-I ... -n1` 静默例外;GNU 那个拆开的 `-L` / `--max-lines[=N]` 语义现在也补齐了:短选项 `-L` 仍然必须带参数,而裸 `--max-lines` 会按一条逻辑输入行处理,并且不会误吞后面的命令名;stdin 项由 `xargs` 按字面传递,不做通配符展开,而命令模板参数现在会走共享通配符策略,因此 `xargs cmd ... *.txt` 在 Windows 上也会更接近 shell 先展开后的 GNU 调用,并在 wildcard 无匹配时继续回退到原始字面 token;父目录段里的 wildcard 现在也会展开,所以 `dir*\*.txt`、`dir?\*.txt` 这类模板参数不再错误地保持字面值;`-a/--arg-file` 打开失败时现在也会对常见缺失输入场景输出更接近 GNU 的 `Cannot open input file 'FILE': ...` 诊断;逻辑 EOF 标记现在也和 GNU 一样只作用在默认解析路径上,在显式 `-d` / `-0` 分隔模式下会被忽略;默认 blank-splitting 解析路径现在也会把 EOF 处孤立的反斜杠按字面 `\` 保留下来,而不是直接报错,更接近 GNU 默认解析器语义,同时未闭合的单引号和双引号现在也会分别输出更接近 GNU 的 parser 诊断,并带上 `unless you use the -0 option` 提示,而不再只是笼统的 quote 错误;隐式按换行分隔的 replacement 模式现在也会更接近 GNU `-I`/`--replace` 地跳过独立的空白或仅含空白字符的输入行,未显式给命令时退回的默认 `echo` 路径也会保持这种“一条输入行对应一次命令”的 replacement 形状,而且现在也会保留 GNU 风格的“行尾空白继续到下一逻辑行”语义;显式分隔符模式现在也会在 `-d` 和 `-0` 路径里保留连续分隔符之间的零长度 item,而不是静默丢掉,显式传空的 `-d`/`--delimiter` 现在会直接失败而不会悄悄退回默认空白分隔,同时像 `-d '\\x'`、`-d '\\q'` 这类 malformed escape 现在也会落到更具体的 delimiter-escape 诊断,而不再退回旧的泛化 `single character` 错误;未显式给命令时退回的默认 `echo` 路径现在也会遵守 `-s/--max-chars` 分批,以及 GNU 形状的 `-x/--exit` 超限失败,而不是绕过命令行长度限制;过大的 `-s` 值现在会被 warning 提示后收敛到 Windows 命令行上限,而过小的 `-s` 值现在也会被抬到命令自身可执行的下限,更接近 GNU `--show-limits` 行为;子进程退出码现在按 GNU 常见语义区分“子命令已启动”和“子命令压根没启动”:普通子进程 `1..127` 退出统一映射到 `123`,常见 shell 风格的 `>127` signal-shaped 退出现在会按 Windows 近似映射到 `125`,子进程 `255` 映射到 `124`,而启动失败仍保留 `127` 表示命令找不到、`126` 表示找到了但不可执行;子进程 `255` 现在也会像 GNU 一样停止继续启动后续命令,但会先等已经在运行的 `-P` 子进程结束,而当前 `-P` 并发池也会优先复用先完成的 child slot,而不是按启动顺序 FIFO 阻塞 | Windows 上真正的 signal 终止检测、更大的 `-P` 池边界,以及 console/TTY prompt 精确兼容 | | `cut` | [cut invocation](https://www.gnu.org/software/coreutils/manual/html_node/cut-invocation.html) | `-b/--bytes`、`-c/--characters`、`-d/--delimiter`、微软/FreeBSD 扩展 `-w` 空白字段模式、`-f/--fields`、`-s/--only-delimited`、`--complement`、`-n/--no-partial`、`-O/--output-delimiter`、`-z/--zero-terminated` 已有;field 模式默认输出无分隔符行,`-s` 才跳过,空 `-d ''` 表示 NUL,多字符分隔符现在会按更接近 GNU 的 `the delimiter must be a single character` 诊断并附带 help hint 失败;`-w` 现在会把连续空格/Tab 视为一个字段分隔符,同时保留行首/行尾空字段,默认输出分隔符为 TAB,并且会按微软实测在与 `-d` 同时出现时失败;无效的 0 或空 field-list 位置现在也会区分成 GNU 风格的 `fields are numbered from 1` 与 `byte/character positions are numbered from 1` 诊断,而不再统统塌成泛化的 range 错误;普通换行分隔模式现在会在 field/byte/character 选择前先剥掉 CRLF 记录尾部的 `\r`,而 `-z` 仍保持按字节处理,文件参数走统一通配符策略,缺失输入文件现在会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory` | 超出 UTF-8 边界保留以外的完整 locale 字符语义 | | `tr` | [tr invocation](https://www.gnu.org/software/coreutils/manual/html_node/tr-invocation.html)、[character arrays](https://www.gnu.org/software/coreutils/manual/html_node/Character-arrays.html) | `-c/-C`、`-d`、`-s`、`-t` 已按 byte-oriented 输入接入;SET 支持转义、升序字节范围,以及 ASCII `[:CLASS:]` 名称(`alnum`、`alpha`、`blank`、`cntrl`、`digit`、`graph`、`lower`、`print`、`punct`、`space`、`upper`、`xdigit`);delete+squeeze 现在先按 SET1 删除,再按最后指定的 SET 压缩重复字节;参数个数诊断现在会区分裸 `missing operand`、翻译模式缺少 `SET2`、`-d -s` 缺少压缩集合,以及纯删除模式多余集合,并附带 GNU/uutils 风格 help hint;反向范围如 `z-a` 现在也会输出更接近 GNU 的 `range-endpoints of 'z-a' are in reverse collating sequence order` 诊断,而不再只是笼统的范围顺序错误 | locale/多字节字符类、等价类、重复输出数组,以及更深的序列解析诊断 | | `df` | [df invocation](https://www.gnu.org/software/coreutils/manual/html_node/df-invocation.html) | `-a/--all`、`-B/--block-size=SIZE`、`-h/--human-readable`、`-H/--si`、`-i/--inodes`、`-k`、`-T/--print-type`、`-t/--type`、`-x/--exclude-type`、`--sync`、`--no-sync`、`--total` 已实现或作为 Windows 兼容输出接受;文件参数走统一通配符策略,过滤后零匹配仍保留 GNU 风格表头,Windows inode 输出使用 GNU 形状的占位列 | `--direct` 和真实文件系统 inode 计数 | | `du` | [du invocation](https://www.gnu.org/software/coreutils/manual/html_node/du-invocation.html) | `-a/--all`、`-A/--apparent-size`、`-B/--block-size=SIZE`、`-b/--bytes`、`-c/--total`、`-d/--max-depth=N`、`-h/--human-readable`、`--si`、`-k`、`-m`、`-0/--null`、`-S/--separate-dirs`、`-s/--summarize`、`-t/--threshold=SIZE`、`--time[=WORD]`、可重复 `--exclude=PATTERN`、`-X/--exclude-from=FILE`、`--files0-from=FILE` 已实现;默认输出使用 1024 字节块,后出现的 size-display 参数覆盖先出现的参数,`-m` 现在等价于 `--block-size=1M`,`-0/--null` 会用 NUL 结束输出记录,`-S/--separate-dirs` 现在会把子目录总量从父目录输出里排除,但仍单独输出子目录,`--block-size=human-readable|si` 可用,`--max-depth=0` 只输出根目录总量,裸 `--time` 现在会显示目录树中最新的所选时间戳,`--time=atime|access|use|ctime|status|mtime` 按 GNU 风格“最后一次出现生效”,`-H/--dereference-args` 作为 symlink 模式占位接受而不是 SI 输出,`--exclude` 和 `--exclude-from` pattern 保持选项字面值、不会被 workspace 通配符展开,`--files0-from` 会读取 NUL 分隔的 path 列表并拒绝再混用命令行 path operand,文件参数其余情况走统一通配符策略;Windows 当前以文件长度作为 size 来源,因此已分配大小与 apparent-size 是同一近似,而 `ctime`/`status` 暂时以 creation time 作为最接近的 Windows 对应物 | 完整 symlink 与文件系统边界(`-L`、`-P`、`-x`)、block-size 环境变量默认值、`--inodes`、`--time-style`,以及更精确的已分配块语义 | | `readlink` | [readlink invocation](https://www.gnu.org/software/coreutils/manual/html_node/readlink-invocation.html) | `-f/--canonicalize`、`-e/--canonicalize-existing`、`-m/--canonicalize-missing`、`-n/--no-newline`、`-q/-s/--quiet/--silent`、`-v/--verbose`、`-z/--zero` 已实现;裸模式读取 Windows symlink/junction reparse target,canonical 模式会规范化 Windows 路径且现在按 GNU 风格“最后一次出现生效”,missing operand 现在会附带 GNU 风格 help hint,默认诊断保持 quiet,`-q/-s/-v` 诊断选项族现在也按 GNU/uutils 风格“最后一次出现生效”,并且在 `POSIXLY_CORRECT` 下裸 regular file 失败时现在会输出诊断,同时忽略 `-q/-s` | 精确 GNU symlink loop、相对 target 和 Windows reparse point 边界 | | `realpath` | [realpath invocation](https://www.gnu.org/software/coreutils/manual/html_node/realpath-invocation.html) | `-e/--canonicalize-existing`、`-m/--canonicalize-missing`、`-E/--canonicalize`、`-q/--quiet`、`-s/--strip`、`-z/--zero`、`--relative-to=DIR`、`--relative-base=DIR` 已实现;现在要求至少提供一个 path operand,missing operand 现在会附带 GNU 风格 help hint,默认 canonicalize 要求父路径存在,`-m` 才允许缺失路径组件,且 canonicalization mode 选项族现在按 GNU 风格“最后一次出现生效”;空 path operand、空 `--relative-to=`、空 `--relative-base=` 现在也会按 GNU/uutils 形状报 invalid-empty-operand 诊断;在 `-e` 下,`--relative-to` / `--relative-base` 现在要求解析后必须是目录 | `-L` 与 `-P` 的完整 GNU symlink 顺序语义,以及不存在 drive root 的剩余边界 | | `truncate` | [truncate invocation](https://www.gnu.org/software/coreutils/manual/html_node/truncate-invocation.html) | `-c/--no-create`、`-s/--size`、`-r/--reference`、`-o/--io-blocks` 已实现;支持 GNU size 前缀 `+`、`-`、`<`、`>`、`/`、`%`,以及十进制、二进制和 IEC 后缀;显式 `--size` 覆盖 `--reference`,选项 operand 保持字面值,只有文件 operand 展开通配符 | sparse file 分配细节和文件系统 block size 边界 | | `basename` | [basename invocation](https://www.gnu.org/software/coreutils/manual/html_node/basename-invocation.html) | `-a/--multiple`、`--mul`、`-s/--suffix`、`--suf`、`-z/--zero`、`--ze` 已实现;`-s` 即使拿到空 suffix 也会隐含多 name 模式,`-z` 输出 NUL 分隔符,纯斜杠根路径如 `/`、`//`、`///` 现在都会归一成单个根分隔符,当 `SUFFIX` 恰好等于剩余 basename 全名时会保留而不是错误剥空,且非 multiple 模式下第 3 个参数会按 GNU 风格报 `extra operand` 并附带 help hint,同时也接受 uutils 已覆盖的长选项缩写 | 当前 Windows 范围之外更深的路径编码边界 | | `dirname` | [dirname invocation](https://www.gnu.org/software/coreutils/manual/html_node/dirname-invocation.html) | 多 name 操作和 `-z/--zero` 已实现,同时接受 Windows 反斜杠和普通斜杠;missing operand 现在会附带 GNU 风格 help hint,纯斜杠根路径如 `/`、`//`、`///` 现在都会归一成单个根分隔符,而且 `/usr/` 这类绝对顶层路径现在也会正确保留 `/` 作为父目录 | 当前 Windows 范围之外更深的路径编码边界 | | `stat` | [stat invocation](https://www.gnu.org/software/coreutils/manual/html_node/stat-invocation.html) | `-c`、`--format`、`--printf`、`-f/--file-system`、`-L`、`-t` 已接入;常用文件格式字段已覆盖 `%n`、`%N`、`%s`、`%b`、`%B`、`%F`、`%A`、`%a`、`%h`、`%i`、`%d`、`%D`、`%o`、`%u/%U`、`%g/%G`、`%x/%X`、`%y/%Y`、`%z/%Z`、`%w/%W`;常用文件系统格式字段和 `--printf` 反斜杠转义已覆盖 AI 常用路径,且 missing operand 现在会带 GNU 风格 help hint,`-t` / `-c` / `--format` / `--printf` 这组输出选择选项现在按“最后一次出现生效” | 冷门 GNU format directive、精确 symlink 跟随语义、纳秒时间戳,以及 Windows 上真实 owner/group 身份 | ## 更多 GNU Coreutils - `base64` — [base64 invocation](https://www.gnu.org/software/coreutils/manual/html_node/base64-invocation.html); `base64 [option]... [FILE]`; `-d/--decode`、`-i/--ignore-garbage`、`-w/--wrap=COLS`; 关键点:默认 76 列折行,`--wrap=0` 关闭折行,decode 接受折行输入,非法输入会诊断,`--ignore-garbage` 可恢复有效负载,`-` 读 stdin;缺失输入文件现在会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory`;多余文件参数现在会按 GNU 风格输出 `extra operand 'FILE'`,并附带标准 help hint。 - `b2sum` — [b2sum invocation](https://www.gnu.org/software/coreutils/manual/html_node/b2sum-invocation.html); `b2sum [option]... [FILE]...`; `-l/--length`、`-b/--binary`、`-c/--check`、`--ignore-missing`、`-t/--text`、`-q/--quiet`、`-s/--status`、`-w/--warn`、`-z/--zero`、`--strict`、`--tag`; 关键点:普通摘要输出、BSD 风格 `--tag`、通配符文件参数、短选项 `-z` 与长选项 `--zero` 的 NUL 结尾输出、GNU 风格 `-l/--length` 对“任意正的 8 的倍数且不超过 512 bit”取值,以及常见 GNU hash-line 形式的 `-c/--check` 校验路径现在都可用,包括常见的 `HASH FILE` 和 `HASH *FILE` 记录;`--ignore-missing` 现在会在 check 模式下静默跳过校验列表里缺失的目标文件,不报错也不记失败;`--quiet` 现在会在 check 模式下隐藏逐文件 `OK` 行,但仍保留 `FAILED` 结果输出;`--status` 现在会在 check 模式下静默正常输出但保留退出码,`--warn` 现在会按 `FILE:LINE` 报 malformed checksum line 并补上 GNU 形状的汇总 warning,没有任何有效 checksum line 的校验文件现在也会按 GNU 形状以 `no properly formatted checksum lines found` 失败,不可读目标文件现在也会补上 GNU 形状的 `WARNING: N listed file(s) could not be read` 汇总,而且直接摘要和 `-c` 校验文件模式下现在都能区分“缺失路径”和“目录 operand”的 GNU 形状打开失败诊断,而普通摘要模式下即使给了 `-q/--quiet` 也会保持 GNU 风格继续输出文件名;剩余 gap 主要是更细的 GNU checksum 文件解析细节,以及当前 Windows fallback 仍然是 SHA-512 而不是真 BLAKE2。 - `base32` — [base32 invocation](https://www.gnu.org/software/coreutils/manual/html_node/base32-invocation.html); `base32 [option]... [FILE]`; `-d/--decode`、`-i/--ignore-garbage`、`-w/--wrap=COLS`; 关键点:RFC4648 padding/折行已对齐 GNU 形态,包括 stdin `-`、空输入、非法 decode 诊断;文件 operand 现在也会遵循统一的通配符展开策略;缺失输入文件现在会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory`;多余 operand 也会按 GNU 风格拒绝并附带标准 help hint。 - `basenc` — [basenc invocation](https://www.gnu.org/software/coreutils/manual/html_node/basenc-invocation.html); `basenc [option]... [FILE]`; `-d/--decode`、`-w/--wrap=COLS`、`-i/--ignore-garbage`、`--base64`、`--base64url`、`--base32`、`--base32hex`、`--base16`、`--base2msbf`、`--base2lsbf`、`--base58`、`--z85`; 关键点:必须且只能选择一个编码 selector,常用 selector 支持 encode/decode;文件 operand 现在也会和 `base32` / `base64` 一样走共享通配符策略;缺失输入文件现在会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory`;多余文件参数现在会按 GNU 风格输出 `extra operand 'FILE'` 并附带标准 help hint,`--base58` / `--z85` 会给出明确未实现诊断。 - `date` — [date invocation](https://www.gnu.org/software/coreutils/manual/html_node/date-invocation.html); `date [option]... [+FORMAT]`; `-d/--date`、`-u/--utc`、`-R/--rfc-email`、`--rfc-2822`、`-I/--iso-8601[=TIMESPEC]`、`--rfc-3339=TIMESPEC`; 关键点:ISO 类固定日期、UTC/GMT/Z/偏移后缀、`@epoch`、常用 format 转义、ISO-8601、RFC3339 和 RFC email 输出已覆盖常见 AI 工作流。 - `cksum` — [cksum invocation](https://www.gnu.org/software/coreutils/manual/html_node/cksum-invocation.html); `cksum [option]... [FILE]...`; `-a/--algorithm`、`-c/--check`、`--ignore-missing`、`-q/--quiet`、`-s/--status`、`-w/--warn`、`--strict`、`--tag`、`--untagged`、`--zero`、`--raw`、`-l/--length`; 关键点:GNU `cksum` 不是只有老式 CRC 路径,而且默认 CRC 输出现在会保持 GNU 风格的未标记 `CHECKSUM SIZE FILE` 形态,只有显式 `--tag` 时才输出 BSD 风格 `CRC32 (FILE) = DIGEST`,普通多文件运行时遇到不可读操作数也会继续处理后续文件,而不是在第一个错误处提前停止;普通输入路径和 `-c` 的 check-file 打开路径现在也会把缺失文件与目录分别收敛到更接近 GNU 的 `No such file or directory` / `Is a directory` 诊断;`--ignore-missing` 现在会在 `-c` 校验模式下静默跳过列表里缺失的目标文件,不报错也不记失败;`--quiet` 现在会在校验模式下隐藏成功的逐文件 `OK` 行,但仍保留 `FAILED` 结果和汇总;`--status` 现在会在校验模式下静默正常输出,但保留退出状态;`--warn` 现在会按 `FILE:LINE` 位置报告 malformed checksum line,并补上 GNU 形状汇总;当 malformed 记录和有效记录混在一起时,默认现在会像 GNU 一样忽略这些格式错误行,而 `--strict` 会让它们把校验结果变成失败;`-l` 现在也已经作为 `--length` 的短选项别名接入;当整个 check 文件里没有任何合法 checksum 记录时,现在也会按 GNU 形状报 `no properly formatted checksum lines found` 并失败;校验文件里列出的不可读目标现在也会补上 GNU 形状的 `WARNING: N listed file(s) could not be read` 汇总;mismatch 汇总现在只统计真正完成校验的记录数;未标记 `CHECKSUM SIZE FILE` 记录里的 `SIZE` 字段现在也会真正参与校验。 - `md5sum` — [md5sum invocation](https://www.gnu.org/software/coreutils/manual/html_node/md5sum-invocation.html); `md5sum [option]... [FILE]...`; `-b/--binary`、`-c/--check`、`--ignore-missing`、`-t/--text`、`-q/--quiet`、`-s/--status`、`-w/--warn`、`-z/--zero`、`--strict`、`--tag`; 关键点:普通摘要输出、BSD 风格 `--tag`、通配符文件参数、短选项 `-z` 与长选项 `--zero` 的 NUL 结尾输出,以及常见 GNU `-c/--check` 校验路径现在都可用,包括 `HASH FILE` 和 `HASH *FILE`;普通输入文件和 `-c` 的 check file 打开失败现在也会把缺失路径与目录 operand 分别收敛到更接近 GNU 的 `No such file or directory` / `Is a directory` 诊断;`--ignore-missing` 现在会在 check 模式下静默跳过校验列表里缺失的目标文件,不报错也不记失败;`--quiet` 会在 check mode 下隐藏逐文件 `OK` 行,`--status` 会隐藏常规输出但保留退出状态,`--warn` 现在会把 malformed checksum line 定位到 `FILE:LINE` 并补上 GNU 形状的汇总 warning,`--strict` 现在会在存在 malformed 校验行时失败,校验文件里列出的不可读目标现在也会补上 GNU 形状的 `WARNING: N listed file(s) could not be read` 汇总,而“整个校验文件没有任何合法 checksum 行”时现在也会按 GNU 形状报 `no properly formatted checksum lines found` 并失败;剩余 gap 主要是更窄的 check-file 解析边界和文件名转义细节。 - `sha1sum` — [sha1sum invocation](https://www.gnu.org/software/coreutils/manual/html_node/sha1sum-invocation.html); `sha1sum [option]... [FILE]...`; `-b/--binary`、`-c/--check`、`--ignore-missing`、`-t/--text`、`-q/--quiet`、`-s/--status`、`-w/--warn`、`-z/--zero`、`--strict`、`--tag`; 关键点:普通 SHA-1 摘要输出、BSD 风格 `--tag`、通配符文件参数、短选项 `-z` 与长选项 `--zero` 的 NUL 结尾输出、常见 GNU hash-line 形式的 `-c/--check` 校验路径现在都可用,包括 `HASH FILE` 和 `HASH *FILE`;普通输入文件和 `-c` 的 check file 打开失败现在也会把缺失路径与目录 operand 分别收敛到更接近 GNU 的 `No such file or directory` / `Is a directory` 诊断;`--ignore-missing` 现在会在 check 模式下静默跳过校验列表里缺失的目标文件,不报错也不记失败;`--quiet` 现在会在 check 模式下隐藏逐文件 `OK` 行,但仍保留 `FAILED` 结果输出,`--status` 现在会在 check 模式下静默正常输出但保留退出码,`--warn` 现在会按 `FILE:LINE` 形状报告 malformed checksum line 并输出 GNU 风格的 malformed-line 汇总,`--strict` 现在会在存在 malformed 校验行时失败,没有任何有效 checksum line 的校验文件现在也会按 GNU 形状以 `no properly formatted checksum lines found` 失败;不可读目标文件时 GNU 形状的 `WARNING: N listed file(s) could not be read` 汇总也可用;剩余 gap 主要是更细的 GNU check-file 解析边界和文件名转义细节。 - `sha224sum` — [sha224sum invocation](https://www.gnu.org/software/coreutils/manual/html_node/sha2-utilities.html); `sha224sum [option]... [FILE]...`; `-b/--binary`、`-c/--check`、`--ignore-missing`、`-t/--text`、`-q/--quiet`、`-s/--status`、`-w/--warn`、`-z/--zero`、`--strict`、`--tag`; 关键点:普通 SHA-224 摘要输出、BSD 风格 `--tag`、通配符文件参数、短选项 `-z` 与长选项 `--zero` 的 NUL 结尾输出、常见 GNU hash-line 形式的 `-c/--check` 校验路径现在都可用,包括 `HASH FILE` 和 `HASH *FILE`;普通输入文件和 `-c` 的 check file 打开失败现在也会把缺失路径与目录 operand 分别收敛到更接近 GNU 的 `No such file or directory` / `Is a directory` 诊断;`--ignore-missing` 现在会在 check 模式下静默跳过校验列表里缺失的目标文件,不报错也不记失败;`--quiet` 现在会在 check 模式下隐藏逐文件 `OK` 行,但仍保留 `FAILED` 结果输出,`--status` 现在会在 check 模式下抑制正常输出但保留退出状态;malformed 校验行现在会在 `--warn` 下输出 `FILE:LINE` 位置和 GNU 形状汇总 warning,`--strict` 现在会在存在 malformed 校验行时失败;完全没有有效校验行的 checksum 文件现在也会按 GNU 形状报 `no properly formatted checksum lines found`;不可读目标文件时 GNU 形状的 `WARNING: N listed file(s) could not be read` 汇总也可用;剩余 gap 主要是更窄的 GNU check-file 解析边界和文件名转义细节。 - `sha256sum` — [sha256sum invocation](https://www.gnu.org/software/coreutils/manual/html_node/sha2-utilities.html); `sha256sum [option]... [FILE]...`; `-b/--binary`、`-c/--check`、`--ignore-missing`、`-t/--text`、`-q/--quiet`、`-s/--status`、`-w/--warn`、`-z/--zero`、`--strict`、`--tag`; 关键点:普通 SHA-256 摘要输出、BSD 风格 `--tag`、通配符文件参数、短选项 `-z` 与长选项 `--zero` 的 NUL 结尾输出、常见 GNU hash-line 形式的 `-c/--check` 校验路径现在都可用,包括 `HASH FILE` 和 `HASH *FILE`,以及现在在直接摘要和 `-c` 校验文件模式下都能区分“缺失路径”和“目录 operand”的 GNU 形状打开失败诊断都已可用;`--ignore-missing` 现在会在 check 模式下静默跳过校验列表里缺失的目标文件,不报错也不记失败;`--quiet` 现在会在 check 模式下隐藏逐文件 `OK` 行,但仍保留 `FAILED` 结果输出;`--status` 现在会在 check 模式下抑制正常输出但保留退出状态;malformed 校验行现在会在 `--warn` 下输出 `FILE:LINE` 位置和 GNU 形状汇总 warning,`--strict` 现在会在存在 malformed 校验行时失败;完全没有有效校验行的 checksum 文件现在也会按 GNU 形状报 `no properly formatted checksum lines found`;不可读目标文件时 GNU 形状的 `WARNING: N listed file(s) could not be read` 汇总也可用;剩余 gap 主要是更窄的 GNU check-file 解析边界和文件名转义细节。 - `sha384sum` — [sha384sum invocation](https://www.gnu.org/software/coreutils/manual/html_node/sha2-utilities.html); `sha384sum [option]... [FILE]...`; `-b/--binary`、`-c/--check`、`--ignore-missing`、`-t/--text`、`-q/--quiet`、`-s/--status`、`-w/--warn`、`-z/--zero`、`--strict`、`--tag`; 关键点:普通 SHA-384 摘要输出、BSD 风格 `--tag`、通配符文件参数、短选项 `-z` 与长选项 `--zero` 的 NUL 结尾输出、常见 GNU hash-line 形式的 `-c/--check` 校验路径已经到位,包括 `HASH FILE` 和 `HASH *FILE`;`--ignore-missing` 现在会在 check 模式下静默跳过校验列表里缺失的目标文件,不报错也不记失败;`--quiet` 现在会在 check 模式下隐藏逐文件 `OK` 行,但仍保留 `FAILED` 结果输出;`--status` 现在会在 check 模式下静默正常输出但保留退出码,`--warn` 现在会按 `FILE:LINE` 形状报告 malformed checksum line 并输出 GNU 风格的 malformed-line 汇总,`--strict` 现在会在存在 malformed 校验行时失败,没有任何有效 checksum line 的校验文件现在也会按 GNU 形状以 `no properly formatted checksum lines found` 失败;不可读目标文件时 GNU 形状的 `WARNING: N listed file(s) could not be read` 汇总,以及直接摘要和 `-c` 校验文件模式下区分“缺失路径”和“目录 operand”的 GNU 形状打开失败诊断也已补齐;剩余 gap 主要收窄到更细的 GNU checksum 文件解析和文件名转义细节。 - `sha512sum` — [sha512sum invocation](https://www.gnu.org/software/coreutils/manual/html_node/sha2-utilities.html); `sha512sum [option]... [FILE]...`; `-b/--binary`、`-c/--check`、`--ignore-missing`、`-t/--text`、`-q/--quiet`、`-s/--status`、`-w/--warn`、`-z/--zero`、`--strict`、`--tag`; 关键点:普通 SHA-512 摘要输出、BSD 风格 `--tag`、通配符文件参数、短选项 `-z` 与长选项 `--zero` 的 NUL 结尾输出、常见 GNU hash-line 形式的 `-c/--check` 校验路径已经到位,包括 `HASH FILE` 和 `HASH *FILE`;`--ignore-missing` 现在会在 check 模式下静默跳过校验列表里缺失的目标文件,不报错也不记失败;`--quiet` 现在会在 check 模式下隐藏逐文件 `OK` 行,但仍保留 `FAILED` 结果输出;`--status` 现在会在 check 模式下静默正常输出但保留退出码,`--warn` 现在会按 `FILE:LINE` 形状报告 malformed checksum line 并输出 GNU 风格的 malformed-line 汇总,`--strict` 现在会在存在 malformed 校验行时失败,没有任何有效 checksum line 的校验文件现在也会按 GNU 形状以 `no properly formatted checksum lines found` 失败;不可读目标文件时 GNU 形状的 `WARNING: N listed file(s) could not be read` 汇总,以及直接摘要和 `-c` 校验文件模式下区分“缺失路径”和“目录 operand”的 GNU 形状打开失败诊断也已补齐;剩余 gap 主要收窄到更细的 GNU checksum 文件解析和文件名转义细节。 - `dd` — [dd invocation](https://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html); `dd [operand]...`; `if=FILE`、`of=FILE`、`bs=BYTES`、`ibs=BYTES`、`obs=BYTES`、`cbs=BYTES`、`count=N`、`skip=N`、`seek=N`、`conv=CONVS`; 关键点:块复制和转换关键字才是兼容面,而且 `conv=sync` 现在会补齐短输入块。 - `printf` — [printf invocation](https://www.gnu.org/software/coreutils/manual/html_node/printf-invocation.html); `printf FORMAT [ARGUMENT]...`; 关键点:format 复用、缺失参数 GNU 默认值、`%b`、宽度/精度、C 风格数字解析、`\c` 和常见反斜杠转义已覆盖。 - `seq` — [seq invocation](https://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html); `seq [option]... LAST` / `FIRST LAST` / `FIRST INCREMENT LAST`; `-f/--format`、`-s/--separator`、`-t/--terminator`、`-w/--equal-width`; 关键点:拒绝 0 increment,且现在会使用更接近 GNU/uutils 的 `invalid Zero increment value: 'ARG'` 诊断,支持负数/递减区间,`-f` 校验单个浮点转换,缺少 operand 或多余 operand 时现在都会附带 GNU 风格 help hint,`-t/--terminator` 现在会只替换最终输出分隔符而保留中间分隔符,且 `-w` 现在也会按 GNU/uutils 形状拒绝显式 `-f/--format` 字符串。 - `sleep` — [sleep invocation](https://www.gnu.org/software/coreutils/manual/html_node/sleep-invocation.html); `sleep NUMBER[SUFFIX]...`; 无常规选项; 关键点:接受浮点时长和常见 `s`/`m`/`h`/`d` 后缀,缺少 operand 时现在会附带 GNU 风格 help hint,非法或负数 duration 现在也会按 GNU 形状输出 `invalid time interval 'ARG'` 并附带标准 help hint,多个非法 operand 现在会在最终 help hint 前全部报告,前导空白仍会被接受,而尾随空白现在会按 GNU/uutils 形状拒绝。 - `yes` — [yes invocation](https://www.gnu.org/software/coreutils/manual/html_node/yes-invocation.html); `yes [STRING]...`; 无常规选项; 关键点:裸 `yes` 仍重复输出 `y`,多参数调用现在会按 GNU/uutils 语义先把全部参数用单个空格拼成一行再重复输出,`-V/--version` 现在也会成功,而 `-- --version` 仍保持字面参数语义。 - `sync` — [sync invocation](https://www.gnu.org/software/coreutils/manual/html_node/sync-invocation.html); `sync [OPTION] [FILE]...`; `-d/--data`、`-f/--file-system`; 关键点:WinuxCmd 现在接受 GNU 的这组选项表面,已存在目录参数在普通 `sync` 和 `--data` 下现在也会成功,`--data` 缺少文件参数时现在会按更接近 uutils 的形状报 `--data needs at least one argument`,`--data` 与 `--file-system` 组合时现在也会按互斥选项失败,`--file-system` 现在会把已存在的文件和目录参数都视为文件系统引用并接受,无效选项会明确输出 `unrecognized option` 和 help hint,而多个缺失文件参数现在都会逐条输出更接近 GNU/uutils 的 `error opening 'FILE': No such file or directory` 诊断而不是在第一个失败处停止;Windows 上整体仍只是 GNU `sync` 语义的近似实现。 - `pathchk` — [pathchk invocation](https://www.gnu.org/software/coreutils/manual/html_node/pathchk-invocation.html); `pathchk [option]... NAME...`; `-p`、`-P`、`--portability`; 关键点:默认启用 GNU 风格 `-P` 检查,除非设置 `POSIXLY_CORRECT`;`--portability` 等价 `-p -P`,`-p` 会检查 portable filename 字符集和 POSIX 14 字节组件/256 字节路径限制,当前文件系统检查现在也会接受 `C:\foo\bar` 这类正常 Windows 盘符绝对路径,Windows 保留名也会拒绝,而重复分隔符和尾随分隔符现在不会再在 `-P` 风格检查下被误判成 `empty file name`,默认模式下空路径诊断现在也改成了更接近 GNU/uutils 的 `pathchk: '': No such file or directory` 形状,并且多个非法 operand 会逐条单独报告,且 missing operand 的 help hint 现在会留在 stderr。 - `sum` — [sum invocation](https://www.gnu.org/software/coreutils/manual/html_node/sum-invocation.html); `sum [option]... [FILE]...`; `-r/--bsd`、`-s/--sysv`; 关键点:默认是 BSD 算法并使用 1024 字节块计数,BSD checksum 字段现在也会像 GNU 一样补齐为 5 位零填充,BSD 的 block-count 列现在也会像 GNU 一样按宽度 5 右对齐;System V 使用 byte-sum checksum 和 512 字节块计数,多个算法参数按最后一个生效;隐式 stdin 保持不带文件名,而显式给出的 `-` operand 现在会像 GNU 一样把 `-` 打印为文件名;多文件场景下,不可读 operand 现在会先按 GNU 形状报错,再继续处理后续可读文件,并最终返回非零;缺失输入文件和目录 operand 也会分别输出更接近 GNU 的 `No such file or directory` / `Is a directory` 诊断。 - `factor` — [factor invocation](https://www.gnu.org/software/coreutils/manual/html_node/factor-invocation.html); `factor [NUMBER]...`; 无选项; 关键点:读取整数并输出质因数。 - `expr` — [expr invocation](https://www.gnu.org/software/coreutils/manual/html_node/expr-invocation.html); `expr EXPRESSION`; 无选项; 关键点:重点是表达式语法,而不是参数。 - `test` / `[` — [test invocation](https://www.gnu.org/software/coreutils/manual/html_node/test-invocation.html); `test EXPRESSION`; 无选项; 关键点:shell test 语法和 `[` 共享同一套语法。 - `true` / `false` — [true invocation](https://www.gnu.org/software/coreutils/manual/html_node/true-invocation.html)、[false invocation](https://www.gnu.org/software/coreutils/manual/html_node/false-invocation.html); 无选项; 关键点:正常执行时仍只体现在退出码差异上,同时两个命令的 `-V/--version` 现在也会成功,而不是被误判成未知选项。 - `tsort` — [tsort invocation](https://www.gnu.org/software/coreutils/manual/html_node/tsort-invocation.html); `tsort [FILE]`; 无选项; 关键点:保留成对输入的拓扑排序语义。 ## 追加 GNU 工具 - `expand` — [expand invocation](https://www.gnu.org/software/coreutils/manual/html_node/expand-invocation.html); `expand [option]... [file]...`; `-t/--tabs=tab1[,tab2]...`, `-i/--initial`; 关键点:默认展开全部 tab,`-t` 支持 GNU 逗号/空白列表、`/N` 和 `+N`,退格会影响列计数,普通换行分隔模式现在会先剥掉 CRLF 记录尾部的 `\r` 再做展开,tab-list 选项参数不会被通配符展开;缺失输入文件现在会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory`。 - `unexpand` — [unexpand invocation](https://www.gnu.org/software/coreutils/manual/html_node/unexpand-invocation.html); `unexpand [option]... [file]...`; `-t/--tabs=tab1[,tab2]...`, `-a/--all`, `-f/--first-only`, `-U/--no-utf8`; 关键点:默认只处理行首 blanks,`-t` 会隐含 `-a`,`-f/--first-only` 会覆盖它,接受 `/N` 和 `+N` tab 语法,选项参数保持字面值;默认文件读取会剥掉 UTF-8 BOM,而 `-U/--no-utf8` 会把这些起始字节按原样保留;缺失输入文件现在会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory`。 - `fold` — [fold invocation](https://www.gnu.org/software/coreutils/manual/html_node/fold-invocation.html); `fold [option]... [file]...`; `-b/--bytes`, `-c/--characters`, `-s/--spaces`, `-w/--width=width`; 关键点:默认按屏幕列折行,也支持字节/字符模式,width 严格解析,未以换行结尾的最后一行会保留,tab、退格、回车列处理已覆盖;`-c/--characters` 现在会按 UTF-8 code point 计数而不会把多字节字符劈开,默认列宽模式也会保持常见 UTF-8 宽字符完整并按 2 列处理;普通换行分隔模式现在会在折行和输出前先剥掉 CRLF 记录尾部的 `\r`;缺失输入文件现在会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory`。 - `fmt` — [fmt invocation](https://www.gnu.org/software/coreutils/manual/html_node/fmt-invocation.html); `fmt [option]... [file]...`; `-c/--crown-margin`, `-m/--preserve-headers`, `-t/--tagged-paragraph`, `-s/--split-only`, `-u/--uniform-spacing`, `-T/--tab-width=tabwidth`, `-w/--width=width`, `-g/--goal=goal`, `-p/--prefix=prefix`, `-P/--skip-prefix=prefix`, `-x/--exact-prefix`, `-X/--exact-skip-prefix`; 关键点:默认 75 列,width/goal 严格解析,保留空行和缩进,split-only 不回填,prefix 模式只格式化匹配行,而且现在会保留匹配到的前缀附件(如 `>` 与 `> ` 的区别);`-x` 现在会让带缩进的行不再被 `-p` 匹配,`-P` 会把匹配行按原样保留,`-X` 则会在常见微软/Coreutils 场景下让带缩进的行不再被 skip-prefix 匹配;`-m` 现在会识别简单的 `Header: value` 邮件头、并入缩进 continuation 行,并以保留 header 标签加两空格续行的方式重排,同时在我们实测的微软场景里也会把正文按更宽的折行策略处理;带 tab 缩进的段落现在也会按 Microsoft/Coreutils 的默认 8 列 tab stop 计算缩进宽度,`-T` 只改变测量宽度而不展开输出中的 tab;uniform spacing 保留句末双空格,crown/tagged 缩进已覆盖常见路径;缺失输入文件现在会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory`。 - `nl` — [nl invocation](https://www.gnu.org/software/coreutils/manual/html_node/nl-invocation.html); `nl [option]... [file]...`; `-b`, `-d`, `-f`, `-h`, `-i`, `-l`, `-n`, `-p`, `-s`, `-v`, `-w`; 关键点:长选项、section delimiter、包含 `pBRE` 的分段编号样式、`--no-renumber`、空行合并、空 separator,以及负 start/increment 已覆盖;普通换行分隔模式现在会在 section delimiter 判断和编号输出前先剥掉 CRLF 记录尾部的 `\r`;缺失输入文件现在会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory`。 - `paste` — [paste invocation](https://www.gnu.org/software/coreutils/manual/html_node/paste-invocation.html); `paste [option]... [file]...`; `-s/--serial`, `-d/--delimiters=delim-list`, `-z/--zero-terminated`; 关键点:`-d` 的列表会循环,已支持 `\\0`、`\\t`、`\\n`、`\\b`、`\\f`、`\\r`、`\\v`、`\\\\`,空 delimiter 不插入分隔符,parallel 模式下重复 `-` 会顺序消费 stdin,普通换行分隔模式现在会先剥掉 CRLF 记录尾部的 `\r`,而 `-z` 仍保持按字节处理,文件打开失败现在也会区分“路径缺失”和“目录输入”,输出更接近 GNU 的 `No such file or directory` / `Is a directory` 文案。 - `join` — [join invocation](https://www.gnu.org/software/coreutils/manual/html_node/join-invocation.html); `join [option]... file1 file2`; `-a`, `--check-order`, `--nocheck-order`, `-e`, `--header`, `-i`, `-1`, `-2`, `-j`, `-o`, `-t`, `-v`, `-z`; 关键点:默认 blank 字段解析、显式 `-t`、空/NUL 分隔、未配对输出、`-o FIELD-LIST`、`-o auto`、header 推断、`-e`、`-i`、order check 选项和 NUL 记录已覆盖;普通换行分隔输入现在会在提取 join key 和匹配前先剥掉 CRLF 记录尾部的 `\r`,而 `-z` 仍保持按字节处理;缺失输入文件现在会输出更接近 GNU 的 `missing.txt: No such file or directory` 诊断,目录 operand 现在会输出 `Is a directory`,而参数个数错误现在也会使用更接近 GNU 的 `missing operand` / `extra operand` 加 help hint 诊断;输入必须按 join key 排序。 - `comm` — [comm invocation](https://www.gnu.org/software/coreutils/manual/html_node/comm-invocation.html); `comm [option]... file1 file2`; `-1`, `-2`, `-3`, `--check-order`, `--nocheck-order`, `--output-delimiter=str`, `--total`, `-z`; 关键点:NUL 记录、total、order check 参数和空 output delimiter 作为 NUL 已覆盖;普通换行分隔模式现在会在比较和输出前先剥掉 CRLF 记录尾部的 `\r`,而 `-z` 仍保持按字节处理;缺失输入文件现在会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,目录 operand 现在会输出 `Is a directory`,而参数个数错误现在也会使用更接近 GNU 的 `missing operand` / `extra operand` 加 help hint 诊断;输入必须按 `LC_COLLATE` 排序。 - `tac` — [tac invocation](https://www.gnu.org/software/coreutils/manual/html_node/tac-invocation.html); `tac [option]... [file]...`; `-b/--before`, `-r/--regex`, `-s/--separator=separator`; 关键点:每个文件独立反转记录,空 `-s ''` 使用 NUL,`-b` 把分隔符挂到记录前,`-r -s` 把 separator 当正则;普通换行分隔模式现在会在反转前先剥掉 CRLF 记录尾部的 `\r`,而自定义/regex separator 路径仍保持按字节处理;缺失输入文件现在会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory`。 - `diff` — GNU diffutils 命令;`diff [OPTION]... FILE1 FILE2`;`-q`、`-u`、`-y`、`-w`、`-B`; 关键点:当前 WinuxCmd 已覆盖基础比较、unified 输出、side-by-side 输出、`-q` 和 `-w`,文件参数走统一通配符策略,参数个数错误现在会区分裸 `missing operand`、`missing operand after 'FILE'` 和 `extra operand`,并附带 GNU 风格 help hint,缺失输入文件现在会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory`;更宽的 GNU diffutils edit/report 选项仍待补齐。 - `shuf` — [shuf invocation](https://www.gnu.org/software/coreutils/manual/html_node/shuf-invocation.html); `shuf [option]... [file]` / `shuf -e ...` / `shuf -i lo-hi ...`; `-e/--echo`、`-i/--input-range`、`-n/--head-count`、`-o/--output`、`--random-seed`、`--random-source`、`-r/--repeat`、`-z/--zero-terminated`; 关键点:`--random-seed=STRING` 现在会按更接近 Microsoft/uutils 的 seeded 路径处理,即先对 UTF-8 seed 做 SHA3-256,再进入 ChaCha12 的可复现随机流,因此固定 seed 下的洗牌和 `-r` 抽样在常见 probe 上已经对齐;`--random-source=FILE` 现在也改成更接近 GNU/Microsoft 的“熵回收”适配路径,不再走旧的 `mt19937` 分支,因此当前的文件 `-n`、重复 `-i`、普通 `-i` probe 都已经能和 Microsoft 精确对齐;重复出现的 `-n/--head-count` 现在也会按 GNU/uutils/Microsoft 的行为取最小值,而不是取最后一个;它仍然与 `--random-source` 互斥;普通换行分隔模式现在会在洗牌和输出前去掉 CRLF 记录末尾的 `\r`,而 `-z` 仍保持按原始字节读写 NUL 记录;`-o` 会先读完输入再打开输出,所以支持 `shuf -o FILE FILE`;缺失输入文件现在会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory`。 - `diff3` — GNU diffutils 命令;`diff3 [OPTION]... MINE OLDER YOURS`;`-e`、`-E`、`-m`、`-A`、`-a`; 关键点:文件参数走统一通配符策略,必须最终解析成恰好三个文件;缺少参数时现在会区分裸 `missing operand` 和 `missing operand after 'FILE'`,多余参数则按 GNU/uutils 形状报诊断,并附带 `Try 'diff3 --help' for more information.`。 - `sdiff` — GNU diffutils 命令;`sdiff [OPTION]... FILE1 FILE2`;`-o`、`-w`、`-l`、`-s`、`-E`、`-b`、`-W`、`-B`; 关键点:当前 WinuxCmd 已覆盖常用并排输出路径,可正常处理空文件,文件类通配符会先解析再做固定双文件个数检查;参数个数错误现在也会区分裸 `missing operand`、`missing operand after 'FILE'` 和 `extra operand`,并附带 GNU 风格 help hint,更宽的 GNU merge/edit 选项仍待补齐。 - `cmp` — GNU diffutils 命令;`cmp [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]`;`-b`、`-i/--ignore-initial=SKIP` / `SKIP1:SKIP2`、`-l`、`-n`、`-s`; 关键点:WinuxCmd 现在接受 GNU 的位置参数 `SKIP1`/`SKIP2`,也接受 `-i SKIP1:SKIP2` 这种分别跳过两侧输入的写法;skip 计数接受 GNU 风格的十进制/八进制/十六进制前缀和常见字节后缀,默认差异输出现在会同时带出 byte 和 line 编号,`-l` 现在会按 GNU 风格以相对比较起点的字节号和八进制字节值列出全部差异,`-l/-s` 输出模式按最后一次出现生效,而且“跳过长度超过较短输入”现在会稳定输出 EOF,而不会把比较范围算下溢,同时参数个数错误现在也会使用更接近 GNU 的 missing/extra operand 加 help hint 诊断。 - `split` — [split invocation](https://www.gnu.org/software/coreutils/manual/html_node/split-invocation.html); `split [option]... [input [prefix]]`; `-l`, `-b`, `-C`, `-n N`, `-n l/N`, `-a`, `-d/--numeric-suffixes[=FROM]`, `-x/--hex-suffixes[=FROM]`, `--additional-suffix`, `-e`, `--verbose`, `-t/--separator`, `--filter`; 关键点:按行、按字节、按完整行字节、普通 `-n N` 数量切分、GNU `-n l/N` 这种“不拆记录”的数量切分、`-t/--separator` 自定义记录分隔符、`--filter`,以及 `-e` 空文件省略已覆盖,包括在 `-n l/N` 下保留完整 CRLF 记录而不会把一条记录拆到多个输出文件、输出时保留自定义分隔符、对每个 filter 命令导出 `FILE` 环境变量,同时保留当前更适合 Windows shell 的 `$FILE` 文本替换路径、显式传空分隔符时会按 GNU 风格报错而不是悄悄退回换行语义,并且在省略空分片时保持输出 suffix 连续、不跳号;`--verbose` 现在也会在每次打开输出文件前输出 GNU 形状的 `creating file 'PREFIX..'` 诊断;suffix 起点、数字/十六进制 suffix 可用,歧义通配符输入会拒绝;缺失输入文件现在会输出更接近 GNU 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory`;第 3 个位置参数现在会按 GNU 风格报 `extra operand` 并附带 help hint;尚未支持的 `-n` 子模式如 `K/N`、`l/K/N`、`r/N` 现在会显式失败,而不是静默按错的语义执行;`-u` 仍是缺口。 - `csplit` — [csplit invocation](https://www.gnu.org/software/coreutils/manual/html_node/csplit-invocation.html); `csplit [option]... input pattern...`; `-f`, `-b`, `-n`, `-k`, `--suppress-matched`, `-z`, `-s/-q`; 关键点:行号和正则 pattern、带 offset 的正则 repeat、skip pattern、suppress-matched、quiet 输出、空文件省略和歧义通配符拒绝已覆盖;缺少输入文件或 pattern 时现在也会附带 GNU 风格 help hint;整数行号 pattern 配合 `--suppress-matched` 现在也会保留 GNU/uutils 风格的空尾分片语义。 - `pr` — [pr invocation](https://www.gnu.org/software/coreutils/manual/html_node/pr-invocation.html); `pr [option]... [file]...`; `+FIRST[:LAST]`, `-COLUMN`, `-a`, `-c`, `-d`, `-D`, `-e`, `-f/-F`, `-h`, `-i`, `-J`, `-l`, `-m`, `-n`, `-N`, `-o`, `-r`, `-s`, `-S`, `-t`, `-T`, `-v`, `-w`, `-W`; 关键点:页眉页脚、分页和段落布局是核心语义;GNU 旧式 `-COLUMN` 形式例如 `pr -2 FILE` 现在也可接受,普通换行分隔输入现在会在分页、编号和列布局前先剥掉 CRLF 记录尾部的 `\r`。 - `rev` — 仓库本地命令,GNU Coreutils 没有对应 invocation 页面;不要把它写成 GNU 兼容项。 ## GNU 补充命令 - `chown` — [chown invocation](https://www.gnu.org/software/coreutils/manual/html_node/chown-invocation.html); `chown [option]... [OWNER][:[GROUP]] FILE...`; `-c/--changes`, `-f/--silent/--quiet`, `-h/--no-dereference`, `-H`, `-L`, `-P`, `--dereference`, `--from=CURRENT_OWNER:CURRENT_GROUP`, `--preserve-root[=all]`, `--reference=RFILE`, `-R/--recursive`, `-v/--verbose`; 关键点:当前实现在 Windows 上仍有限,但显式 owner/group 名字以及 `--from` 提供的 current owner/group 名字现在都会先校验,非法名字会按 GNU 形状提前报 `invalid user` / `invalid group`,`::`、`..`、`1001:`、`1001.` 这类 malformed spec 现在也会按更接近 GNU/uutils 的形状报 `invalid group` / `invalid spec`,`OWNER.`、`OWNER.GROUP` 这类 dot-separated 形式现在会先输出更接近 GNU/uutils 的 `warning: '.' should be ':'`,`--from` 现在会先按现有目标当前的 Windows owner/group 做过滤,再决定是否应用 `--reference` 或继续直接变更尝试,不匹配的过滤条件会保持目标不变且 `-v` 输出 retained-ownership 诊断,命中过滤条件时也不再输出旧的 Windows 占位 `not supported` 诊断,direct 模式下像 `:`、`CURRENT_OWNER:` 这类本来就不需要变更的 spec 现在也会按 GNU/uutils 风格输出 retained-ownership,而不是伪造 change 行,缺失的 reference 文件现在会报 `failed to get attributes of 'RFILE': No such file or directory`,`--reference=RFILE FILE...` 保持 GNU 的参数形状,`-v --reference=RFILE FILE...` 现在会在 stderr 输出 retained-ownership 诊断,`--preserve-root -R /` 现在也会在真正遍历前按 GNU/uutils 风格输出两行 failsafe 诊断并拒绝执行;递归遍历和实际所有权变更行为仍受 Windows 限制。 - `chgrp` — [chgrp invocation](https://www.gnu.org/software/coreutils/manual/html_node/chgrp-invocation.html); `chgrp [OPTION]... GROUP FILE...` / `chgrp [OPTION]... --reference=RFILE FILE...`; `-c/--changes`、`-f/--silent/--quiet`、`-h/--no-dereference`、`-H`、`-L`、`-P`、`--dereference`、`--from=GROUP`、`--preserve-root`、`--no-preserve-root`、`--reference=RFILE`、`-R/--recursive`、`-v/--verbose`; 关键点:非法 group 参数现在会按 GNU/uutils 风格提前报 `invalid group: 'GROUP'` 并附带 help hint,非法 `--from=GROUP` 现在会按更接近 uutils 的形状报 `invalid user: 'GROUP'`,`--from=GROUP` 现在会先按现有目标当前的 Windows 组名做过滤,再决定是否应用 `--reference` 或直接改组尝试,numeric `--from=gid` 和 `--from=:gid` 现在也会被接受,并按目标组 SID 最后一个 RID 做 Windows 近似匹配,缺失的 reference 文件现在会报 `failed to get attributes of 'RFILE': No such file or directory`,`--reference=RFILE FILE...` 现在接受 GNU 的参数形状并会在处理目标前先校验 reference 文件,只有在 `--from` 过滤命中时 `-v --reference=RFILE FILE...` 才会在 stderr 输出 retained-group 诊断,`--preserve-root -R /` 现在也会在真正遍历前按 GNU/uutils 风格输出两行 failsafe 诊断并拒绝执行,实际组变更行为仍受 Windows 限制。 - `chcon` — [chcon invocation](https://www.gnu.org/software/coreutils/manual/html_node/chcon-invocation.html); `chcon [OPTION]... CONTEXT FILE...` / `chcon [OPTION]... --reference=RFILE FILE...`; `--reference=RFILE`、`-u/--user`、`-r/--role`、`-t/--type`、`-l/--range`、`-R/--recursive`、`-H`、`-L`、`-P`、`-h/--no-dereference`、`--dereference`、`--preserve-root`、`--no-preserve-root`、`-v/--verbose`; 关键点:WinuxCmd 现在接受 GNU 形状的参数表面并校验已存在文件参数,但由于 Windows 不存在 SELinux 文件上下文,执行时会稳定返回明确的限制诊断。 - `chroot` — [chroot invocation](https://www.gnu.org/software/coreutils/manual/html_node/chroot-invocation.html); `chroot [OPTION] NEWROOT [COMMAND [ARG]...]`; `--groups=GROUP1,GROUP2...`、`--userspec=USER:GROUP`、`--skip-chdir`; 关键点:WinuxCmd 现在接受 GNU 形状的参数表面,校验 `NEWROOT` 必须是已存在目录;但由于 Windows 不提供安全的 POSIX `chroot` 等价语义,执行时会稳定返回明确的限制诊断。 - `mkfifo` — [mkfifo invocation](https://www.gnu.org/software/coreutils/manual/html_node/mkfifo-invocation.html); `mkfifo [OPTION]... NAME...`; `-m/--mode=MODE`、`-Z`、`--context[=CTX]`; 关键点:WinuxCmd 现在接受 GNU 形状的参数表面,保留常见场景下 GNU 风格的 `missing operand`、`invalid mode` 和 `File exists` 诊断;但由于 Windows 不存在文件系统 FIFO,执行时会稳定返回明确的限制诊断。 - `mknod` — [mknod invocation](https://www.gnu.org/software/coreutils/manual/html_node/mknod-invocation.html); `mknod [OPTION]... NAME TYPE [MAJOR MINOR]`; `-m/--mode=MODE`、`-Z`、`--context[=CTX]`,以及 `TYPE` 取值 `b`、`c`/`u`、`p`; 关键点:WinuxCmd 现在接受 GNU 形状的参数表面,并校验常见参数组合规则,例如 `p` 与 `b/c` 的主次设备号要求;但由于 Windows 不存在特殊文件和设备节点,执行时会稳定返回明确的限制诊断。 - `runcon` — [runcon invocation](https://www.gnu.org/software/coreutils/manual/html_node/runcon-invocation.html); `runcon CONTEXT COMMAND [ARG]...` / `runcon [-c] [-u USER] [-r ROLE] [-t TYPE] [-l RANGE] [COMMAND [ARG]...]`; `-c/--compute`、`-u/--user`、`-r/--role`、`-t/--type`、`-l/--range`; 关键点:WinuxCmd 现在接受 GNU 形状的参数表面,并校验 plain-context 形式必须包含 command operand;但由于 Windows 不存在 SELinux 进程上下文,执行时会稳定返回明确的限制诊断。 - `link` — [link invocation](https://www.gnu.org/software/coreutils/manual/html_node/link-invocation.html); `link FILE LINKNAME`; 无常规选项; 关键点:GNU `link` 本身是 optionless 命令,WinuxCmd 现在也会让 `-V/--version` 成功,并在常见缺失源文件失败和目标已存在失败场景下输出 GNU 形状的 `cannot create link 'LINK' to 'FILE'` 诊断,参数个数错误已收敛到更接近 uutils 的 `2 values required`,而无效选项也会明确输出 `unrecognized option` 和 help hint;源文件通配符现在遵循共享文件输入策略:恰好一个匹配会展开,多匹配时会像 shell 展开后的多 operand 一样折回到 `2 values required`,零匹配则回退到字面路径。 - `dir` — [dir invocation](https://www.gnu.org/software/coreutils/manual/html_node/dir-invocation.html); `dir [OPTION]... [FILE]...`; GNU 的 `ls -C` wrapper;关键点:WinuxCmd 保持了这个 wrapper 形态和按列输出的默认行为,现在也会把原始 argv 表面转发给 `ls`,所以 `-a`、`-d` 这类 wrapper 选项会真正生效;同时带空格的单个参数也会按 Windows `CreateProcessW` 引号规则保留下来,不会在进入 `ls` 前被拆开。 - `nice` — [nice invocation](https://www.gnu.org/software/coreutils/manual/html_node/nice-invocation.html); `nice [OPTION] [COMMAND [ARG]...]`; `-n/--adjustment=N`; 关键点:当前实现把 niceness 映射到 Windows 优先级类,数值语义还没完全对齐 GNU;裸 `nice` 现在会打印当前 niceness,显式给出 adjustment 却没有 command 时现在会按 GNU/uutils 风格以 `A command must be given with an adjustment.` 和退出码 `125` 失败,GNU 的旧式 bare adjustment 形式如 `-1`、`--1`、`-+1` 现在会在命令解析前改写到 `-n...` 语义,超大正负 adjustment 现在会收敛到边界值而不是在选项解析阶段失败,非法 adjustment 字符串现在会以 GNU 形状 usage error 返回 `125`,invalid option 这类 parse-time 失败现在也会返回 `125`,子命令命令行现在也会按 Windows `CreateProcessW` 引号规则保留带空格的单个参数,子命令不存在时则会输出 GNU 形状的 `failed to run command 'CMD': No such file or directory` 诊断,并返回 `127`。 - `nohup` — [nohup invocation](https://www.gnu.org/software/coreutils/manual/html_node/nohup-invocation.html); `nohup COMMAND [ARG]...`; 无常规选项; 关键点:GNU 侧没有常规选项,当前实现保留了本地 `-a/--append` 扩展,missing operand 和 invalid option 的 help hint 会留在 stderr,且这两类 usage error 默认返回 `125`、在 `POSIXLY_CORRECT` 下返回 `127`;子命令命令行现在也会按 Windows `CreateProcessW` 引号规则保留带空格的单个参数;子命令不存在时,现在也会输出 GNU 形状的 `failed to run command 'CMD': No such file or directory` 诊断,并返回 `127`。 - `env` — [env invocation](https://www.gnu.org/software/coreutils/manual/html_node/env-invocation.html); `env [option]... [-] [name=value]... [command [args]...]`; `-i/--ignore-environment`、可重复 `-u/--unset=NAME`、`-0/--null`、`-f/--file=FILE`、`-v/--debug`、`-a/--argv0=STRING`、`-C/--chdir=DIR`、`NAME=VALUE` 和 command 执行已接入;关键点:parse-time 的非法 option 现在也会按 GNU/uutils 风格附带标准 help hint 并返回 `125`,`-f/--file` 现在会先加载简化、带 trim 的 `.env` 风格 `NAME=VALUE` 条目,再应用 `-u` 和命令行赋值,同时忽略空行与 `#` 注释,`-a/--argv0` 现在会覆盖传给子进程的 `argv[0]`,但仍执行原始程序,`-a/--argv0`、`-C/--chdir`、`-S/--split-string` 这几组别名现在按“最后一次出现生效”,`-C/--chdir` 也已按 GNU 用法要求必须同时提供 command operand,`-0/--null` 现在只允许用于打印环境;如果同时给出 command,会按 GNU/uutils 风格以退出码 `125` 和 `cannot specify --null (-0) with command` 失败,重复 debug flag 现在会累加,因此 `-vv` 除了现有的 `executing:` / `arg[n]` 诊断外还会打印原始输入参数,`-f` 文件打开失败现在返回退出码 `1`,不再误归类为 usage error,命令启动失败现在也保持 GNU 常见的区分:找不到命令时返回 `127` / `No such file or directory`,找到了但不可执行时返回 `126` / `Permission denied`,而且 `--argv0` 路径也不再把后者误判成前者;当前 `-S` parser 现在除了会在未闭合引号时按 GNU 风格失败并返回 `125`,也开始处理常见 GNU 分隔/转义规则,例如字面换行、`\_` 和非双引号上下文中的 `\c`;完整 GNU `-S` 解析、完整 dotenv 语义、剩余 GNU debug 细节和信号控制仍待补齐。 - `pwd` — [pwd invocation](https://www.gnu.org/software/coreutils/manual/html_node/pwd-invocation.html); `pwd [OPTION]...`; `-L/--logical`、`-P/--physical`; 关键点:默认输出仍保持 physical,但在存在 `POSIXLY_CORRECT` 时,裸 `pwd` 现在会按 logical 默认值优先使用 `PWD`,前提是它必须是绝对路径、仍然解析到当前目录,且路径分量里不含 `.` 或 `..`;`-L/-P` 选项族现在按“最后一次出现生效”;多余的非选项参数现在也会输出 GNU 形状的 `ignoring non-option arguments` warning,但命令仍成功;更深的 symlink 词法形态校验还没补齐。 - `printenv` — [printenv invocation](https://www.gnu.org/software/coreutils/manual/html_node/printenv-invocation.html); `printenv [OPTION]... [VARIABLE]...`; `-0/--null`; 关键点:全量环境枚举和指定变量输出都已接入;空值变量仍会输出空记录,部分命中/部分缺失的变量列表会保留已找到输出并返回状态 `1`,包含 `=` 的变量名 operand 现在也会按 GNU/uutils 习惯静默忽略并让退出状态保持 `1`,无效选项现在会按 GNU/uutils 风格返回退出码 `2` 并附带标准 help hint,命名变量的 NUL 结尾可用,且全量枚举时会跳过 Windows 隐藏的 `=...` 伪环境项。 - `stdbuf` — [stdbuf invocation](https://www.gnu.org/software/coreutils/manual/html_node/stdbuf-invocation.html); `stdbuf [OPTION]... COMMAND [ARG]...`; `-i/--input`, `-o/--output`, `-e/--error`; 关键点:missing command、invalid mode 和 invalid option 这类 usage/parse error 现在会按 GNU/uutils 风格返回 `125`,并把 GNU 风格的 help hint 保留在 stderr;子命令命令行现在也会按 Windows `CreateProcessW` 引号规则保留带空格的单个参数;但当前实现仍只改父进程侧缓冲,GNU 版本会更深入地作用到被执行程序。 - `timeout` — [timeout invocation](https://www.gnu.org/software/coreutils/manual/html_node/timeout-invocation.html); `timeout [OPTION] DURATION COMMAND [ARG]...`; `-s/--signal`, `-k/--kill-after`, `--foreground`, `--preserve-status`; 关键点:当前实现已覆盖主要参数,`missing operand` / `missing command` 现在也会附带 GNU 风格的 help hint,并返回退出码 `125`;parse-time 的非法 option 现在也会附带标准 help hint 并返回 `125`;Windows 实现里的 `--foreground` 现在也不会再让 timeout 失效;非法 `--signal` / duration / `--kill-after` 用法现在也会返回 `125` 并输出 GNU 形状诊断,verbose 超时诊断也会优先打印 `TERM` 这类信号名;`-s0` 配合 `-k/--kill-after` 时现在会把强制终止延后到 KILL 阶段并返回 GNU/uutils 形状的 `137`;子进程参数现在也会按 Windows `CreateProcessW` 规则引用,带空格的单个参数会保持为单个 argv;真正的信号语义、`--preserve-status` 边界和前后台细节还要继续收敛。 - `vdir` — [vdir invocation](https://www.gnu.org/software/coreutils/manual/html_node/vdir-invocation.html); `vdir [OPTION]... [FILE]...`; GNU 的 `ls -l` wrapper;关键点:WinuxCmd 保持了这个 wrapper 形态和长列表输出的默认行为,现在也会把原始 argv 表面转发给 `ls`,所以 `-a`、`-d` 这类 wrapper 选项会真正生效;同时带空格的单个参数也会按 Windows `CreateProcessW` 引号规则保留下来,不会在进入 `ls` 前被拆开。 - `tty` — [tty invocation](https://www.gnu.org/software/coreutils/manual/html_node/tty-invocation.html); `tty [OPTION]...`; `-s/--silent`、`--quiet`; 关键点:WinuxCmd 已接受 quiet 风格别名,多余 operand 和 invalid option 现在都会按 GNU 形状输出诊断,并和 help hint 一起走 stderr 后返回 `2`;对非 tty stdin 的 silent / 非 silent 模式都返回 `1`,并且非 silent 输出时如果 stdout 提前断开,现在也按 GNU/uutils 形状返回 `3`。 - `arch` — [arch invocation](https://www.gnu.org/software/coreutils/manual/html_node/arch-invocation.html); `arch`; 无常规选项; 关键点:WinuxCmd 现在也会让 `-V/--version` 成功,而不是把它误判成未知选项;普通输出仍保持 GNU 风格的架构名,例如 `x86_64`、`aarch64`,底层来源仍是 Windows 处理器架构。 - `hostid` — [hostid invocation](https://www.gnu.org/software/coreutils/manual/html_node/hostid-invocation.html); `hostid`; 无常规选项; 关键点:WinuxCmd 现在也会让 `-V/--version` 成功,而不是把它误判成未知选项;普通输出仍保持当前基于 Windows 机器标识推导出的 8 位十六进制 host id。 - `logname` — [logname invocation](https://www.gnu.org/software/coreutils/manual/html_node/logname-invocation.html); `logname`; 无常规选项; 关键点:WinuxCmd 现在也会让 `-V/--version` 成功,而不是把它误判成未知选项;普通输出仍把当前 Windows 用户名作为 login name 的近似。 - `unlink` — [unlink invocation](https://www.gnu.org/software/coreutils/manual/html_node/unlink-invocation.html); `unlink FILE`; 无常规选项; 关键点:GNU `unlink` 基本是无选项命令,WinuxCmd 现在也会让 `-V/--version` 成功,并在缺失路径和目录失败场景下输出 GNU 形状的 `cannot unlink` 诊断,把 operand 错误的 help hint 保持在 stderr,对无效选项明确输出 `unrecognized option` 和 help hint,并且在直接多参数和通配符展开成多路径这两类失败里都带出具体的多余参数;零匹配时则回退到字面路径,而目录符号链接/联接现在也会按 GNU 语义删除链接本身。 - `whoami` — [whoami invocation](https://www.gnu.org/software/coreutils/manual/html_node/whoami-invocation.html); `whoami`; 无常规选项; 关键点:WinuxCmd 现在也会让 `-V/--version` 成功,而不是把它误判成未知选项;普通输出仍报告当前有效的 Windows 用户名。 - 本地或第三方命令如 `getconf`、`cal`、`less`、`top`、`watch`、`cygpath`、`d2u`、`dos2unix`、`u2d`、`unix2dos`、`tzset`、`tree` 不属于 GNU Coreutils 对照面,继续留在实现矩阵里单独维护。 - `column` — util-linux `column` 命令;`column [options] [file ...]`;`-c/--columns`、`-t/--table`、`-s/--separator`、`-o/--output-separator`、`--table-right` / `-R`、`-H/--table-hide`、`-N/--table-no-trunc`、`-E/--table-noescape`、`-J/--json`、`-O/--output-width`; 关键点:当前 WinuxCmd 已覆盖常见 table 格式化路径、JSON 输出、自定义分隔符,以及 width/right-align 控制,另外 `--json`、`--output-width`、`--table-right` 这些常见长选项拼写现在也已接入;普通换行分隔的 `-t/--table` 路径现在会在列宽计算和输出前先剥掉 CRLF 记录尾部的 `\r`;缺失输入文件现在会输出更接近 GNU/util-linux 的 `cannot open 'FILE' for reading: No such file or directory` 诊断,而目录 operand 现在会输出 `Is a directory`。