[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FX56WRZC73Q009MZHB4DFP":3,"skill-same:01M6FX56WRZC73Q009MZHB4DFP":48},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":21,"linkOnly":22,"markdownContent":23,"markdownBody":24,"frontMatter":25,"refName":26,"commitSha":27,"skillDirectory":28,"forksCount":13,"repositoryHtmlUrl":29,"repositoryHomepageUrl":6,"ownerHtmlUrl":30,"ownerBlogUrl":31,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M6FX56WRZC73Q009MZHB4DFP","posix-shell-pro",null,"reikiplanet\u002Fdaoskills","reikiplanet","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F96377599?v=4","01M6CVWCMD740YHQDK7E9QYBW4","Reiki Planet","01M6CVWCS4KXVA2CWFVJ43EAXK",0,"MIT","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fother\u002Fposix-shell-pro\u002FSKILL.md",[],[18,19,20],"shell","posix shell pro","pro","2026-11-10 10:12:30",false,"---\nname: posix-shell-pro\ndescription: \"Expert in strict POSIX sh scripting for maximum portability across\"\n  Unix-like systems. Specializes in shell scripts that run on any\n  POSIX-compliant shell (dash, ash, sh, bash --posix).\nmetadata:\n  model: sonnet\nrisk: unknown\nsource: community\n---\n\n## Use this skill when\n\n- Working on posix shell pro tasks or workflows\n- Needing guidance, best practices, or checklists for posix shell pro\n\n## Do not use this skill when\n\n- The task is unrelated to posix shell pro\n- You need a different domain or tool outside this scope\n\n## Instructions\n\n- Clarify goals, constraints, and required inputs.\n- Apply relevant best practices and validate outcomes.\n- Provide actionable steps and verification.\n- If detailed examples are required, open `resources\u002Fimplementation-playbook.md`.\n\n## Focus Areas\n\n- Strict POSIX compliance for maximum portability\n- Shell-agnostic scripting that works on any Unix-like system\n- Defensive programming with portable error handling\n- Safe argument parsing without bash-specific features\n- Portable file operations and resource management\n- Cross-platform compatibility (Linux, BSD, Solaris, AIX, macOS)\n- Testing with dash, ash, and POSIX mode validation\n- Static analysis with ShellCheck in POSIX mode\n- Minimalist approach using only POSIX-specified features\n- Compatibility with legacy systems and embedded environments\n\n## POSIX Constraints\n\n- No arrays (use positional parameters or delimited strings)\n- No `[[` conditionals (use `[` test command only)\n- No process substitution `\u003C()` or `>()`\n- No brace expansion `{1..10}`\n- No `local` keyword (use function-scoped variables carefully)\n- No `declare`, `typeset`, or `readonly` for variable attributes\n- No `+=` operator for string concatenation\n- No `${var\u002F\u002Fpattern\u002Freplacement}` substitution\n- No associative arrays or hash tables\n- No `source` command (use `.` for sourcing files)\n\n## Approach\n\n- Always use `#!\u002Fbin\u002Fsh` shebang for POSIX shell\n- Use `set -eu` for error handling (no `pipefail` in POSIX)\n- Quote all variable expansions: `\"$var\"` never `$var`\n- Use `[ ]` for all conditional tests, never `[[`\n- Implement argument parsing with `while` and `case` (no `getopts` for long options)\n- Create temporary files safely with `mktemp` and cleanup traps\n- Use `printf` instead of `echo` for all output (echo behavior varies)\n- Use `. script.sh` instead of `source script.sh` for sourcing\n- Implement error handling with explicit `|| exit 1` checks\n- Design scripts to be idempotent and support dry-run modes\n- Use `IFS` manipulation carefully and restore original value\n- Validate inputs with `[ -n \"$var\" ]` and `[ -z \"$var\" ]` tests\n- End option parsing with `--` and use `rm -rf -- \"$dir\"` for safety\n- Use command substitution `$()` instead of backticks for readability\n- Implement structured logging with timestamps using `date`\n- Test scripts with dash\u002Fash to verify POSIX compliance\n\n## Compatibility & Portability\n\n- Use `#!\u002Fbin\u002Fsh` to invoke the system's POSIX shell\n- Test on multiple shells: dash (Debian\u002FUbuntu default), ash (Alpine\u002FBusyBox), bash --posix\n- Avoid GNU-specific options; use POSIX-specified flags only\n- Handle platform differences: `uname -s` for OS detection\n- Use `command -v` instead of `which` (more portable)\n- Check for command availability: `command -v cmd >\u002Fdev\u002Fnull 2>&1 || exit 1`\n- Provide portable implementations for missing utilities\n- Use `[ -e \"$file\" ]` for existence checks (works on all systems)\n- Avoid `\u002Fdev\u002Fstdin`, `\u002Fdev\u002Fstdout` (not universally available)\n- Use explicit redirection instead of `&>` (bash-specific)\n\n## Readability & Maintainability\n\n- Use descriptive variable names in UPPER_CASE for exports, lower_case for locals\n- Add section headers with comment blocks for organization\n- Keep functions under 50 lines; extract complex logic\n- Use consistent indentation (spaces only, typically 2 or 4)\n- Document function purpose and parameters in comments\n- Use meaningful names: `validate_input` not `check`\n- Add comments for non-obvious POSIX workarounds\n- Group related functions with descriptive headers\n- Extract repeated code into functions\n- Use blank lines to separate logical sections\n\n## Safety & Security Patterns\n\n- Quote all variable expansions to prevent word splitting\n- Validate file permissions before operations: `[ -r \"$file\" ] || exit 1`\n- Sanitize user input before using in commands\n- Validate numeric input: `case $num in *[!0-9]*) exit 1 ;; esac`\n- Never use `eval` on untrusted input\n- Use `--` to separate options from arguments: `rm -- \"$file\"`\n- Validate required variables: `[ -n \"$VAR\" ] || { echo \"VAR required\" >&2; exit 1; }`\n- Check exit codes explicitly: `cmd || { echo \"failed\" >&2; exit 1; }`\n- Use `trap` for cleanup: `trap 'rm -f \"$tmpfile\"' EXIT INT TERM`\n- Set restrictive umask for sensitive files: `umask 077`\n- Log security-relevant operations to syslog or file\n- Validate file paths don't contain unexpected characters\n- Use full paths for commands in security-critical scripts: `\u002Fbin\u002Frm` not `rm`\n\n## Performance Optimization\n\n- Use shell built-ins over external commands when possible\n- Avoid spawning subshells in loops: use `while read` not `for i in $(cat)`\n- Cache command results in variables instead of repeated execution\n- Use `case` for multiple string comparisons (faster than repeated `if`)\n- Process files line-by-line for large files\n- Use `expr` or `$(( ))` for arithmetic (POSIX supports `$(( ))`)\n- Minimize external command calls in tight loops\n- Use `grep -q` when you only need true\u002Ffalse (faster than capturing output)\n- Batch similar operations together\n- Use here-documents for multi-line strings instead of multiple echo calls\n\n## Documentation Standards\n\n- Implement `-h` flag for help (avoid `--help` without proper parsing)\n- Include usage message showing synopsis and options\n- Document required vs optional arguments clearly\n- List exit codes: 0=success, 1=error, specific codes for specific failures\n- Document prerequisites and required commands\n- Add header comment with script purpose and author\n- Include examples of common usage patterns\n- Document environment variables used by script\n- Provide troubleshooting guidance for common issues\n- Note POSIX compliance in documentation\n\n## Working Without Arrays\n\nSince POSIX sh lacks arrays, use these patterns:\n\n- **Positional Parameters**: `set -- item1 item2 item3; for arg; do echo \"$arg\"; done`\n- **Delimited Strings**: `items=\"a:b:c\"; IFS=:; set -- $items; IFS=' '`\n- **Newline-Separated**: `items=\"a\\nb\\nc\"; while IFS= read -r item; do echo \"$item\"; done \u003C\u003CEOF`\n- **Counters**: `i=0; while [ $i -lt 10 ]; do i=$((i+1)); done`\n- **Field Splitting**: Use `cut`, `awk`, or parameter expansion for string splitting\n\n## Portable Conditionals\n\nUse `[ ]` test command with POSIX operators:\n\n- **File Tests**: `[ -e file ]` exists, `[ -f file ]` regular file, `[ -d dir ]` directory\n- **String Tests**: `[ -z \"$str\" ]` empty, `[ -n \"$str\" ]` not empty, `[ \"$a\" = \"$b\" ]` equal\n- **Numeric Tests**: `[ \"$a\" -eq \"$b\" ]` equal, `[ \"$a\" -lt \"$b\" ]` less than\n- **Logical**: `[ cond1 ] && [ cond2 ]` AND, `[ cond1 ] || [ cond2 ]` OR\n- **Negation**: `[ ! -f file ]` not a file\n- **Pattern Matching**: Use `case` not `[[ =~ ]]`\n\n## CI\u002FCD Integration\n\n- **Matrix testing**: Test across dash, ash, bash --posix, yash on Linux, macOS, Alpine\n- **Container testing**: Use alpine:latest (ash), debian:stable (dash) for reproducible tests\n- **Pre-commit hooks**: Configure checkbashisms, shellcheck -s sh, shfmt -ln posix\n- **GitHub Actions**: Use shellcheck-problem-matchers with POSIX mode\n- **Cross-platform validation**: Test on Linux, macOS, FreeBSD, NetBSD\n- **BusyBox testing**: Validate on BusyBox environments for embedded systems\n- **Automated releases**: Tag versions and generate portable distribution packages\n- **Coverage tracking**: Ensure test coverage across all POSIX shells\n- Example workflow: `shellcheck -s sh *.sh && shfmt -ln posix -d *.sh && checkbashisms *.sh`\n\n## Embedded Systems & Limited Environments\n\n- **BusyBox compatibility**: Test with BusyBox's limited ash implementation\n- **Alpine Linux**: Default shell is BusyBox ash, not bash\n- **Resource constraints**: Minimize memory usage, avoid spawning excessive processes\n- **Missing utilities**: Provide fallbacks when common tools unavailable (`mktemp`, `seq`)\n- **Read-only filesystems**: Handle scenarios where `\u002Ftmp` may be restricted\n- **No coreutils**: Some environments lack GNU coreutils extensions\n- **Signal handling**: Limited signal support in minimal environments\n- **Startup scripts**: Init scripts must be POSIX for maximum compatibility\n- Example: Check for mktemp: `command -v mktemp >\u002Fdev\u002Fnull 2>&1 || mktemp() { ... }`\n\n## Migration from Bash to POSIX sh\n\n- **Assessment**: Run `checkbashisms` to identify bash-specific constructs\n- **Array elimination**: Convert arrays to delimited strings or positional parameters\n- **Conditional updates**: Replace `[[` with `[` and adjust regex to `case` patterns\n- **Local variables**: Remove `local` keyword, use function prefixes instead\n- **Process substitution**: Replace `\u003C()` with temporary files or pipes\n- **Parameter expansion**: Use `sed`\u002F`awk` for complex string manipulation\n- **Testing strategy**: Incremental conversion with continuous validation\n- **Documentation**: Note any POSIX limitations or workarounds\n- **Gradual migration**: Convert one function at a time, test thoroughly\n- **Fallback support**: Maintain dual implementations during transition if needed\n\n## Quality Checklist\n\n- Scripts pass ShellCheck with `-s sh` flag (POSIX mode)\n- Code is formatted consistently with shfmt using `-ln posix`\n- Test on multiple shells: dash, ash, bash --posix, yash\n- All variable expansions are properly quoted\n- No bash-specific features used (arrays, `[[`, `local`, etc.)\n- Error handling covers all failure modes\n- Temporary resources cleaned up with EXIT trap\n- Scripts provide clear usage information\n- Input validation prevents injection attacks\n- Scripts portable across Unix-like systems (Linux, BSD, Solaris, macOS, Alpine)\n- BusyBox compatibility validated for embedded use cases\n- No GNU-specific extensions or flags used\n\n## Output\n\n- POSIX-compliant shell scripts maximizing portability\n- Test suites using shellspec or bats-core validating across dash, ash, yash\n- CI\u002FCD configurations for multi-shell matrix testing\n- Portable implementations of common patterns with fallbacks\n- Documentation on POSIX limitations and workarounds with examples\n- Migration guides for converting bash scripts to POSIX sh incrementally\n- Cross-platform compatibility matrices (Linux, BSD, macOS, Solaris, Alpine)\n- Performance benchmarks comparing different POSIX shells\n- Fallback implementations for missing utilities (mktemp, seq, timeout)\n- BusyBox-compatible scripts for embedded and container environments\n- Package distributions for various platforms without bash dependency\n\n## Essential Tools\n\n### Static Analysis & Formatting\n- **ShellCheck**: Static analyzer with `-s sh` for POSIX mode validation\n- **shfmt**: Shell formatter with `-ln posix` option for POSIX syntax\n- **checkbashisms**: Detects bash-specific constructs in scripts (from devscripts)\n- **Semgrep**: SAST with POSIX-specific security rules\n- **CodeQL**: Security scanning for shell scripts\n\n### POSIX Shell Implementations for Testing\n- **dash**: Debian Almquist Shell - lightweight, strict POSIX compliance (primary test target)\n- **ash**: Almquist Shell - BusyBox default, embedded systems\n- **yash**: Yet Another Shell - strict POSIX conformance validation\n- **posh**: Policy-compliant Ordinary Shell - Debian policy compliance\n- **osh**: Oil Shell - modern POSIX-compatible shell with better error messages\n- **bash --posix**: GNU Bash in POSIX mode for compatibility testing\n\n### Testing Frameworks\n- **bats-core**: Bash testing framework (works with POSIX sh)\n- **shellspec**: BDD-style testing that supports POSIX sh\n- **shunit2**: xUnit-style framework with POSIX sh support\n- **sharness**: Test framework used by Git (POSIX-compatible)\n\n## Common Pitfalls to Avoid\n\n- Using `[[` instead of `[` (bash-specific)\n- Using arrays (not in POSIX sh)\n- Using `local` keyword (bash\u002Fksh extension)\n- Using `echo` without `printf` (behavior varies across implementations)\n- Using `source` instead of `.` for sourcing scripts\n- Using bash-specific parameter expansion: `${var\u002F\u002Fpattern\u002Freplacement}`\n- Using process substitution `\u003C()` or `>()`\n- Using `function` keyword (ksh\u002Fbash syntax)\n- Using `$RANDOM` variable (not in POSIX)\n- Using `read -a` for arrays (bash-specific)\n- Using `set -o pipefail` (bash-specific)\n- Using `&>` for redirection (use `>file 2>&1`)\n\n## Advanced Techniques\n\n- **Error Trapping**: `trap 'echo \"Error at line $LINENO\" >&2; exit 1' EXIT; trap - EXIT` on success\n- **Safe Temp Files**: `tmpfile=$(mktemp) || exit 1; trap 'rm -f \"$tmpfile\"' EXIT INT TERM`\n- **Simulating Arrays**: `set -- item1 item2 item3; for arg; do process \"$arg\"; done`\n- **Field Parsing**: `IFS=:; while read -r user pass uid gid; do ...; done \u003C \u002Fetc\u002Fpasswd`\n- **String Replacement**: `echo \"$str\" | sed 's\u002Fold\u002Fnew\u002Fg'` or use parameter expansion `${str%suffix}`\n- **Default Values**: `value=${var:-default}` assigns default if var unset or null\n- **Portable Functions**: Avoid `function` keyword, use `func_name() { ... }`\n- **Subshell Isolation**: `(cd dir && cmd)` changes directory without affecting parent\n- **Here-documents**: `cat \u003C\u003C'EOF'` with quotes prevents variable expansion\n- **Command Existence**: `command -v cmd >\u002Fdev\u002Fnull 2>&1 && echo \"found\" || echo \"missing\"`\n\n## POSIX-Specific Best Practices\n\n- Always quote variable expansions: `\"$var\"` not `$var`\n- Use `[ ]` with proper spacing: `[ \"$a\" = \"$b\" ]` not `[\"$a\"=\"$b\"]`\n- Use `=` for string comparison, not `==` (bash extension)\n- Use `.` for sourcing, not `source`\n- Use `printf` for all output, avoid `echo -e` or `echo -n`\n- Use `$(( ))` for arithmetic, not `let` or `declare -i`\n- Use `case` for pattern matching, not `[[ =~ ]]`\n- Test scripts with `sh -n script.sh` to check syntax\n- Use `command -v` not `type` or `which` for portability\n- Explicitly handle all error conditions with `|| exit 1`\n\n## References & Further Reading\n\n### POSIX Standards & Specifications\n- [POSIX Shell Command Language](https:\u002F\u002Fpubs.opengroup.org\u002Fonlinepubs\u002F9699919799\u002Futilities\u002FV3_chap02.html) - Official POSIX.1-2024 specification\n- [POSIX Utilities](https:\u002F\u002Fpubs.opengroup.org\u002Fonlinepubs\u002F9699919799\u002Fidx\u002Futilities.html) - Complete list of POSIX-mandated utilities\n- [Autoconf Portable Shell Programming](https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Fautoconf\u002Fmanual\u002Fautoconf.html#Portable-Shell) - Comprehensive portability guide from GNU\n\n### Portability & Best Practices\n- [Rich's sh (POSIX shell) tricks](http:\u002F\u002Fwww.etalabs.net\u002Fsh_tricks.html) - Advanced POSIX shell techniques\n- [Suckless Shell Style Guide](https:\u002F\u002Fsuckless.org\u002Fcoding_style\u002F) - Minimalist POSIX sh patterns\n- [FreeBSD Porter's Handbook - Shell](https:\u002F\u002Fdocs.freebsd.org\u002Fen\u002Fbooks\u002Fporters-handbook\u002Fmakefiles\u002F#porting-shlibs) - BSD portability considerations\n\n### Tools & Testing\n- [checkbashisms](https:\u002F\u002Fmanpages.debian.org\u002Ftesting\u002Fdevscripts\u002Fcheckbashisms.1.en.html) - Detect bash-specific constructs\n","## Use this skill when\n\n- Working on posix shell pro tasks or workflows\n- Needing guidance, best practices, or checklists for posix shell pro\n\n## Do not use this skill when\n\n- The task is unrelated to posix shell pro\n- You need a different domain or tool outside this scope\n\n## Instructions\n\n- Clarify goals, constraints, and required inputs.\n- Apply relevant best practices and validate outcomes.\n- Provide actionable steps and verification.\n- If detailed examples are required, open `resources\u002Fimplementation-playbook.md`.\n\n## Focus Areas\n\n- Strict POSIX compliance for maximum portability\n- Shell-agnostic scripting that works on any Unix-like system\n- Defensive programming with portable error handling\n- Safe argument parsing without bash-specific features\n- Portable file operations and resource management\n- Cross-platform compatibility (Linux, BSD, Solaris, AIX, macOS)\n- Testing with dash, ash, and POSIX mode validation\n- Static analysis with ShellCheck in POSIX mode\n- Minimalist approach using only POSIX-specified features\n- Compatibility with legacy systems and embedded environments\n\n## POSIX Constraints\n\n- No arrays (use positional parameters or delimited strings)\n- No `[[` conditionals (use `[` test command only)\n- No process substitution `\u003C()` or `>()`\n- No brace expansion `{1..10}`\n- No `local` keyword (use function-scoped variables carefully)\n- No `declare`, `typeset`, or `readonly` for variable attributes\n- No `+=` operator for string concatenation\n- No `${var\u002F\u002Fpattern\u002Freplacement}` substitution\n- No associative arrays or hash tables\n- No `source` command (use `.` for sourcing files)\n\n## Approach\n\n- Always use `#!\u002Fbin\u002Fsh` shebang for POSIX shell\n- Use `set -eu` for error handling (no `pipefail` in POSIX)\n- Quote all variable expansions: `\"$var\"` never `$var`\n- Use `[ ]` for all conditional tests, never `[[`\n- Implement argument parsing with `while` and `case` (no `getopts` for long options)\n- Create temporary files safely with `mktemp` and cleanup traps\n- Use `printf` instead of `echo` for all output (echo behavior varies)\n- Use `. script.sh` instead of `source script.sh` for sourcing\n- Implement error handling with explicit `|| exit 1` checks\n- Design scripts to be idempotent and support dry-run modes\n- Use `IFS` manipulation carefully and restore original value\n- Validate inputs with `[ -n \"$var\" ]` and `[ -z \"$var\" ]` tests\n- End option parsing with `--` and use `rm -rf -- \"$dir\"` for safety\n- Use command substitution `$()` instead of backticks for readability\n- Implement structured logging with timestamps using `date`\n- Test scripts with dash\u002Fash to verify POSIX compliance\n\n## Compatibility & Portability\n\n- Use `#!\u002Fbin\u002Fsh` to invoke the system's POSIX shell\n- Test on multiple shells: dash (Debian\u002FUbuntu default), ash (Alpine\u002FBusyBox), bash --posix\n- Avoid GNU-specific options; use POSIX-specified flags only\n- Handle platform differences: `uname -s` for OS detection\n- Use `command -v` instead of `which` (more portable)\n- Check for command availability: `command -v cmd >\u002Fdev\u002Fnull 2>&1 || exit 1`\n- Provide portable implementations for missing utilities\n- Use `[ -e \"$file\" ]` for existence checks (works on all systems)\n- Avoid `\u002Fdev\u002Fstdin`, `\u002Fdev\u002Fstdout` (not universally available)\n- Use explicit redirection instead of `&>` (bash-specific)\n\n## Readability & Maintainability\n\n- Use descriptive variable names in UPPER_CASE for exports, lower_case for locals\n- Add section headers with comment blocks for organization\n- Keep functions under 50 lines; extract complex logic\n- Use consistent indentation (spaces only, typically 2 or 4)\n- Document function purpose and parameters in comments\n- Use meaningful names: `validate_input` not `check`\n- Add comments for non-obvious POSIX workarounds\n- Group related functions with descriptive headers\n- Extract repeated code into functions\n- Use blank lines to separate logical sections\n\n## Safety & Security Patterns\n\n- Quote all variable expansions to prevent word splitting\n- Validate file permissions before operations: `[ -r \"$file\" ] || exit 1`\n- Sanitize user input before using in commands\n- Validate numeric input: `case $num in *[!0-9]*) exit 1 ;; esac`\n- Never use `eval` on untrusted input\n- Use `--` to separate options from arguments: `rm -- \"$file\"`\n- Validate required variables: `[ -n \"$VAR\" ] || { echo \"VAR required\" >&2; exit 1; }`\n- Check exit codes explicitly: `cmd || { echo \"failed\" >&2; exit 1; }`\n- Use `trap` for cleanup: `trap 'rm -f \"$tmpfile\"' EXIT INT TERM`\n- Set restrictive umask for sensitive files: `umask 077`\n- Log security-relevant operations to syslog or file\n- Validate file paths don't contain unexpected characters\n- Use full paths for commands in security-critical scripts: `\u002Fbin\u002Frm` not `rm`\n\n## Performance Optimization\n\n- Use shell built-ins over external commands when possible\n- Avoid spawning subshells in loops: use `while read` not `for i in $(cat)`\n- Cache command results in variables instead of repeated execution\n- Use `case` for multiple string comparisons (faster than repeated `if`)\n- Process files line-by-line for large files\n- Use `expr` or `$(( ))` for arithmetic (POSIX supports `$(( ))`)\n- Minimize external command calls in tight loops\n- Use `grep -q` when you only need true\u002Ffalse (faster than capturing output)\n- Batch similar operations together\n- Use here-documents for multi-line strings instead of multiple echo calls\n\n## Documentation Standards\n\n- Implement `-h` flag for help (avoid `--help` without proper parsing)\n- Include usage message showing synopsis and options\n- Document required vs optional arguments clearly\n- List exit codes: 0=success, 1=error, specific codes for specific failures\n- Document prerequisites and required commands\n- Add header comment with script purpose and author\n- Include examples of common usage patterns\n- Document environment variables used by script\n- Provide troubleshooting guidance for common issues\n- Note POSIX compliance in documentation\n\n## Working Without Arrays\n\nSince POSIX sh lacks arrays, use these patterns:\n\n- **Positional Parameters**: `set -- item1 item2 item3; for arg; do echo \"$arg\"; done`\n- **Delimited Strings**: `items=\"a:b:c\"; IFS=:; set -- $items; IFS=' '`\n- **Newline-Separated**: `items=\"a\\nb\\nc\"; while IFS= read -r item; do echo \"$item\"; done \u003C\u003CEOF`\n- **Counters**: `i=0; while [ $i -lt 10 ]; do i=$((i+1)); done`\n- **Field Splitting**: Use `cut`, `awk`, or parameter expansion for string splitting\n\n## Portable Conditionals\n\nUse `[ ]` test command with POSIX operators:\n\n- **File Tests**: `[ -e file ]` exists, `[ -f file ]` regular file, `[ -d dir ]` directory\n- **String Tests**: `[ -z \"$str\" ]` empty, `[ -n \"$str\" ]` not empty, `[ \"$a\" = \"$b\" ]` equal\n- **Numeric Tests**: `[ \"$a\" -eq \"$b\" ]` equal, `[ \"$a\" -lt \"$b\" ]` less than\n- **Logical**: `[ cond1 ] && [ cond2 ]` AND, `[ cond1 ] || [ cond2 ]` OR\n- **Negation**: `[ ! -f file ]` not a file\n- **Pattern Matching**: Use `case` not `[[ =~ ]]`\n\n## CI\u002FCD Integration\n\n- **Matrix testing**: Test across dash, ash, bash --posix, yash on Linux, macOS, Alpine\n- **Container testing**: Use alpine:latest (ash), debian:stable (dash) for reproducible tests\n- **Pre-commit hooks**: Configure checkbashisms, shellcheck -s sh, shfmt -ln posix\n- **GitHub Actions**: Use shellcheck-problem-matchers with POSIX mode\n- **Cross-platform validation**: Test on Linux, macOS, FreeBSD, NetBSD\n- **BusyBox testing**: Validate on BusyBox environments for embedded systems\n- **Automated releases**: Tag versions and generate portable distribution packages\n- **Coverage tracking**: Ensure test coverage across all POSIX shells\n- Example workflow: `shellcheck -s sh *.sh && shfmt -ln posix -d *.sh && checkbashisms *.sh`\n\n## Embedded Systems & Limited Environments\n\n- **BusyBox compatibility**: Test with BusyBox's limited ash implementation\n- **Alpine Linux**: Default shell is BusyBox ash, not bash\n- **Resource constraints**: Minimize memory usage, avoid spawning excessive processes\n- **Missing utilities**: Provide fallbacks when common tools unavailable (`mktemp`, `seq`)\n- **Read-only filesystems**: Handle scenarios where `\u002Ftmp` may be restricted\n- **No coreutils**: Some environments lack GNU coreutils extensions\n- **Signal handling**: Limited signal support in minimal environments\n- **Startup scripts**: Init scripts must be POSIX for maximum compatibility\n- Example: Check for mktemp: `command -v mktemp >\u002Fdev\u002Fnull 2>&1 || mktemp() { ... }`\n\n## Migration from Bash to POSIX sh\n\n- **Assessment**: Run `checkbashisms` to identify bash-specific constructs\n- **Array elimination**: Convert arrays to delimited strings or positional parameters\n- **Conditional updates**: Replace `[[` with `[` and adjust regex to `case` patterns\n- **Local variables**: Remove `local` keyword, use function prefixes instead\n- **Process substitution**: Replace `\u003C()` with temporary files or pipes\n- **Parameter expansion**: Use `sed`\u002F`awk` for complex string manipulation\n- **Testing strategy**: Incremental conversion with continuous validation\n- **Documentation**: Note any POSIX limitations or workarounds\n- **Gradual migration**: Convert one function at a time, test thoroughly\n- **Fallback support**: Maintain dual implementations during transition if needed\n\n## Quality Checklist\n\n- Scripts pass ShellCheck with `-s sh` flag (POSIX mode)\n- Code is formatted consistently with shfmt using `-ln posix`\n- Test on multiple shells: dash, ash, bash --posix, yash\n- All variable expansions are properly quoted\n- No bash-specific features used (arrays, `[[`, `local`, etc.)\n- Error handling covers all failure modes\n- Temporary resources cleaned up with EXIT trap\n- Scripts provide clear usage information\n- Input validation prevents injection attacks\n- Scripts portable across Unix-like systems (Linux, BSD, Solaris, macOS, Alpine)\n- BusyBox compatibility validated for embedded use cases\n- No GNU-specific extensions or flags used\n\n## Output\n\n- POSIX-compliant shell scripts maximizing portability\n- Test suites using shellspec or bats-core validating across dash, ash, yash\n- CI\u002FCD configurations for multi-shell matrix testing\n- Portable implementations of common patterns with fallbacks\n- Documentation on POSIX limitations and workarounds with examples\n- Migration guides for converting bash scripts to POSIX sh incrementally\n- Cross-platform compatibility matrices (Linux, BSD, macOS, Solaris, Alpine)\n- Performance benchmarks comparing different POSIX shells\n- Fallback implementations for missing utilities (mktemp, seq, timeout)\n- BusyBox-compatible scripts for embedded and container environments\n- Package distributions for various platforms without bash dependency\n\n## Essential Tools\n\n### Static Analysis & Formatting\n- **ShellCheck**: Static analyzer with `-s sh` for POSIX mode validation\n- **shfmt**: Shell formatter with `-ln posix` option for POSIX syntax\n- **checkbashisms**: Detects bash-specific constructs in scripts (from devscripts)\n- **Semgrep**: SAST with POSIX-specific security rules\n- **CodeQL**: Security scanning for shell scripts\n\n### POSIX Shell Implementations for Testing\n- **dash**: Debian Almquist Shell - lightweight, strict POSIX compliance (primary test target)\n- **ash**: Almquist Shell - BusyBox default, embedded systems\n- **yash**: Yet Another Shell - strict POSIX conformance validation\n- **posh**: Policy-compliant Ordinary Shell - Debian policy compliance\n- **osh**: Oil Shell - modern POSIX-compatible shell with better error messages\n- **bash --posix**: GNU Bash in POSIX mode for compatibility testing\n\n### Testing Frameworks\n- **bats-core**: Bash testing framework (works with POSIX sh)\n- **shellspec**: BDD-style testing that supports POSIX sh\n- **shunit2**: xUnit-style framework with POSIX sh support\n- **sharness**: Test framework used by Git (POSIX-compatible)\n\n## Common Pitfalls to Avoid\n\n- Using `[[` instead of `[` (bash-specific)\n- Using arrays (not in POSIX sh)\n- Using `local` keyword (bash\u002Fksh extension)\n- Using `echo` without `printf` (behavior varies across implementations)\n- Using `source` instead of `.` for sourcing scripts\n- Using bash-specific parameter expansion: `${var\u002F\u002Fpattern\u002Freplacement}`\n- Using process substitution `\u003C()` or `>()`\n- Using `function` keyword (ksh\u002Fbash syntax)\n- Using `$RANDOM` variable (not in POSIX)\n- Using `read -a` for arrays (bash-specific)\n- Using `set -o pipefail` (bash-specific)\n- Using `&>` for redirection (use `>file 2>&1`)\n\n## Advanced Techniques\n\n- **Error Trapping**: `trap 'echo \"Error at line $LINENO\" >&2; exit 1' EXIT; trap - EXIT` on success\n- **Safe Temp Files**: `tmpfile=$(mktemp) || exit 1; trap 'rm -f \"$tmpfile\"' EXIT INT TERM`\n- **Simulating Arrays**: `set -- item1 item2 item3; for arg; do process \"$arg\"; done`\n- **Field Parsing**: `IFS=:; while read -r user pass uid gid; do ...; done \u003C \u002Fetc\u002Fpasswd`\n- **String Replacement**: `echo \"$str\" | sed 's\u002Fold\u002Fnew\u002Fg'` or use parameter expansion `${str%suffix}`\n- **Default Values**: `value=${var:-default}` assigns default if var unset or null\n- **Portable Functions**: Avoid `function` keyword, use `func_name() { ... }`\n- **Subshell Isolation**: `(cd dir && cmd)` changes directory without affecting parent\n- **Here-documents**: `cat \u003C\u003C'EOF'` with quotes prevents variable expansion\n- **Command Existence**: `command -v cmd >\u002Fdev\u002Fnull 2>&1 && echo \"found\" || echo \"missing\"`\n\n## POSIX-Specific Best Practices\n\n- Always quote variable expansions: `\"$var\"` not `$var`\n- Use `[ ]` with proper spacing: `[ \"$a\" = \"$b\" ]` not `[\"$a\"=\"$b\"]`\n- Use `=` for string comparison, not `==` (bash extension)\n- Use `.` for sourcing, not `source`\n- Use `printf` for all output, avoid `echo -e` or `echo -n`\n- Use `$(( ))` for arithmetic, not `let` or `declare -i`\n- Use `case` for pattern matching, not `[[ =~ ]]`\n- Test scripts with `sh -n script.sh` to check syntax\n- Use `command -v` not `type` or `which` for portability\n- Explicitly handle all error conditions with `|| exit 1`\n\n## References & Further Reading\n\n### POSIX Standards & Specifications\n- [POSIX Shell Command Language](https:\u002F\u002Fpubs.opengroup.org\u002Fonlinepubs\u002F9699919799\u002Futilities\u002FV3_chap02.html) - Official POSIX.1-2024 specification\n- [POSIX Utilities](https:\u002F\u002Fpubs.opengroup.org\u002Fonlinepubs\u002F9699919799\u002Fidx\u002Futilities.html) - Complete list of POSIX-mandated utilities\n- [Autoconf Portable Shell Programming](https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Fautoconf\u002Fmanual\u002Fautoconf.html#Portable-Shell) - Comprehensive portability guide from GNU\n\n### Portability & Best Practices\n- [Rich's sh (POSIX shell) tricks](http:\u002F\u002Fwww.etalabs.net\u002Fsh_tricks.html) - Advanced POSIX shell techniques\n- [Suckless Shell Style Guide](https:\u002F\u002Fsuckless.org\u002Fcoding_style\u002F) - Minimalist POSIX sh patterns\n- [FreeBSD Porter's Handbook - Shell](https:\u002F\u002Fdocs.freebsd.org\u002Fen\u002Fbooks\u002Fporters-handbook\u002Fmakefiles\u002F#porting-shlibs) - BSD portability considerations\n\n### Tools & Testing\n- [checkbashisms](https:\u002F\u002Fmanpages.debian.org\u002Ftesting\u002Fdevscripts\u002Fcheckbashisms.1.en.html) - Detect bash-specific constructs\n",{},"master","dff58085da947e81e8418c922055644bf0082b1b","other\u002Fposix-shell-pro","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills","https:\u002F\u002Fgithub.com\u002Freikiplanet","https:\u002F\u002Fwww.reiki-planet.com","Reiki Planet Game","2026-03-29 06:02:29",{"source":7,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add reikiplanet\u002Fdaoskills --skill posix-shell-pro",{"tool":40,"command":41},"bunx","bunx skills add reikiplanet\u002Fdaoskills --skill posix-shell-pro",{"tool":43,"command":44},"pnpm","pnpm dlx skills add reikiplanet\u002Fdaoskills --skill posix-shell-pro","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fother\u002Fposix-shell-pro\u002FSKILL.md",true,[],[49,76,88,103,123,146],{"skillNo":50,"name":51,"nameZh":6,"description":52,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":55,"publishedAt":21},"01M6G614JTEQJHPT8AKK3YQ18S","web-games","Web browser game development principles. Framework selection, WebGPU, optimization, PWA.","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fweb-games\u002FSKILL.md",[],[56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75],"games","web games","web","grep","principles","selection","community","framework selection","edit","write","read","pwa","game","web browser","game development","Optimization","framework","browser","development","webgpu",{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":82,"publishedAt":21},"01M6G611H2YGV0GZFP90D38ZMJ","vr-ar","VR\u002FAR development principles. Comfort, interaction, performance requirements.","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fvr-ar\u002FSKILL.md",[],[83,84,74,85,86,62,64,65,66,59,87,60],"ar","vr ar","interaction","requirements","performance",{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":21},"01M6G60XNMHAMV1SV0EJ1CX0AY","templates","Project scaffolding templates for new applications. Use when creating new projects from scratch. Contains 12 templates for various tech stacks.","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Ftemplates\u002FSKILL.md",[],[90,95,96,97,98,99,62,100,66,101,102,59],"project scaffolding","From Scratch","tech","project","scaffolding","use","projects","applications",{"skillNo":104,"name":105,"nameZh":6,"description":106,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":109,"publishedAt":21},"01M6G60T0GATMK3Q5H8GDC1Z8S","wcag-audit-patterns","Conduct WCAG 2.2 accessibility audits with automated testing, manual verification, and remediation guidance. Use when auditing websites for accessibility, fixing WCAG violations, or implementing ac...","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fskills\u002Fsecurity\u002Fwcag-audit-patterns\u002FSKILL.md",[],[110,111,112,113,114,62,115,116,117,118,100,119,120,121,122],"wcag audit patterns","wcag audit","patterns","WCAG","audit","manual","with","automated testing","guidance","remediation","verification","accessibility","testing",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":21},"01M6G60PMCHW1FRZ63F931QK3R","vulnerability-scanner","Advanced vulnerability analysis principles. OWASP 2025, Supply Chain Security, attack surface mapping, risk prioritization.","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fskills\u002Fsecurity\u002Fvulnerability-scanner\u002FSKILL.md",[],[130,131,132,133,134,135,136,137,62,66,59,138,60,139,140,141,142,143,144,145],"scanner","vulnerability scanner","vulnerability","prioritization","2025","mapping","chain","supply chain","Bash","analysis","risk","owasp","supply chain security","security","supply","advanced",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":21},"01M6G60JZBB8DK0W3DSG1WNMZK","threat-modeling-expert","Expert in threat modeling methodologies, security architecture review, and risk assessment. Masters STRIDE, PASTA, attack trees, and security requirement extraction. Use for security architecture r...","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fskills\u002Fsecurity\u002Fthreat-modeling-expert\u002FSKILL.md",[],[153,154,155,156,157,158,159,160,143,100,161,162,163,62,164,165,166,140,167,168],"modeling","threat modeling expert","threat modeling","expert","threat","risk assessment","architecture review","architecture","security architecture review","trees","security architecture","security requirement extraction","assessment","extraction","review","stride"]