De la diferencia entre bash y sh :
Regrese a la pregunta: si tiene
/bin/sh
un enlace a bash, entonces bash no se comportará de la misma manera cuando se lo llama que/bin/sh
cuando se lo llama/bin/bash
. Cuando se llama comosh
, se limitará principalmente a la conformidad POSIX más un conjunto limitado de extensiones.
¿Significa que cada vez que me encuentro con un script de shell en Linux con un shebang para sh: #!/bin/sh
incluso si en esa distribución, bin/sh
es un enlace simbólico a otro shell, como dash o bash, debería ser 100% compatible con el shell bourne, ya que se limita a un conjunto limitado de extensiones? ¿Entonces podría ejecutarlos en FreeBSD? ¿Hay alguna excepción a eso? ¿O debería estar seguro de asumir que funcionará?
Entonces, si está en una distribución, ¿ bin/sh
hay un enlace simbólico a bin/bash
, y el uso de un script #!/bin/sh
y el script contienen bashism, no se ejecutará, ya que bash querrá estar en modo sh?
fuente
/bin/sh
como shebang. Un script de shell todavía puede usar explícitamente/bin/bash
. De todos modos, la mayoría de los scripts de shell probablemente se ejecutarán bien en / bin / sh, pero el problema serán las herramientas del usuario, por ejemplo, la mayoría de los scripts de shell esperan el usuario GNU, lo que probablemente será más un problema que un error de sintaxis. También agregué un enlace a la referencia de bash que enumera los diferentes comportamientos en modo posixParece haber cierta confusión en torno al caparazón de Bourne. El shell Bourne era un shell de Unix hace décadas, en los días previos a POSIX. Hoy en día "sh" es una implementación u otra de un shell que implementa la especificación POSIX, entre las cuales tenemos bash, pdksh, AT&T ksh, nuevos shells Almquist y sus derivados que se han hecho compatibles con POSIX (incluido el "sh" de algunos BSD) , otros BSDs se basan en pdksh y Debian ash (dash)). Incluso zsh tiene un modo en el que es principalmente compatible con POSIX.
El shell Bourne no es compatible con POSIX, y no se puede encontrar en muchos sistemas hoy en día. Donde se encuentra el shell Bourne o donde no lo es, siempre habrá una "sh" que sea compatible con POSIX (y no será el shell Bourne), generalmente
/bin
mientras que una excepción notable (molesta) es Solaris.Tenga en cuenta que antes del shell Bourne, y estamos hablando hace más de 30 años, "sh" era el shell Thompson. Ya no estamos escribiendo guiones compatibles con el shell Thompson. Del mismo modo, deberíamos dejar de pensar en "sh" como el shell Bourne.
Ahora "sh" es una especificación, no muchas variantes a veces incompatibles de una implementación. Eso hace que sea mucho más fácil escribir scripts portátiles. Solo sigue las especificaciones .
Eso va para "sh" y todas las utilidades estándar (sed, cut, tr ...)
fuente
sed -r
. En sistemas con utilidades basadas en BSD, usted usased -E
. El sed de FreeBSD acepta ambos, pero el Mac OS X solo acepta-E
. Y así sucesivamente y así sucesivamente.\(...\)\1
no tienen traducción en los ERE estándar).\|
de expresiones regulares que no honre a los BRE. Estoy dispuesto a escribir de la manera más portátil posible. Solo estaba haciendo la observación (me pareció muy apreciada) de que esto puede ser doloroso, y algunas veces escribir a POSIX simplemente no es posible. En algún lugar tienen enlaces que exhiben muchas de esas perversiones; los buscará${VAR:=stuff...here}
pero muchos shells no lo permiten, debe poner comillasstuff...here
.