Skip to content

Instantly share code, notes, and snippets.

@sandcastle
Created April 23, 2025 05:31
Show Gist options
  • Select an option

  • Save sandcastle/1e3b103cc70d29fc14c0da08abca88c1 to your computer and use it in GitHub Desktop.

Select an option

Save sandcastle/1e3b103cc70d29fc14c0da08abca88c1 to your computer and use it in GitHub Desktop.

Revisions

  1. sandcastle created this gist Apr 23, 2025.
    83 changes: 83 additions & 0 deletions Results
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,83 @@
    ========== bash ==========

    --- plain mode (bash ) ---
    HAS_PIPEFAIL = 1
    HAS_ARRAY = 1
    HAS_EUO = 1
    HAS_EVAL = 1
    HAS_ASSOC_ARRAY = 1
    HAS_DBLBRACK = 1

    --- interactive mode (bash -i) ---
    HAS_PIPEFAIL = 1
    HAS_ARRAY = 1
    HAS_EUO = 1
    HAS_EVAL = 1
    HAS_ASSOC_ARRAY = 1
    HAS_DBLBRACK = 1

    --- login+interactive mode (bash -il) ---
    Welcome to Cloud Shell! Type "help" to get started.
    To set your Cloud Platform project in this session use `gcloud config set project [PROJECT_ID]`.
    You can view your projects by running `gcloud projects list`.
    HAS_PIPEFAIL = 1
    HAS_ARRAY = 1
    HAS_EUO = 1
    HAS_EVAL = 1
    HAS_ASSOC_ARRAY = 1
    HAS_DBLBRACK = 1

    ========== zsh ==========

    --- plain mode (zsh ) ---
    HAS_PIPEFAIL = 1
    HAS_ARRAY = 0
    HAS_EUO = 1
    HAS_EVAL = 1
    HAS_ASSOC_ARRAY = 1
    HAS_DBLBRACK = 1

    --- interactive mode (zsh -i) ---
    HAS_PIPEFAIL = 1
    HAS_ARRAY = 0
    HAS_EUO = 1
    HAS_EVAL = 1
    HAS_ASSOC_ARRAY = 1
    HAS_DBLBRACK = 1

    --- login+interactive mode (zsh -il) ---
    HAS_PIPEFAIL = 1
    HAS_ARRAY = 0
    HAS_EUO = 1
    HAS_EVAL = 1
    HAS_ASSOC_ARRAY = 1
    HAS_DBLBRACK = 1

    ========== sh ==========

    --- plain mode (sh ) ---
    HAS_PIPEFAIL = 1
    HAS_ARRAY = 1
    HAS_EUO = 1
    HAS_EVAL = 1
    HAS_ASSOC_ARRAY = 1
    HAS_DBLBRACK = 1

    --- interactive mode (sh -i) ---
    HAS_PIPEFAIL = 1
    HAS_ARRAY = 1
    HAS_EUO = 1
    HAS_EVAL = 1
    HAS_ASSOC_ARRAY = 1
    HAS_DBLBRACK = 1

    --- login+interactive mode (sh -il) ---
    Welcome to Cloud Shell! Type "help" to get started.
    To set your Cloud Platform project in this session use `gcloud config set project [PROJECT_ID]`.
    You can view your projects by running `gcloud projects list`.
    HAS_PIPEFAIL = 1
    HAS_ARRAY = 1
    HAS_EUO = 1
    HAS_EVAL = 1
    HAS_ASSOC_ARRAY = 1
    HAS_DBLBRACK = 1
    49 changes: 49 additions & 0 deletions test.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,49 @@
    tee x.sh >/dev/null <<'EOF'
    #!/usr/bin/env sh
    # ── probe six core capabilities (each one-liner is side-effect free) ──
    ( set -o pipefail ) 2>/dev/null && HAS_PIPEFAIL=1 || HAS_PIPEFAIL=0
    ( foo=(); foo[0]=x ) 2>/dev/null && HAS_ARRAY=1 || HAS_ARRAY=0
    ( set -euo pipefail; : ) 2>/dev/null && HAS_EUO=1 || HAS_EUO=0
    ( eval : ) 2>/dev/null && HAS_EVAL=1 || HAS_EVAL=0
    ( typeset -A _A 2>/dev/null ) 2>/dev/null && HAS_ASSOC_ARRAY=1 || HAS_ASSOC_ARRAY=0
    ( [[ 1 -eq 1 ]] ) 2>/dev/null && HAS_DBLBRACK=1 || HAS_DBLBRACK=0
    printf 'HAS_PIPEFAIL = %s\n' "$HAS_PIPEFAIL"
    printf 'HAS_ARRAY = %s\n' "$HAS_ARRAY"
    printf 'HAS_EUO = %s\n' "$HAS_EUO"
    printf 'HAS_EVAL = %s\n' "$HAS_EVAL"
    printf 'HAS_ASSOC_ARRAY = %s\n' "$HAS_ASSOC_ARRAY"
    printf 'HAS_DBLBRACK = %s\n' "$HAS_DBLBRACK"
    EOF
    chmod +x x.sh

    # ─── driver that runs x.sh under bash, zsh, sh in plain/interactive/login ───
    tee run-matrix.sh >/dev/null <<'EOF'
    #!/usr/bin/env bash
    PROBE="./x.sh" # script to test
    shells=(bash zsh sh) # add ksh, dash, etc. if desired
    modes=("" "-i" "-il") # plain, interactive, login+interactive
    mode_names=("plain" "interactive" "login+interactive")
    for shell in "${shells[@]}"; do
    command -v "$shell" >/dev/null 2>&1 || { echo "⏭ $shell not found"; continue; }
    printf '\n========== %s ==========\n' "$shell"
    for idx in "${!modes[@]}"; do
    mode="${modes[$idx]}"
    label="${mode_names[$idx]}"
    printf '\n--- %s mode (%s %s) ---\n' "$label" "$shell" "$mode"
    if [ -z "$mode" ]; then
    "$shell" "$PROBE" # plain script execution
    else
    "$shell" $mode "$PROBE" # -i x.sh or -il x.sh
    fi
    done
    done
    EOF

    chmod +x run-matrix.sh

    . run-matrix.sh