Created
April 23, 2025 05:31
-
-
Save sandcastle/1e3b103cc70d29fc14c0da08abca88c1 to your computer and use it in GitHub Desktop.
Lets you probe and test for shell capabilites.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
========== 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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