¿Hay algún código sh que no sea un código bash sintácticamente válido?

31

¿Hay algún shcódigo que no sea un código bash sintácticamente válido (no irritará la sintaxis)?

Estoy pensando en sobrescribir shcon bashciertos comandos.

Alexander Mills
fuente
1
Supongo que por válido quise decir sintácticamente válido, por lo que no irritará la sintaxis
Alexander Mills
2
¿Diferentes tokenizaciones? Por ejemplo, me ((viene a la mente.
ccorn
1
Para algunas distribuciones /usr/bin/shes solo un enlace simbólico a /usr/bin/bash(estoy usando CentOS 7.3 y lo es). Debes comprobar si shrealmente es bashpara tu distribución.
Centimane
1
Hace unos años, todo mi proyecto se rompió cuando algo se "actualizó" en bash. Tuve que cambiar todas mis líneas shebang de #!/bin/sha #!/bin/bash. Entonces todo volvió a funcionar, así que realmente debes tener cuidado. Puede haber sucedido cuando comenzaron a usar dash en lugar de bash para sh.
Joe
1
@ Joe, eso es lo contrario de lo que está pidiendo el OP: tenía un código bash que estaba mal etiquetado como código sh pero no lo era. El OP pregunta si pueden tener un código sh (real, no mal etiquetado) que se rompa cuando se ejecuta con bash, no si pueden tener un código bash que se rompa cuando se ejecuta con sh (lo cual es obvio, si las extensiones bash no funcionaban) tener algún efecto en las funciones de idioma disponibles, no serían extensiones).
Charles Duffy

Respuestas:

49

Aquí hay un código que hace algo diferente en POSIX sh y Bash:

hello &> world

No sé si eso es "inválido" para usted.

En Bash, redirige tanto la salida estándar como el error estándar desde helloel archivo world. En POSIX sh, se ejecuta helloen segundo plano y luego realiza una redirección vacía world, truncando (es decir, se trata como & >).

Hay muchos otros casos en los que las extensiones Bash harán lo suyo cuando se ejecuten bash, y tendrían diferentes efectos en un POSIX puro sh. Por ejemplo, la expansión de llaves es otra, y también funciona igual en el modo POSIX de Bash y no.


En cuanto a los errores de sintaxis estática, Bash tiene ambas palabras reservadas (como [[ y time) no especificadas por POSIX, de modo que [[ xes un código de shell POSIX válido pero un error de sintaxis de Bash y un historial de varios errores de incompatibilidad de POSIX que pueden dar lugar a errores de sintaxis, como el de esta pregunta :

x=$(cat <<'EOF'
`
EOF
)
bash: line 2: unexpected EOF while looking for matching ``'
bash: line 5: syntax error: unexpected end of file

Syntax-errors-only es una definición bastante peligrosa de "inválido" para cualquier circunstancia donde sea importante, pero ahí está.

Michael Homer
fuente
3
Tenga en cuenta que si bien la expansión de llaves actualmente no cumple con bash (y zsh, pdksh, ksh93), POSIX está trabajando para agregar la provisión en la especificación para permitir la expansión de llaves (y {fd}>fileun problema similar), de modo que bash pueda volver a ser compatible ( expansión de llaves) permanecería sin especificar, pero las secuencias de comandos compatibles tendrían que hacer echo "{a,b}"si quieren {a,b}que se impriman). Vea la discusión que lo inició
Stéphane Chazelas,
2
También relevante para estas preguntas y respuestas: austingroupbugs.net/view.php?id=1191#c3983
Stéphane Chazelas
2
¿Alguien que escriba un script en POSIX sh alguna vez escribiría un comando como este? El OP va de sh a bash, y según tengo entendido, ¿parece que sería más un problema ir en la otra dirección?
Rico
1
@ Rich: Claro. No uso ningún sistema donde /bin/shsea ​​bash, así que si no fuera consciente de este bashismo, escribir una línea de comando podría suceder fácilmente. El espacio en la respuesta hace que parezca poco probable, pero hello&>worldes menos descabellado.
R ..
2
¡En realidad vi un error debido a la &>diferencia el mes pasado!
Gordon Davisson
16

Un breve ejemplo:

time()(:)

time en Bash es una palabra reservada, y se comporta de manera diferente a la time programa. Es muy probable que rompa algunos scripts prácticos que intentan analizar el resultado timeutilizando bash. Pero técnicamente no es un error de sintaxis. Redefinir timecomo una función sería raro, pero causa un error de sintaxis como lo especifica esta pregunta.

Un ejemplo más corto:

a():

Válido dash, pero no compatible con POSIX.

usuario23013
fuente
3
En términos más generales, cualquier palabra que sea una palabra clave no estándar o un comando incorporado en Bash causará el mismo efecto. Además de time, hay cosas por el estilo declare, function, select, y coproc. Aunque algunos de ellos están marcados explícitamente como no especificados en el estándar ( palabras clave y funciones / utilidades incorporadas ), pero no puedo ver, por ejemplo, timeo coprocen la lista. Y el uso --posixno parece ayudar.
ilkkachu