CommunityRédaction et éditiongithub.com

Bash Portabilité (Jamie-BitFlight/bash-portability)

Cette compétence doit être utilisée lorsque l'utilisateur pose des questions sur la compatibilité POSIX, les scripts shell portables, la compatibilité entre shells, les bashismes, le choix du shebang, ou mentionne l'écriture de scripts fonctionnant sur différents shells (bash, sh, dash, zsh) ou systèmes.

Qu'est-ce que bash-portability) ?

Cette compétence fournit un guide complet pour écrire des scripts shell portables, compatibles POSIX, et savoir quand tirer parti des fonctionnalités spécifiques à Bash. Elle couvre le choix du shebang (`#!/usr/bin/env bash`, `#!/bin/sh`, `#!/bin/bash`), une matrice détaillée des fonctionnalités POSIX vs Bash (tableaux, `[[ ]]`, `(( ))`, `local`, conversions de casse, etc.), et des motifs POSIX fiables pour les conditionnelles, la conversion de casse, les opérations sur les sous-chaînes, la lecture de fichiers et la substitution de commandes. La compétence inclut aussi des sections sur les fonctionnalités Bash avancées qui améliorent la qualité du code (tableaux, expansions de paramètres, here strings, substitution de processus), des méthodes pour détecter le type de shell, et un guide de décision pour choisir entre POSIX et Bash. Elle liste les pièges de portabilité courants (echo vs printf, affectation de variables, export avec affectation) et fournit des alternatives portables. Cette compétence est utile pour tout développeur écrivant des scripts shell destinés à fonctionner sur plusieurs systèmes (conteneurs, systèmes embarqués, distributions Linux variées) ou souhaitant adopter des pratiques d'écriture robustes et maintenables.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Jamie-BitFlight/claude_skills/tree/main/plugins/bash-development/skills/bash-portability

Installed? Explore more Rédaction et édition skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Portabilité Bash

Guide pour écrire des scripts portables compatibles POSIX et comprendre quand tirer parti des fonctionnalités spécifiques à Bash.

Choix du Shebang

Utiliser #!/usr/bin/env bash pour les scripts Bash

#!/usr/bin/env bash

Pourquoi : Recherche bash dans le PATH, fonctionne sur les systèmes où bash peut se trouver dans différents emplacements.

Utiliser #!/bin/sh pour les scripts POSIX

#!/bin/sh

Pourquoi : Portabilité maximale lorsque les fonctionnalités bash ne sont pas nécessaires. Sur de nombreux systèmes, /bin/sh est dash ou un autre shell POSIX.

Chemin direct lorsque requis

#!/bin/bash

À utiliser uniquement lorsque : Les exigences système garantissent l'emplacement de bash, ou la politique de sécurité impose des chemins absolus.

Matrice des fonctionnalités POSIX vs Bash

FonctionnalitéPOSIXBashRecommandation
[[ ]]NonOuiUtiliser [ ] pour POSIX
(( ))NonOuiUtiliser [ ] avec -eq etc.
TableauxNonOuiUtiliser paramètres positionnels ou fichiers
localPartielOuiGénéralement sûr
${var,,}Non4+Utiliser tr pour POSIX
<<<NonOuiUtiliser echo
=~ regexNonOuiUtiliser grep ou expr
sourceNonOuiUtiliser la commande . (point)
function f()NonOuiUtiliser f() uniquement
$'...'NonOuiUtiliser printf
{1..10}NonOuiUtiliser seq ou une boucle while

Motifs compatibles POSIX

Conditionnelles

# POSIX - utiliser [ ] avec des guillemets appropriés
if [ -f "$file" ]; then
    echo "Le fichier existe"
fi

# Comparaison de chaînes
if [ "$var" = "value" ]; then
    echo "Correspondance"
fi

# Comparaison numérique
if [ "$num" -gt 10 ]; then
    echo "Plus grand"
fi

# Conditions composées
if [ -f "$file" ] && [ -r "$file" ]; then
    echo "Fichier lisible"
fi

Conversion de casse (POSIX)

# Minuscules
lower=$(echo "$string" | tr '[:upper:]' '[:lower:]')

# Majuscules
upper=$(echo "$string" | tr '[:lower:]' '[:upper:]')

Opérations sur les sous-chaînes (POSIX)

# Obtenir une sous-chaîne - utiliser expr ou cut
substr=$(expr "$string" : '.\(.\)')  # caractères 4-8
substr=$(echo "$string" | cut -c4-8)

