Antigravity-awesome-skills bash-pro
'Master of defensive Bash scripting for production automation, CI/CD
install
source · Clone the upstream repo
git clone https://github.com/sickn33/antigravity-awesome-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/sickn33/antigravity-awesome-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/antigravity-awesome-skills/skills/bash-pro" ~/.claude/skills/sickn33-antigravity-awesome-skills-bash-pro-347eb3 && rm -rf "$T"
manifest:
plugins/antigravity-awesome-skills/skills/bash-pro/SKILL.mdsafety · automated scan (low risk)
This is a pattern-based risk scan, not a security review. Our crawler flagged:
- uses sudo
Always read a skill's source content before installing. Patterns alone don't mean the skill is malicious — but they warrant attention.
source content
Use this skill when
- Writing or reviewing Bash scripts for automation, CI/CD, or ops
- Hardening shell scripts for safety and portability
Do not use this skill when
- You need POSIX-only shell without Bash features
- The task requires a higher-level language for complex logic
- You need Windows-native scripting (PowerShell)
Instructions
- Define script inputs, outputs, and failure modes.
- Apply strict mode and safe argument parsing.
- Implement core logic with defensive patterns.
- Add tests and linting with Bats and ShellCheck.
Safety
- Treat input as untrusted; avoid eval and unsafe globbing.
- Prefer dry-run modes before destructive actions.
Focus Areas
- Defensive programming with strict error handling
- POSIX compliance and cross-platform portability
- Safe argument parsing and input validation
- Robust file operations and temporary resource management
- Process orchestration and pipeline safety
- Production-grade logging and error reporting
- Comprehensive testing with Bats framework
- Static analysis with ShellCheck and formatting with shfmt
- Modern Bash 5.x features and best practices
- CI/CD integration and automation workflows
Approach
- Always use strict mode with
and proper error trappingset -Eeuo pipefail - Quote all variable expansions to prevent word splitting and globbing issues
- Prefer arrays and proper iteration over unsafe patterns like
for f in $(ls) - Use
for Bash conditionals, fall back to[[ ]]
for POSIX compliance[ ] - Implement comprehensive argument parsing with
and usage functionsgetopts - Create temporary files and directories safely with
and cleanup trapsmktemp - Prefer
overprintf
for predictable output formattingecho - Use command substitution
instead of backticks for readability$() - Implement structured logging with timestamps and configurable verbosity
- Design scripts to be idempotent and support dry-run modes
- Use
for better error propagation in Bash 4.4+shopt -s inherit_errexit - Employ
to prevent unwanted word splitting on spacesIFS=$'\n\t' - Validate inputs with
for required environment variables: "${VAR:?message}" - End option parsing with
and use--
for safe operationsrm -rf -- "$dir" - Support
mode with--trace
opt-in for detailed debuggingset -x - Use
with NUL boundaries for safe subprocess orchestrationxargs -0 - Employ
/readarray
for safe array population from command outputmapfile - Implement robust script directory detection:
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" - Use NUL-safe patterns:
find -print0 | while IFS= read -r -d '' file; do ...; done
Compatibility & Portability
- Use
shebang for portability across systems#!/usr/bin/env bash - Check Bash version at script start:
for Bash 4.4+ features(( BASH_VERSINFO[0] >= 4 && BASH_VERSINFO[1] >= 4 )) - Validate required external commands exist:
command -v jq &>/dev/null || exit 1 - Detect platform differences:
case "$(uname -s)" in Linux*) ... ;; Darwin*) ... ;; esac - Handle GNU vs BSD tool differences (e.g.,
vssed -i
)sed -i '' - Test scripts on all target platforms (Linux, macOS, BSD variants)
- Document minimum version requirements in script header comments
- Provide fallback implementations for platform-specific features
- Use built-in Bash features over external commands when possible for portability
- Avoid bashisms when POSIX compliance is required, document when using Bash-specific features
Readability & Maintainability
- Use long-form options in scripts for clarity:
instead of--verbose-v - Employ consistent naming: snake_case for functions/variables, UPPER_CASE for constants
- Add section headers with comment blocks to organize related functions
- Keep functions under 50 lines; refactor larger functions into smaller components
- Group related functions together with descriptive section headers
- Use descriptive function names that explain purpose:
notvalidate_input_filecheck_file - Add inline comments for non-obvious logic, avoid stating the obvious
- Maintain consistent indentation (2 or 4 spaces, never tabs mixed with spaces)
- Place opening braces on same line for consistency:
function_name() { - Use blank lines to separate logical blocks within functions
- Document function parameters and return values in header comments
- Extract magic numbers and strings to named constants at top of script
Safety & Security Patterns
- Declare constants with
to prevent accidental modificationreadonly - Use
keyword for all function variables to avoid polluting global scopelocal - Implement
for external commands:timeout
prevents hangstimeout 30s curl ... - Validate file permissions before operations:
[[ -r "$file" ]] || exit 1 - Use process substitution
instead of temporary files when possible<(command) - Sanitize user input before using in commands or file operations
- Validate numeric input with pattern matching:
[[ $num =~ ^[0-9]+$ ]] - Never use
on user input; use arrays for dynamic command constructioneval - Set restrictive umask for sensitive operations:
(umask 077; touch "$secure_file") - Log security-relevant operations (authentication, privilege changes, file access)
- Use
to separate options from arguments:--rm -rf -- "$user_input" - Validate environment variables before using:
: "${REQUIRED_VAR:?not set}" - Check exit codes of all security-critical operations explicitly
- Use
to ensure cleanup happens even on abnormal exittrap
Performance Optimization
- Avoid subshells in loops; use
instead ofwhile readfor i in $(cat file) - Use Bash built-ins over external commands:
instead of[[ ]]
,test
instead of${var//pattern/replacement}sed - Batch operations instead of repeated single operations (e.g., one
with multiple expressions)sed - Use
/mapfile
for efficient array population from command outputreadarray - Avoid repeated command substitutions; store result in variable once
- Use arithmetic expansion
instead of$(( ))
for calculationsexpr - Prefer
overprintf
for formatted output (faster and more reliable)echo - Use associative arrays for lookups instead of repeated grepping
- Process files line-by-line for large files instead of loading entire file into memory
- Use
for parallel processing when operations are independentxargs -P
Documentation Standards
- Implement
and--help
flags showing usage, options, and examples-h - Provide
flag displaying script version and copyright information--version - Include usage examples in help output for common use cases
- Document all command-line options with descriptions of their purpose
- List required vs optional arguments clearly in usage message
- Document exit codes: 0 for success, 1 for general errors, specific codes for specific failures
- Include prerequisites section listing required commands and versions
- Add header comment block with script purpose, author, and modification date
- Document environment variables the script uses or requires
- Provide troubleshooting section in help for common issues
- Generate documentation with
from special comment formatsshdoc - Create man pages using
for system integrationshellman - Include architecture diagrams using Mermaid or GraphViz for complex scripts
Modern Bash Features (5.x)
- Bash 5.0: Associative array improvements,
uppercase conversion,${var@U}
lowercase${var@L} - Bash 5.1: Enhanced
transformations,${parameter@operator}
shopt options for compatibilitycompat - Bash 5.2:
option, improvedvarredir_close
error handling,exec
microsecond precisionEPOCHREALTIME - Check version before using modern features:
[[ ${BASH_VERSINFO[0]} -ge 5 && ${BASH_VERSINFO[1]} -ge 2 ]] - Use
for shell-quoted output (Bash 4.4+)${parameter@Q} - Use
for escape sequence expansion (Bash 4.4+)${parameter@E} - Use
for prompt expansion (Bash 4.4+)${parameter@P} - Use
for assignment format (Bash 4.4+)${parameter@A} - Employ
to wait for any background job (Bash 4.3+)wait -n - Use
for custom delimiters (Bash 4.4+)mapfile -d delim
CI/CD Integration
- GitHub Actions: Use
for inline annotationsshellcheck-problem-matchers - Pre-commit hooks: Configure
with.pre-commit-config.yaml
,shellcheck
,shfmtcheckbashisms - Matrix testing: Test across Bash 4.4, 5.0, 5.1, 5.2 on Linux and macOS
- Container testing: Use official bash:5.2 Docker images for reproducible tests
- CodeQL: Enable shell script scanning for security vulnerabilities
- Actionlint: Validate GitHub Actions workflow files that use shell scripts
- Automated releases: Tag versions and generate changelogs automatically
- Coverage reporting: Track test coverage and fail on regressions
- Example workflow:
shellcheck *.sh && shfmt -d *.sh && bats test/
Security Scanning & Hardening
- SAST: Integrate Semgrep with custom rules for shell-specific vulnerabilities
- Secrets detection: Use
orgitleaks
to prevent credential leakstrufflehog - Supply chain: Verify checksums of sourced external scripts
- Sandboxing: Run untrusted scripts in containers with restricted privileges
- SBOM: Document dependencies and external tools for compliance
- Security linting: Use ShellCheck with security-focused rules enabled
- Privilege analysis: Audit scripts for unnecessary root/sudo requirements
- Input sanitization: Validate all external inputs against allowlists
- Audit logging: Log all security-relevant operations to syslog
- Container security: Scan script execution environments for vulnerabilities
Observability & Logging
- Structured logging: Output JSON for log aggregation systems
- Log levels: Implement DEBUG, INFO, WARN, ERROR with configurable verbosity
- Syslog integration: Use
command for system log integrationlogger - Distributed tracing: Add trace IDs for multi-script workflow correlation
- Metrics export: Output Prometheus-format metrics for monitoring
- Error context: Include stack traces, environment info in error logs
- Log rotation: Configure log file rotation for long-running scripts
- Performance metrics: Track execution time, resource usage, external call latency
- Example:
log_info() { logger -t "$SCRIPT_NAME" -p user.info "$*"; echo "[INFO] $*" >&2; }
Quality Checklist
- Scripts pass ShellCheck static analysis with minimal suppressions
- Code is formatted consistently with shfmt using standard options
- Comprehensive test coverage with Bats including edge cases
- All variable expansions are properly quoted
- Error handling covers all failure modes with meaningful messages
- Temporary resources are cleaned up properly with EXIT traps
- Scripts support
and provide clear usage information--help - Input validation prevents injection attacks and handles edge cases
- Scripts are portable across target platforms (Linux, macOS)
- Performance is adequate for expected workloads and data sizes
Output
- Production-ready Bash scripts with defensive programming practices
- Comprehensive test suites using bats-core or shellspec with TAP output
- CI/CD pipeline configurations (GitHub Actions, GitLab CI) for automated testing
- Documentation generated with shdoc and man pages with shellman
- Structured project layout with reusable library functions and dependency management
- Static analysis configuration files (.shellcheckrc, .shfmt.toml, .editorconfig)
- Performance benchmarks and profiling reports for critical workflows
- Security review with SAST, secrets scanning, and vulnerability reports
- Debugging utilities with trace modes, structured logging, and observability
- Migration guides for Bash 3→5 upgrades and legacy modernization
- Package distribution configurations (Homebrew formulas, deb/rpm specs)
- Container images for reproducible execution environments
Essential Tools
Static Analysis & Formatting
- ShellCheck: Static analyzer with
andenable=all
configurationexternal-sources=true - shfmt: Shell script formatter with standard config (
)-i 2 -ci -bn -sr -kp - checkbashisms: Detect bash-specific constructs for portability analysis
- Semgrep: SAST with custom rules for shell-specific security issues
- CodeQL: GitHub's security scanning for shell scripts
Testing Frameworks
- bats-core: Maintained fork of Bats with modern features and active development
- shellspec: BDD-style testing framework with rich assertions and mocking
- shunit2: xUnit-style testing framework for shell scripts
- bashing: Testing framework with mocking support and test isolation
Modern Development Tools
- bashly: CLI framework generator for building command-line applications
- basher: Bash package manager for dependency management
- bpkg: Alternative bash package manager with npm-like interface
- shdoc: Generate markdown documentation from shell script comments
- shellman: Generate man pages from shell scripts
CI/CD & Automation
- pre-commit: Multi-language pre-commit hook framework
- actionlint: GitHub Actions workflow linter
- gitleaks: Secrets scanning to prevent credential leaks
- Makefile: Automation for lint, format, test, and release workflows
Common Pitfalls to Avoid
causing word splitting/globbing bugs (usefor f in $(ls ...)
)find -print0 | while IFS= read -r -d '' f; do ...; done- Unquoted variable expansions leading to unexpected behavior
- Relying on
without proper error trapping in complex flowsset -e - Using
for data output (preferecho
for reliability)printf - Missing cleanup traps for temporary files and directories
- Unsafe array population (use
/readarray
instead of command substitution)mapfile - Ignoring binary-safe file handling (always consider NUL separators for filenames)
Dependency Management
- Package managers: Use
orbasher
for installing shell script dependenciesbpkg - Vendoring: Copy dependencies into project for reproducible builds
- Lock files: Document exact versions of dependencies used
- Checksum verification: Verify integrity of sourced external scripts
- Version pinning: Lock dependencies to specific versions to prevent breaking changes
- Dependency isolation: Use separate directories for different dependency sets
- Update automation: Automate dependency updates with Dependabot or Renovate
- Security scanning: Scan dependencies for known vulnerabilities
- Example:
orbasher install username/repo@versionbpkg install username/repo -g
Advanced Techniques
- Error Context: Use
for debuggingtrap 'echo "Error at line $LINENO: exit $?" >&2' ERR - Safe Temp Handling:
trap 'rm -rf "$tmpdir"' EXIT; tmpdir=$(mktemp -d) - Version Checking:
before using modern features(( BASH_VERSINFO[0] >= 5 )) - Binary-Safe Arrays:
readarray -d '' files < <(find . -print0) - Function Returns: Use
for returning complex data from functionsdeclare -g result - Associative Arrays:
for complex data structuresdeclare -A config=([host]="localhost" [port]="8080") - Parameter Expansion:
remove extension,${filename%.sh}
basename,${path##*/}
replace all${text//old/new} - Signal Handling:
for graceful shutdowntrap cleanup_function SIGHUP SIGINT SIGTERM - Command Grouping:
share redirection,{ cmd1; cmd2; } > output.log
use subshell for isolation( cd dir && cmd ) - Co-processes:
for bidirectional pipescoproc proc { cmd; }; echo "data" >&"${proc[1]}"; read -u "${proc[0]}" result - Here-documents:
withcat <<-'EOF'
strips leading tabs, quotes prevent expansion- - Process Management:
to wait for background job,wait $pid
list background PIDsjobs -p - Conditional Execution:
run cmd2 only if cmd1 succeeds,cmd1 && cmd2
run cmd2 if cmd1 failscmd1 || cmd2 - Brace Expansion:
creates multiple files efficientlytouch file{1..10}.txt - Nameref Variables:
creates reference to another variable (Bash 4.3+)declare -n ref=varname - Improved Error Trapping:
for comprehensive error handlingset -Eeuo pipefail; shopt -s inherit_errexit - Parallel Execution:
for parallel processing with CPU core countxargs -P $(nproc) -n 1 command - Structured Output:
for JSON generationjq -n --arg key "$value" '{key: $key}' - Performance Profiling: Use
for detailed resource usage ortime -v
for custom timingTIMEFORMAT
References & Further Reading
Style Guides & Best Practices
- Google Shell Style Guide - Comprehensive style guide covering quoting, arrays, and when to use shell
- Bash Pitfalls - Catalog of common Bash mistakes and how to avoid them
- Bash Hackers Wiki - Comprehensive Bash documentation and advanced techniques
- Defensive BASH Programming - Modern defensive programming patterns
Tools & Frameworks
- ShellCheck - Static analysis tool and extensive wiki documentation
- shfmt - Shell script formatter with detailed flag documentation
- bats-core - Maintained Bash testing framework
- shellspec - BDD-style testing framework for shell scripts
- bashly - Modern Bash CLI framework generator
- shdoc - Documentation generator for shell scripts
Security & Advanced Topics
- Bash Security Best Practices - Security-focused shell script patterns
- Awesome Bash - Curated list of Bash resources and tools
- Pure Bash Bible - Collection of pure bash alternatives to external commands
Limitations
- Use this skill only when the task clearly matches the scope described above.
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.