¿Hay algún sh
código que no sea un código bash sintácticamente válido (no irritará la sintaxis)?
Estoy pensando en sobrescribir sh
con bash
ciertos comandos.
fuente
¿Hay algún sh
código que no sea un código bash sintácticamente válido (no irritará la sintaxis)?
Estoy pensando en sobrescribir sh
con bash
ciertos comandos.
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 hello
el archivo world
. En POSIX sh
, se ejecuta hello
en 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 [[ x
es 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á.
{fd}>file
un 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ó
/bin/sh
sea 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&>world
es menos descabellado.
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 time
utilizando bash. Pero técnicamente no es un error de sintaxis. Redefinir time
como 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.
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, time
o coproc
en la lista. Y el uso --posix
no parece ayudar.
((
viene a la mente./usr/bin/sh
es solo un enlace simbólico a/usr/bin/bash
(estoy usando CentOS 7.3 y lo es). Debes comprobar sish
realmente esbash
para tu distribución.#!/bin/sh
a#!/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.