# Longueur de chaîne
length=$(expr length "$string")
length=${#string}  # Ceci est en fait POSIX

Lecture de fichiers (POSIX)

# Ligne par ligne
while IFS= read -r line; do
    echo "$line"
done < "$file"

# Lire tout le fichier (sans cat)
content=$(cat "$file")  # cat est POSIX

Substitution de commandes

# Syntaxe moderne (préférée même en POSIX)
result=$(command)

# Syntaxe héritée (à éviter)
result=`command`

# Imbriqué (pourquoi la moderne est meilleure)
result=$(echo $(date))      # Clair
result=`echo \`date\``      # Cauchemar d'échappement

Fonctionnalités Bash intéressantes à utiliser

Lorsque la portabilité n'est pas requise, ces fonctionnalités bash améliorent la qualité du code :

Test étendu [[ ]]

# Correspondance de motifs
[[ "$file" == *.txt ]]

# Correspondance d'expressions régulières
[[ "$input" =~ ^[0-9]+$ ]]

# Pas de souci de découpage de mots
[[ -f $file ]]  # Guillemets facultatifs (mais toujours recommandés)

# Opérateurs logiques à l'intérieur
[[ -f "$file" && -r "$file" ]]

Tableaux

# Tableaux indicés
declare -a files=()
files+=("one.txt")
files+=("two.txt")
for f in "${files[@]}"; do
    process "$f"
done

# Tableaux associatifs (Bash 4+)
declare -A config
config[host]="localhost"
config[port]="8080"

Expansion de paramètres

# Valeur par défaut
"${var:-default}"

# Conversion de casse (Bash 4+)
"${var,,}"  # minuscules
"${var^^}"  # majuscules

# Sous-chaîne
"${var:0:10}"  # 10 premiers caractères
"${var: -5}"   # 5 derniers caractères

# Recherche/remplacement
"${var//old/new}"

Here Strings

# Bash
read -r var <<< "chaîne d'entrée"

# Équivalent POSIX
var=$(echo "chaîne d'entrée")

Substitution de processus

# Bash - comparer deux sorties de commandes
diff <(sort fichier1) <(sort fichier2)

# Équivalent POSIX (avec fichiers temporaires)
sort fichier1 > /tmp/trie1
sort fichier2 > /tmp/trie2
diff /tmp/trie1 /tmp/trie2

Détection du type de shell

# Vérifier si on tourne dans bash
if [ -n "${BASH_VERSION:-}" ]; then
    echo "Tourne dans Bash"
fi

# Vérifier la version de bash pour les fonctionnalités
if [ "${BASH_VERSINFO[0]:-0}" -ge 4 ]; then
    echo "Bash 4+ disponible"
fi

# Détection générique de shell
case "${SHELL##*/}" in
    bash) echo "bash" ;;
    zsh)  echo "zsh" ;;
    *)    echo "autre" ;;
esac

Fonctions utilitaires portables

Exemples de code

Guide de décision pour la portabilité

Utiliser POSIX lorsque :

  • Le script tourne sur des systèmes minimalistes (conteneurs, embarqué)
  • La cible inclut dash, ash ou busybox sh
  • Une compatibilité maximale est requise
  • Le script fait partie de l'initialisation du système

Utiliser Bash lorsque :

  • Les systèmes cibles ont garanti la présence de bash
  • Besoin de tableaux, tableaux associatifs ou regex
  • Manipulation complexe de chaînes requise
  • La clarté du code est significativement améliorée
  • Des fonctionnalités interactives sont nécessaires

Pièges de portabilité courants

echo vs printf

# Problématique - comportement variable
echo -n "pas de nouvelle ligne"
echo -e "avec\tdes tabulations"

# Portable
printf '%s' "pas de nouvelle ligne"
printf 'avec\tdes tabulations\n'

Affectation de variable

# Fonctionne partout
var="value"

# Peut échouer sur certains shells
var = "value"  # Les espaces autour de = sont incorrects

Export avec affectation

# POSIX - commandes séparées
var="value"
export var

# Bash/modern - combiné (fonctionne presque partout)
export var="value"

Opérations de type tableau sans tableaux

# Utiliser les paramètres positionnels
set -- "item1" "item2" "item3"
for item in "$@"; do
    echo "$item"
done

# Ou découpage basé sur IFS
items="item1:item2:item3"
IFS=':' read -r item1 item2 item3 <<EOF
$items
EOF

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

Jamie-BitFlight/agentskill-kaizen-meta-docs

Agentskill kaizen plugin documentation index. Load when needing to read about cross-platform notes, improvement plans, or DuckDB integration.

Jamie-BitFlight/bash-51-features

Bash 5.1 release features and improvements with practical examples. Use when working with Bash 5.1 features, epoch time variables, redirection enhancements, or when user asks about Bash 5.1 changes, new features, or version-specific capabilities.

Jamie-BitFlight/bash-52-features

Bash 5.2 release features and improvements with practical examples. Use when working with Bash 5.2 features, variable handling enhancements, readline improvements, or when user asks about Bash 5.2 changes, new features, or version-specific capabilities.

Jamie-BitFlight/bash-53-features

