Skip to content

Instantly share code, notes, and snippets.

@sandcastle
Created April 23, 2025 05:31
Show Gist options
  • Save sandcastle/1e3b103cc70d29fc14c0da08abca88c1 to your computer and use it in GitHub Desktop.
Save sandcastle/1e3b103cc70d29fc14c0da08abca88c1 to your computer and use it in GitHub Desktop.
Lets you probe and test for shell capabilites.
========== 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
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment