¿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.
bash
shell-script
posix
Alexander Mills
fuente
fuente
((
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.Respuestas:
Aquí hay un código que hace algo diferente en POSIX sh y Bash:
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 archivoworld
. En POSIXsh
, se ejecutahello
en segundo plano y luego realiza una redirección vacíaworld
, 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 purosh
. 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
[[
ytime
) 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 :Syntax-errors-only es una definición bastante peligrosa de "inválido" para cualquier circunstancia donde sea importante, pero ahí está.
fuente
{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 hacerecho "{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, perohello&>world
es menos descabellado.&>
diferencia el mes pasado!Un breve ejemplo:
time
en Bash es una palabra reservada, y se comporta de manera diferente a latime
programa. Es muy probable que rompa algunos scripts prácticos que intentan analizar el resultadotime
utilizando bash. Pero técnicamente no es un error de sintaxis. Redefinirtime
como una función sería raro, pero causa un error de sintaxis como lo especifica esta pregunta.Un ejemplo más corto:
Válido
dash
, pero no compatible con POSIX.fuente
time
, hay cosas por el estilodeclare
,function
,select
, ycoproc
. 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
ocoproc
en la lista. Y el uso--posix
no parece ayudar.