Skip to content

v0.4.0

Choose a tag to compare

@andylbrummer andylbrummer released this 05 Apr 01:39
· 1627 commits to main since this release

v0.4.0 — Full Transpiler & Shell Binary

Features

  • ps-bash.exe shell binary — AOT-compiled native binary that transpiles bash to PowerShell and executes via persistent pwsh worker process
    • ps-bash -c 'command' for single commands
    • ps-bash -i for interactive mode
    • ps-bash -s for stdin input
    • Auto-locates pwsh via PATH, dotnet, winget, or default install paths
  • 24 transpiler transforms covering all major bash syntax:
    • Redirects: /dev/null, 2>/dev/null, &>, >&, < file
    • Variables: $VAR, export VAR=val, bare VAR=val, ${var:-default}, ${#var}, ${var//pat/repl}, ${var^^}, ${var,,}
    • Substitution: backtick `cmd`, arithmetic $(()), process <(cmd)
    • Strings: here-string <<<, heredoc <<EOF
    • Tests: [ -f file ], [[ expr ]] with ==, !=, =~, globs
    • Control flow: if/elif/else/fi, for..in..do..done, while/until, case/esac
    • Expansion: {1..5}, {a,b,c}, ~/, /tmp/
    • Pipes: grep, sed, awk, cut, tr, sort, uniq, head, tail, wc, tee, xargs
    • Expression chaining: &&/|| with automatic [void]() wrapping
  • Parlot-based parser (v2) — structured AST parser with regex fallback for complex cases
  • ls multi-column grid output — bash-style column layout when not using -l
  • Invoke-ProcessSub — runtime helper for <() process substitution via temp files
  • CI/CD — GitHub Actions build matrix (win-x64, linux-x64, osx-arm64), packaging scripts

Bug Fixes

  • All pipe transforms route to Invoke-Bash* module functions (not bare PS cmdlets)
  • .NET file APIs resolve paths against PS $PWD (not .NET CurrentDirectory)
  • ls, cp, mv, rm support glob expansion on operands
  • pwd -P uses PS working directory, not .NET process directory
  • cat handles raw string pipeline input (here-string/heredoc compatibility)
  • Parameter expansion evaluates correctly inside double-quoted strings
  • export with && chaining works correctly
  • Date format regex handles multi-word timezone names

Tests

  • 301 dotnet (xUnit) + 803 Pester = 1,104 total tests