Hay aproximadamente cuatro niveles de portabilidad para los scripts de shell (en lo que respecta a la línea shebang):
Más portátil: use un #!/bin/sh
shebang y use solo la sintaxis de shell básica especificada en el estándar POSIX . Esto debería funcionar en casi cualquier sistema POSIX / unix / linux. (Bueno, excepto Solaris 10 y versiones anteriores que tenían el shell Bourne heredado real, anterior a POSIX, por lo que no es compatible /bin/sh
).
La segunda más portátil: use una #!/bin/bash
(o #!/usr/bin/env bash
) línea shebang y manténgase en las funciones de bash v3. Esto funcionará en cualquier sistema que tenga bash (en la ubicación esperada).
Tercero más portátil: use una #!/bin/bash
(o #!/usr/bin/env bash
) línea shebang y use las funciones de bash v4. Esto fallará en cualquier sistema que tenga bash v3 (por ejemplo, macOS, que tiene que usarlo por razones de licencia).
Menos portátil: use un #!/bin/sh
shebang y use extensiones bash para la sintaxis de shell POSIX. Esto fallará en cualquier sistema que tenga algo más que bash para / bin / sh (como las versiones recientes de Ubuntu). Nunca hagas esto; No es solo un problema de compatibilidad, es simplemente incorrecto. Desafortunadamente, es un error que mucha gente comete.
Mi recomendación: use el más conservador de los primeros tres que proporciona todas las funciones de shell que necesita para el script. Para una portabilidad máxima, use la opción n. ° 1, pero según mi experiencia, algunas funciones bash (como las matrices) son lo suficientemente útiles como para ir con la n. ° 2.
Lo peor que puedes hacer es # 4, usar el shebang incorrecto. Si no está seguro de qué características son POSIX básicas y cuáles son las extensiones bash, quédese con un bash shebang (es decir, opción # 2), o pruebe el script a fondo con un shell muy básico (como el tablero en sus servidores Ubuntu LTS). El wiki de Ubuntu tiene una buena lista de bashisms a tener en cuenta .
Hay una muy buena información sobre el historial y las diferencias entre los shells en la pregunta de Unix y Linux "¿Qué significa ser compatible con sh?" y la pregunta de Stackoverflow "Diferencia entre sh y bash" .
Además, tenga en cuenta que el shell no es lo único que difiere entre los diferentes sistemas; si está acostumbrado a Linux, está acostumbrado a los comandos GNU, que tienen muchas extensiones no estándar que puede no encontrar en otros sistemas Unix (por ejemplo, bsd, macOS). Desafortunadamente, no hay una regla simple aquí, solo tiene que conocer el rango de variación para los comandos que está utilizando.
Uno de los comandos más desagradables en términos de portabilidad es uno de los más básicos: echo
. Cada vez que lo use con alguna opción (por ejemplo, echo -n
o echo -e
), o con cualquier escape (barra invertida) en la cadena para imprimir, las diferentes versiones harán diferentes cosas. Cada vez que desee imprimir una cadena sin un salto de línea después de ella, o con escapes en la cadena, use printf
en su lugar (y aprenda cómo funciona, es más complicado de lo que echo
es). El ps
comando también es un desastre .
Otra cosa que hay que observar en general son las extensiones recientes / GNUish para la sintaxis de la opción de comando: el formato de comando antiguo (estándar) es que el comando va seguido de opciones (con un solo guión, y cada opción es una sola letra), seguido de argumentos de comando. Las variantes recientes (y a menudo no portátiles) incluyen opciones largas (generalmente introducidas con --
), que permiten que las opciones aparezcan después de los argumentos y que se usan --
para separar las opciones de los argumentos.
#!/bin/sh
y no use nada más que lo que proporcionó el shell original.