Sé que puedo usarlo como la primera línea de scripts para invocar el shell deseado.
¿ #!/bin/shSe recomendaría si la compatibilidad con todos los sistemas Unix es un requisito absoluto?
En mi caso, el único sistema operativo que me importa son Ubuntu (Debian) y OSX. Dado eso, ¿podría usar #!/bin/bashy estar seguro de que funcionaría en ambos sistemas?
¿Esto también facilitaría el uso de scripts con una sintaxis más moderna y clara para los comandos? ¿El uso #!/bin/shtambién se relaciona con el uso de POSIX?

/biny/usr/bin. Como resultado, es probable que sea mejor usar#!/usr/bin/env <shname>para la portabilidad en estos días.Respuestas:
Para empezar, si puede suponer que Bash está preinstalado (que, que yo sepa, es el caso en todos los sistemas que enumera), use el siguiente hashbang para ser compatible:
Esto invoca cualquier cosa
bashque esté configurada, sin importar si está en/bino/usr/local/bin.Mientras que en la mayoría de los sistemas en una amplia gama (incluidos AIX, Solaris, varios sabores BSD),
bashterminaron en diferentes ubicaciones,envsiempre terminaron en/usr/bin/env. Sin embargo, el truco no es mío, sino del autor del Bash Cookbook.De todos modos, sí, Bash te permitiría usar algunas características "modernas" que te facilitarán la vida.
Por ejemplo los corchetes dobles:
mientras que en los dialectos de concha tradicionales tendrías que recurrir a:
pero lo mejor de los corchetes dobles es que permiten expresiones regulares para la coincidencia. El Bash hackers Wiki le dará muchos trucos en esa dirección.
También puede usar expresiones bastante convenientes como
$((2**10))u otras expresiones aritméticas en línea con la$((expression))sintaxis.Usar backticks para subshells está bien, aunque un poco desactualizado. Pero las capacidades de anidación de las
$(command ...)invocaciones son mucho más convenientes, ya que no tendrá que escapar de muchas cosas en diferentes niveles de subshell.Estas son solo algunas de las cosas que Bash le brinda sobre la
shsintaxis POSIX común tradicional .Pero si desea más potencia en el shell (no solo en scripts), también eche un vistazo
zsh.fuente
shtales tareas.shenlaces abash, la vulnerabilidad no se mitigará mediante el usosh.En Debian y Ubuntu,
/bin/shesdash, que es un shell compatible con POSIX. Si especifica#!/bin/sh, debe limitarse a las declaraciones POSIX en su secuencia de comandos. (La ventaja es quedashcomienza más rápido quebash, por lo que su script puede hacer su trabajo en menos tiempo).En muchos (¿la mayoría?) Otros sistemas Linux,
/bin/shesbashpor eso que muchos scripts se escriben#!/bin/shcomo su línea shebang a pesar de que usanbashextensiones.Si desea usar
bashextensiones, el enfoque más seguro en todos los sistemas es especificar#!/bin/bash; de esa manera estás declarando explícitamente tu dependenciabash. Usted necesita hacer esto en Debian y Ubuntu. Como beneficio adicional, cuando se inicia como/bin/shbashdesactiva algunas extensiones (consulte la descripción delbashmodo POSIX para más detalles); Por lo tanto,#!/bin/bashes necesario especificar para obtener el máximo beneficio debash.En OS X también
/bin/bashestá disponible, y lo/bin/shesbash. Especificar#!/bin/bashfuncionará bien allí también.fuente
Sí, vendrán OSX y Linux
/bin/bash. Deberías estar perfectamente seguro. Sin embargo, eso no es POSIX. El shell POSIX se encuentra en la/bin/shmayoría de los sistemas (¿todos?) Y ese es el enfoque más portátil y la única forma de ser compatible con POSIX.Tenga en cuenta que si bien en muchos sistemas
/bin/shapunta abash, en otros puede apuntar a diferentes shells. Es un enlace simbólico adashDebian y Ubuntu, por ejemplo. Además, incluso si se/bin/shtrata de un enlacebash, el comportamiento del shell cambia cuando se lo llama comosh(deman bash, énfasis mío):fuente
Si la compatibilidad con "todos los sistemas Unix" es un requisito absoluto, y si no lo es, ¿por qué está escribiendo un script de shell? - entonces, sí, deberías estar usando
#! /bin/sh, porque Bash no está garantizado para instalarse en cualquier lugar , y mucho menos en/bin.En realidad es mucho, mucho peor que eso. Si necesita compatibilidad con todos los sistemas Unix, eso incluye cosas como Solaris y AIX que congelaron sus entornos de shell alrededor de 1995. Lo que significa que debe usar cosas como la
sort +Nsintaxis antigua : ¡ los sistemas más nuevos se han caído! Y también significa que no hay funciones de shell, ni matrices, no[[ ... ]], no${foo#glob}, no$(( ... ))para aritmética, posiblemente$( ... )sustitución de comandos sin estilo, límites superiores pequeños e indocumentados sobre cómo puede obtener una gran entrada, ...Usted probablemente puede salirse con sin molestarse en que tanto la compatibilidad, pero si es aún un problema, en primer lugar, le recomiendo se tiene en cuenta un lenguaje que es menos terrible que la cáscara. Es más probable que el intérprete básico de Perl esté disponible que Bash.
fuente