Repository navigation
Releases: unixwin/rubash
Releases · unixwin/rubash
Release list
v1.4.3
What's Changed
- docs(readme): overhaul — Performance section with pinned numbers, honest platform status, current architecture by @caomengxuan666 in #982
- fix(executor,lexer): #940 - redirect-failure diagnostics through ordered fd table;
!+{inside groups parses by @caomengxuan666 in #976 - perf(bash-command): whitelist fast render for literal commands by @caomengxuan666 in #981
- fix(executor): word-side byte-char gate for carried-byte patterns by @caomengxuan666 in #983
- fix(carrier): #728 registry single-declaration-point + #729 byte-class pattern normalization by @caomengxuan666 in #821
- perf(builtin): short-circuit silent builtins with empty output and no redirects by @caomengxuan666 in #984
- perf(assoc): plain-$name subscript fast lane by @caomengxuan666 in #985
- perf(export): skip identity IFS-marking passes on quoteless words by @caomengxuan666 in #986
- perf(compound): linearize subscript-span scan in compound element splitting by @caomengxuan666 in #987
- assets: rubash logo — cyan rotor-r engine mark by @caomengxuan666 in #988
- perf(test): fast-expand [ $VAR -op N ] integer comparisons by @caomengxuan666 in #990
- bench: machine-readable sidecars for bench-full.sh + decoupled bench CI by @caomengxuan666 in #991
- docs(readme): ledger release qualifier + perf #984/#985/#986/#987/#990 by @caomengxuan666 in #993
- perf(signal): sample the signal-hint event every 8th command boundary (#682) by @caomengxuan666 in #989
- perf(assoc): cut per-op fixed costs on the k[i] interleave tail by @caomengxuan666 in #997
- perf(export/unset): second-pass body cuts for the export/unset interleave loop by @caomengxuan666 in #992
- fix(executor): fold the command stem's ASCII case in PATH lookup (#999) by @caomengxuan666 in #1000
- perf(split): re-land no-IFS short-circuit with empty-word exclusion by @caomengxuan666 in #1002
- fix(lexer): drop the unreachable LEX_WASDOL
${arm in the subscript walkers (niubash#503) by @caomengxuan666 in #1001 - fix(tests): isolate cli_tests from host Winuxsh install env by @a-rookie-of-C-language in #996
Full Changelog: v1.4.2...v1.4.3
v1.4.2
What's Changed
- test(regression): #812 pin suite TMPDIR under a space-free scratch anchor by @caomengxuan666 in #864
- docs(hygiene): #849 注释/坐标漂移清扫 + #768 README byte-identical 措辞(closes #849 #716 #768 #767) by @caomengxuan666 in #865
- fix(builtins,executor): #704 printf numeric validation (R6.1), command -v no-operand + substitution status (R6.2 residue) by @caomengxuan666 in #869
- fix(executor,builtins): #773 fd table capped at 1014 with a bogus EINVAL — capacity now follows ulimit -n soft, exhaustion reports EMFILE by @caomengxuan666 in #870
- fix(executor): mark_quoted_ifs_from_raw recognizes markers.rs carrier bytes (#868) by @caomengxuan666 in #874
- fix(executor): clamp the $() and backtick raw-skip copy loops to the buffer (#875) by @caomengxuan666 in #877
- fix(executor): mark_quoted_ifs_from_raw applies quoted-IFS marks on the recorded byte-offset basis (#876) by @caomengxuan666 in #882
- fix(assoc): #860 unset empty-span/mask pseudo-diagnostic + #861 kvlist self-read miss by @caomengxuan666 in #883
- docs: #716 repoint dangling TASKBOARD references to git history by @a-rookie-of-C-language in #886
- fix(builtins,executor): #866/#867 — unforgeable background-wrapper handshake + expected-parent PDEATHSIG race check by @caomengxuan666 in #873
- fix(executor,builtins): #872 fd-table nits — move_to_high_fd comment + single-source fd defaults + drop dead field by @a-rookie-of-C-language in #885
- fix(builtins): #859 — pushd -n with no operand is a silent no-op (rc 0), not the swap arm by @a-rookie-of-C-language in #889
- test(audit): #713 probe stdin EOF + refresh last-run line by @a-rookie-of-C-language in #904
- fix(executor): #846 - ! no longer flips a compound's own redirect failure by @a-rookie-of-C-language in #902
- fix(printf): #871 recognize glibc strtod inf/nan word prefixes in %f/%e/%g by @a-rookie-of-C-language in #899
- fix(executor): #858 — \ must restore the word-internal comsub \True overlay by @a-rookie-of-C-language in #891
- fix(executor): #850 — fold /cygdrive//... to the drive letter for in-shell faces by @a-rookie-of-C-language in #893
- fix(executor,builtins): #873 wrapper respawn carries the handshake argv flag only when the host CLI consumes it by @caomengxuan666 in #906
- fix #896: pushd dash family follows GNU option walk by @a-rookie-of-C-language in #901
- fix(console): no visible console window for console-less runs (niubash#451) by @caomengxuan666 in #909
- fix(expand): unset scalar base has no element 0 for operators by @caomengxuan666 in #910
- fix(login): report login_shell shopt as on for login shells by @caomengxuan666 in #911
- perf(expand): byte-wise case transform for ASCII pattern-less ops by @caomengxuan666 in #912
- test(regression): arm the #761 guards and promote lim-f5-fd-cap (#761, #773) by @caomengxuan666 in #908
- chore: #905 pin *.py eol=lf + renormalize CRLF-committed probe script by @a-rookie-of-C-language in #907
- docs: #892 contributor conventions written down (oracle, probes, env, full suite, GPL, process) by @a-rookie-of-C-language in #903
- fix(console): adopt single hidden console per detached session (niubash#462, niubash#451) by @caomengxuan666 in #913
- perf(shopt): don't materialize default-equal state, keep fast lookup path by @caomengxuan666 in #915
- fix(executor): inline tput arm — Windows-only whitelist answers byte-equal to GNU ncurses (#800 face A) by @caomengxuan666 in #884
- perf(env): gate the process-env mirror on special names (#916) by @caomengxuan666 in #917
- perf(env): write-behind marker strings, read from structured flags by @caomengxuan666 in #918
- perf(array): typed-cell reads with dirty-flag invalidation (#914) by @caomengxuan666 in #919
- perf(export/unset): single-probe mirror, gated env fallback, bulk unmark (#916) by @caomengxuan666 in #920
- perf(dispatch): hoist case word, merge test Vecs, memoize at-join by @caomengxuan666 in #921
- perf(arith): single-static parse cache for CmpLT + PostInc by @caomengxuan666 in #922
- perf(array): drop redundant mirror clone on element read path by @caomengxuan666 in #923
- perf(array): hoist typed-cell read before mirror clone on element path by @caomengxuan666 in #924
- perf(for-arith): counter fast driver for canonical counting loops by @caomengxuan666 in #925
- test(cli): interleave typed-cell matrix across builtin writes by @caomengxuan666 in #926
- test: land semantic-edge regression suites (test/shift/arith) by @caomengxuan666 in #927
- test: vendor oils spec cases for arith/bracket/array/assoc by @caomengxuan666 in #928
- test: dirty-flag unit + integration semantics by @caomengxuan666 in #929
- perf(test): whitelist fast path for pure-decimal comparisons by @caomengxuan666 in #930
- perf(arith): AddAssign cache slot for x+=i / x+=1 by @caomengxuan666 in #931
- perf(assoc): typed-cell read for single-element assoc lookups by @caomengxuan666 in #937
- docs(readme): #768 — split byte-identical into raw + env-classified + clean (zh-CN synced) by @caomengxuan666 in #932
- docs: #878 CR nits rework — correct command.def/printf.def coordinates (#888 review) by @caomengxuan666 in #933
- fix(printf): #879 PR #900 review rework — hex window pexp, denormal guard, decimal window, '0' on inf/nan by @caomengxuan666 in #935
- fix(executor,lexer): #880 rework -- close the two PR#898 review blockers by @caomengxuan666 in #936
- audit(713): third nested-context pass — 56 probes, #934 faces pinned, $0-spelling normalized by @caomengxuan666 in #941
- build(provenance): stamp -dirty- of the worktree diff into the version banner (rubash#827) by @caomengxuan666 in #939
- fix(script-entry): escape literal marker-zone chars in script text — isolated U+E000 passthrough (#856) by @caomengxuan666 in #946
- fix(executor): E400-aware sentinel decode family for marker output boundary by @caomengxuan666 in #947
- test(regression): #746 catalogue second batch + manifest exhaustiveness gate by @caomengxuan666 in #944
- test(regression): flip issue-879 catalogue row to must-match (rubash#949) by @caomengxuan666 in #950
- perf(array): negative-literal subscript fast lane via typed cell by @caomengxuan666 in #942
- perf(shift): offset-window positional params, drop per-shift clone+drain by @caomengxuan666 in #954
- perf(expand): literal-word fast path in expand_word_mut + command words by @caomengxuan666 in #956
- fix(reader): end grouped gather at a stray close inside an open group (niubash#482) by @caomengxuan666 in #955
- chore(vendor): bump third_party/bash to Bash-5.3 patch 20 (9c465866) (#895) by @caomengxuan666 in #957
- fix(executor,cd): bare drive designator D:/cd D: converge on the engine dispatch by @caomengxuan666 in #953
- fix(main): -c operand marker-zone entry escaping — respawn exclusion is double-escape only (rubash#948) by @caomengxuan666 in #952
- perf(case): render head-only for $BASH_COMMAND, lazy word_chars, gated debug-trap head by @caomengxuan666 in #958
- perf(array): decimal-subscript write fast lane, alloc-free mirror append by @caomengxuan666 in #959
- perf(assoc): trim per-op fixed costs on the write fast lane (#618) by @caomengxuan666 in #960
- fix(executor): sync typed assoc cell on nameref element assignment (#961) by @caomengxuan666 in #962
- perf(assoc): skip discarded whole-word pass on side-effect-free element writes by @caomengxuan666 in #963
- fix(executor): sync typed cells on parameter default-assign + compound-append; add coherence verifier by @c...
v1.4.1
rubash 1.4.1
1.4.1 是 1.4.0 的健康重发:1.4.0 的发行资产曾被审计发现构建自浮动克隆的错误源码状态(#827)——1.4.1 起发行链把引擎源锁到精确 commit(失配即失败),脏构建会在 niu --version 里自曝。建议所有 1.4.0 用户升级。
行为修复(引擎)
- ERR trap 嵌套语义:嵌套子壳过火/扁平函数体欠火/return 归因三面与 GNU bash 5.3 逐字节一致(#720,17 例差分回归)
- patsub 替换文本转义:替换文本中的用户 PUA 字符不再与内部标记碰撞(
v=abc; r="${v/b/$'\uE312x'}"类形态修复)(#843) - 下标 ANSI-C 双态法则:
$'...'在双引号内不再被错误解码;unset的带引号下标操作数按 GNU 引号移除语义解析(#847) - pushd/popd:readonly OLDPWD/PWD 检查对齐 GNU(失败栈不弹 rc 1);越界报错引用真正越界的词(#844/#848)
${var@P}:prompt 变换不再泄漏命令替换状态到后续$?(#813)
工程与发布
- 发行 tag 自动化扩展到补丁版(此前 x.y.1+ 无自动化通道);crate 包增加构建变体目录护栏(#851/#862/#863)
- 快照真相钉死:GNU bash 自身竞态(nameref)与交互续行语义的回归锚(#845/#852)
质量
- 全量 GNU 上游 83 套语料持续 100% 通过(82 套逐字节一致);每项修复带双向差分证据与独立代码评审
完整变更清单见仓库 CHANGELOG 与各 issue/PR。1.4.0 → 1.4.1 的引擎语义差异同步进入 niubash 1.4.1(下个发布)。
v1.4.0
What's Changed
- fix(env): skip invalid-identifier env names like GNU bash 5.3 (niubash #102) by @caomengxuan666 in #106
- fix(xtrace): complete G16 - single raw (( )) trace, for/case heads, assignment prefix by @caomengxuan666 in #107
- fix(assignment): restore \x18 escaped-quote carrier in quoted-assignment fast path (niubash #103) by @caomengxuan666 in #108
- fix: land local master batch — heredoc warnings, arithmetic messages, ifs multibyte, printf locale, raw-byte markers, let $var by @caomengxuan666 in #110
- fix: niubash #106/#107/#108 regressions + restore #103 array fix lost in rescue merge by @caomengxuan666 in #111
- fix(cli): expand bundled short options containing -l/-i with -c by @caomengxuan666 in #112
- fix(eval): render the data-double-quote marker back to source before re-parsing by @caomengxuan666 in #114
- fix(capture): strip a CRLF terminator from command-substitution output (niubash #120) by @caomengxuan666 in #115
- fix(lexer): 函数定义/花括号组同行
#尾注释解析失败(#118) by @caomengxuan666 in #119 - test(executor): pin GNU exit-unwind semantics through AND-OR lists by @daiaji in #122
- fix(executor): cmdsub child drops inherited fd-1 binding by @daiaji in #123
- fix(utf8): stop widening payload bytes in [[ =~ ]] RHS and compound xtrace by @daiaji in #124
- chore: bump to 1.2.1 by @caomengxuan666 in #366
- fix: sync Cargo.lock to 1.2.1 by @caomengxuan666 in #367
- fix(windows): preserve backslashes before quotes in forced-quoted argv by @I-Want-ToBelieve in #442
- fix(windows): normalize prefix TMPDIR at native child boundary by @Uarz in #446
- ci: community bots — stale 清扫(豁免 P0/P1)+ 首次贡献者问候 by @caomengxuan666 in #450
- fix(cat): open the redirect target once in the streaming cat paths by @bbvdf in #447
- fix(ulimit): compile against musl and OpenHarmony libcs by @caomengxuan666 in #449
- fix(parser): 赋值前缀 + 子 shell — GNU 形态(审计语料 #452 集群1) by @caomengxuan666 in #453
- complete: accept dashed function names in -F (fixes #427) by @caomengxuan666 in #454
- fix(executor): broken-pipe writes no longer abort the interpreter (rubash#440) by @caomengxuan666 in #455
- fix(android): compile against bionic for aarch64/armv7 android targets by @caomengxuan666 in #456
- test(source): pin sourced
exit Nshell-termination semantics (rubash#426) by @caomengxuan666 in #457 - fix(input): normalize C0 control bytes on bridge-delivered interactive lines by @caomengxuan666 in #458
- test(parser): pin GNU semantics for tokens on the function-definition brace line (rubash#443) by @caomengxuan666 in #459
- test(parser): pin #424 redirect-target rejection and procsub input-side regressions by @caomengxuan666 in #464
- fix(executor): keep quoted whole-word default expansions one compound element by @caomengxuan666 in #466
- fix(trap): do not fire the ERR trap for word/assignment expansion errors by @caomengxuan666 in #467
- fix(executor): pass process-substitution fds to external command arguments on Unix by @caomengxuan666 in #468
- fix(executor): coproc 子进程继承父函数表快照,DEBUG trap 函数可解析 (fixes #441) by @caomengxuan666 in #469
- ci: greet 输入改 snake_case,first-interaction 真正生效(镜像 niubash#224) by @caomengxuan666 in #470
- ci: greet 输入改 snake_case,first-interaction 真正生效 by @caomengxuan666 in #471
- fix(path): translate /mnt/X drive argv for every child class (niubash#164) by @caomengxuan666 in #444
- fix(lexer): nested keyword-form function bodies count as group openers in skip_brace (fixes #465) by @caomengxuan666 in #472
- fix(parse): =~ regex word fragments are word data, never reserved words (fixes #461) by @caomengxuan666 in #473
- fix(lexer): raw-byte tag a word-initial data ESC (niubash#200) by @caomengxuan666 in #474
- fix(parser): accept terminator-less then/do after ]] and (( )) in compound bodies by @caomengxuan666 in #475
- fix(parser): accept function-def name words containing unquoted $( ) (#462) by @caomengxuan666 in #476
- docs: 归档过时状态快照文档(7 个)+ CHANGELOG 补 #455/#456/#458 by @caomengxuan666 in #478
- fix(prompt): strip [ ] ignore-markers on every PS1 render path by @caomengxuan666 in #480
- fix(source): source 边界上的语法错误中止降级为 reader discard,不再终止会话(#451 类 B) by @caomengxuan666 in #481
- feat(repl): raw-console readline editing for the standalone interactive shell (rubash#419 readline leg) by @caomengxuan666 in #482
- lexer: join lines while a word-attached procsub body is open (fixes #463) by @caomengxuan666 in #483
- perf(executor): single-handle cd/pwd comsub path resolution (rubash#375) by @caomengxuan666 in #484
- perf(lexer): opener-state checkpoint - fold passes resume from the bare { (rubash#281) by @caomengxuan666 in #486
- feat(startup): login shell chain /etc/profile -> ~/.bash_profile family (#487) by @caomengxuan666 in #489
- feat(cli): --version appends build hash/profile and a Windows persona note (rubash#488) by @caomengxuan666 in #490
- fix(executor): propagate command-substitution status to in-word $? (rubash#485) by @caomengxuan666 in #491
- audit(platform-cfg): full platform-gate inventory; fix android signal-table legs (kill/trap) by @caomengxuan666 in #492
- fix(executor): comsub reap publishes its status to $? before the enclosing command runs (rubash#485) by @caomengxuan666 in #494
- docs: README style pass (minimal, fact-preserving) by @caomengxuan666 in #495
- chore(release): prepare 1.4.0 — version bump, CHANGELOG, packaging slim-down, release notes draft by @caomengxuan666 in #498
- tests/regression: re-baseline stale suite snapshots + airtight snapshot env + CI golden-refresh artifact by @caomengxuan666 in #496
- cross-platform: gate residual Windows assumptions outside cfg(windows) + stale doc claims by @caomengxuan666 in #499
- docs(readme): evidence-first restructure with cross-platform identity (EN+zh) by @caomengxuan666 in #500
- perf(executor): hot-path residue — test marks gate, word materialization once, assignment scan admission (rubash#242) by @caomengxuan666 in #501
- docs: repoint deleted COMPATIBILITY-STATUS.md references to the current ledger by @caomengxuan666 in #502
- docs(ledger): GNU suite 83/83 — nameref residual proven to be GNU's own coproc reap race by @caomengxuan666 in #506
- [P0] fix(#511): cat inline path re-expands already-expanded argv - silent wrong-file read by @caomengxuan666 in #552
- fix: four P1-high semantic divergences - errexit body adjudication, stdin parse-error status, printf write-failure status, dirstack EX_USAGE by @caomengxuan666 in #553
- fix(pwd): PWD family unconditionally POSIX // form — retire the native-PWD style hatch (#537) by @caomengxuan666 in #556
- fix(#553): compound's own failed redirection fires ERR again - unblock redir snapshot by @caomengxuan666 in #557
- [P0] fix(#555): mkdir/touch/cp/rm/rmdir re-expand already-expanded argv - silent wrong-path corruption by @caomengxuan666 in #558
- perf(lexer): parse-throughput construction wins - fold-before-push, gated leading_ws capture, TokStr reader state (rubash#241) by @caomengxuan666 in #554
- fix(shim): forward the sh invocation name so the host honors its GNU contract by @caomengxuan666 in #504
- fix: Wave2a shell semantics batch - SIGQUIT policy ignore, -r entry via -s, readonly attr refusal, declare -na shape wins, ERR single-fire guard by @caomengxuan666 in #560
- P1 Wave1: six semantic fixes (#524 #525 #529 #532 #535 #536) — trap exit unwind, pipeline redirect failures, indirect declared-unset, runtime bad substitution, redirect-word nounset, malformed subscripts by @...
v1.2.0
What's Changed
- fix(exec): capture external child stdout inside builtin pipeline stages (niubash#93) by @caomengxuan666 in #102
- fix(path): /tmp and /var/tmp resolve to per-user temp even with shell root by @caomengxuan666 in #103
- fix(expansion/pipeline/invocation): four fast-path fidelity bugs found via differential testing vs GNU bash by @SuperYogurt in #101
- fix(comsub): keep fragment bytes byte-exact through field materialization (niubash#92 follow-up) by @caomengxuan666 in #104
- docs(readme): sync compatibility numbers to the 2026-09-14 ledger by @caomengxuan666 in #105
New Contributors
- @SuperYogurt made their first contribution in #101
Full Changelog: v1.1.0...v1.2.0