¿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.
bash
shell-script
posix
Alexander Mills
fuente
fuente

((viene a la mente./usr/bin/shes solo un enlace simbólico a/usr/bin/bash(estoy usando CentOS 7.3 y lo es). Debes comprobar sishrealmente esbashpara tu distribución.#!/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.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
helloel archivoworld. En POSIXsh, se ejecutahelloen 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[[ 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 :Syntax-errors-only es una definición bastante peligrosa de "inválido" para cualquier circunstancia donde sea importante, pero ahí está.
fuente
{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 hacerecho "{a,b}"si quieren{a,b}que se impriman). Vea la discusión que lo inició/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, perohello&>worldes menos descabellado.&>diferencia el mes pasado!Un breve ejemplo:
timeen Bash es una palabra reservada, y se comporta de manera diferente a latimeprograma. Es muy probable que rompa algunos scripts prácticos que intentan analizar el resultadotimeutilizando bash. Pero técnicamente no es un error de sintaxis. Redefinirtimecomo 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,timeocoprocen la lista. Y el uso--posixno parece ayudar.