Bash 5.3 release features and improvements with practical examples. Use when working with Bash 5.3 features, new command substitution, GLOBSORT, loadable builtins, or when user asks about Bash 5.3 changes, new features, or version-specific capabilities.

Jamie-BitFlight/bash-development

This skill should be used when the user asks to "write a bash script", "create a shell script", "implement bash function", "parse arguments in bash", "handle errors in bash", or mentions bash development, shell scripting, script templates, or modern bash patterns.

Jamie-BitFlight/bash-lint

This skill should be used when the user asks to "lint bash script", "run shellcheck", "format shell script", "use shfmt", "fix shellcheck errors", or mentions shell script linting, formatting, code quality, or pre-commit hooks for bash.

Jamie-BitFlight/bash-logging

This skill should be used when the user asks to "add logging to bash script", "colorize output", "implement log levels", "CI/CD sections", "terminal colors in bash", or mentions logging functions, emoji output, collapsible CI sections, or shlocksmith.

Jamie-BitFlight/bash-testing

This skill should be used when the user asks to "test bash script", "write shell tests", "use shunit2", "use shellspec", "create test suite for bash", or mentions unit testing, test frameworks, mocking, or test-driven development for shell scripts.

Jamie-BitFlight/brainstorming-skill

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or when users request help with ideation, marketing, and strategic planning. Explores user intent, requirements, and design before implementation using research-validated prompt patterns.

Jamie-BitFlight/clang-format

Configure clang-format code formatting. Use when: user mentions clang-format or .clang-format, analyzing code style/patterns, creating/modifying formatting config, troubleshooting formatting, brace styles/indentation/spacing/alignment/pointer alignment, or codifying conventions.

Jamie-BitFlight/commitlint

When setting up commit message validation for a project. When project has commitlint.config.js or .commitlintrc files. When configuring CI/CD to enforce commit format. When extracting commit rules for LLM prompt generation. When debugging commit message rejection errors.

Jamie-BitFlight/conventional-commits

When writing a git commit message. When task completes and changes need committing. When project uses semantic-release, commitizen, git-cliff. When choosing between feat/fix/chore/docs types. When indicating breaking changes. When generating changelogs from commit history.

Jamie-BitFlight/dasel-reference

Use when querying, modifying, or converting JSON, YAML, TOML, XML, CSV, HCL, or INI with dasel v3. Complete reference for selectors, functions, conditionals, variables, spread operator, type casting, and format-specific patterns.

Jamie-BitFlight/data-exploration

Use when exploring unknown structured data files with dasel v3 — discover schema, list keys, find nested values, sample arrays, identify data types across JSON, YAML, TOML, XML, CSV, HCL, INI formats

Jamie-BitFlight/data-transformation

Use when modifying, converting, or transforming structured data with dasel v3 — in-place mutations, format conversion, batch operations, array manipulation, object construction, and merge patterns across JSON, YAML, TOML, XML, CSV, HCL, INI

Jamie-BitFlight/delegate

Decompose substantive work into phases, dispatch each phase to a sub-agent, and adjudicate what comes back. Use whenever a request asks for implementation, investigation, a fix, a review, or any change to files — including small ones — and whenever you are about to read source or run a diagnostic yourself instead of handing it off. Also use when a report from a sub-agent needs judging, when a phase needs re-dispatching, or when a user names one instance of a pattern. Does not apply when your own prompt begins "Your ROLE_TYPE is sub-agent." — then follow references/sub-agent-contract.md instead.

Jamie-BitFlight/enterprise-hibernate-hbm

Dasel v3 query patterns for Hibernate .hbm.xml mapping files — entity-table binding, Java property-to-column extraction, one-to-many set/list/bag relationship tracing, many-to-one foreign key discovery, batch scanning across 60+ HBM files. Use when querying Hibernate ORM class mappings, extracting schema metadata from Java persistence layer, or auditing entity-column relationships in enterprise legacy codebases.

Jamie-BitFlight/enterprise-installanywhere

Dasel v3 query patterns for InstallAnywhere .iap_xml installer definitions — use when querying action sequences, discovering variables, resolving platform conditions, navigating panels, or comparing installer variants. Files are 2.5+ MB, 65,000+ lines — too large for context reads, requires structural dasel queries.

Jamie-BitFlight/enterprise-maven-pom

Dasel v3 selector patterns for Maven POM XML files — use when querying dependency versions, filtering by groupId or scope, extracting module hierarchy from parent POMs, or detecting version conflicts across enterprise multi-module Java projects. Load this skill when working with pom.xml files using dasel.

Jamie-BitFlight/enterprise-spring-xml

Dasel v3 selectors for Spring bean factory XML — use when querying any Spring ApplicationContext XML for bean discovery, dependency wiring, JMS destination mapping, property injection extraction, or cross-bean reference tracing. Load this skill before writing dasel selectors against Spring bean XML files (applicationContext.xml, *_beans.xml, spring-*.xml).

Skills associés