Sé que puedo usarlo como la primera línea de scripts para invocar el shell deseado.
¿ #!/bin/sh
Se 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/bash
y 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/sh
también se relaciona con el uso de POSIX?
/bin
y/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
bash
que esté configurada, sin importar si está en/bin
o/usr/local/bin
.Mientras que en la mayoría de los sistemas en una amplia gama (incluidos AIX, Solaris, varios sabores BSD),
bash
terminaron en diferentes ubicaciones,env
siempre 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
sh
sintaxis POSIX común tradicional .Pero si desea más potencia en el shell (no solo en scripts), también eche un vistazo
zsh
.fuente
sh
tales tareas.sh
enlaces abash
, la vulnerabilidad no se mitigará mediante el usosh
.En Debian y Ubuntu,
/bin/sh
esdash
, 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 quedash
comienza 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/sh
esbash
por eso que muchos scripts se escriben#!/bin/sh
como su línea shebang a pesar de que usanbash
extensiones.Si desea usar
bash
extensiones, 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/sh
bash
desactiva algunas extensiones (consulte la descripción delbash
modo POSIX para más detalles); Por lo tanto,#!/bin/bash
es necesario especificar para obtener el máximo beneficio debash
.En OS X también
/bin/bash
está disponible, y lo/bin/sh
esbash
. Especificar#!/bin/bash
funcionará 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/sh
mayorí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/sh
apunta abash
, en otros puede apuntar a diferentes shells. Es un enlace simbólico adash
Debian y Ubuntu, por ejemplo. Además, incluso si se/bin/sh
trata 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 +N
sintaxis 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