Watch at EaseHistorias. Respuestas. Perspectiva.

Technology · GUÍA PRÁCTICA

¿Shell dice “bad substitution”? Pruebe el intérprete y la familia sintáctica antes de reescribir

Fije el launcher real, el parser y su versión, clasifique la expansión, elija Bash o sh portátil y repita la ruta original.

Ilustración técnica original: asigna ejecución directa, intérprete explícito, source y wrapper al parser real.
Ilustración técnica original: el shebang selecciona intérprete solo en la ruta directa. Watch at Ease

“Bad substitution” no demuestra que la expresión sea incorrecta. Una expansión Bash válida falla si la analiza sh, dash, un Bash antiguo, el shell que hace source o un wrapper; ${command ...} mal formado falla incluso en Bash.

Conserve comando y stderr, demuestre ruta e intérprete efectivo, clasifique el token según el contrato, cambie una rama y repita el mismo launcher con una entrada fija.

1. Fije la ruta y el primer error

Registre comando, wrapper/scheduler, cwd, nombres de entorno, path, primer stderr y estado; distinga direct, bash, sh, source y pipe.

No empiece cambiando /bin/sh, quitando el shebang o reemplazando todo: borraría la prueba de selección del parser.

2. Pruebe intérprete y nivel de funciones

Capture procesos padre/hijo, shell del wrapper y versión; $SHELL no prueba el parser actual.

El shebang funciona al ejecutar directamente un script executable; source, sh -c, CI y cron obedecen al caller.

3. Clasifique la expresión

Separe parameter expansion portátil de replacement, substring, case y arrays de Bash; verifique el operador exacto en el manual.

${ls ...} confunde parameter expansion con command substitution. Use $(...) y no eval.

4. Elija un contrato explícito

Si requiere Bash, configure wrappers y scheduler para el Bash previsto y compruebe versión cuando sea necesaria.

Si requiere POSIX sh, sustituya sintaxis Bash-only por una forma respaldada por la norma; no mezcle contratos.

5. Verifique con el launcher original

Pruebe un fixture fijo con dash -n, bash -n, Bash de producción y el wrapper real; registre path, versión, estado, stdout y stderr.

Acepte solo cuando la ruta original produzca la salida esperada; si direct/source difieren, declare contratos separados.

Ilustración técnica original: separa expansión portátil, extensiones Bash, command substitution y verificación.
Ilustración técnica original: clasifique el token, elija contrato y repita el launcher original. Watch at Ease