in

shell – Diferencia entre sh y bash

apple touch icon@2

sh (o el lenguaje de comandos de Shell) es un lenguaje de programación descrito por el Estándar POSIX. Tiene muchas implementaciones (ksh88, dash, …). bash también se puede considerar una implementación de sh (vea abajo).

Porque sh es una especificación, no una implementación, /bin/sh es un enlace simbólico (o un enlace físico) a una implementación real en la mayoría de los sistemas POSIX.

bash comenzó como un sh-implementación compatible (aunque es anterior al estándar POSIX por unos años), pero con el paso del tiempo ha adquirido muchas extensiones. Muchas de estas extensiones pueden cambiar el comportamiento de scripts de shell POSIX válidos, por lo que bash no es un shell POSIX válido. Más bien, es un dialecto del lenguaje shell POSIX.

bash apoya un --posix Switch, lo que lo hace más compatible con POSIX. También intenta imitar POSIX si se invoca como sh.

Por mucho tiempo, /bin/sh solía señalar a /bin/bash en la mayoría de los sistemas GNU / Linux. Como resultado, casi se había vuelto seguro ignorar la diferencia entre los dos. Pero eso comenzó a cambiar recientemente.

Algunos ejemplos populares de sistemas donde /bin/sh no apunta a /bin/bash (y en algunos de los cuales /bin/bash puede que ni siquiera exista) son:

  1. Los sistemas modernos de Debian y Ubuntu, que enlace simbólico sh para dash por defecto;
  2. Busybox, que generalmente se ejecuta durante el tiempo de inicio del sistema Linux como parte de initramfs. Usa el ash implementación de shell.
  3. BSD y, en general, cualquier sistema que no sea Linux. Usos de OpenBSD pdksh, un descendiente del caparazón de Korn. FreeBSD’s sh es un descendiente del shell Bourne de UNIX original. Solaris tiene su propio sh que durante mucho tiempo no fue compatible con POSIX; una implementación gratuita está disponible en el Proyecto de reliquia.

¿Cómo puedes averiguar qué /bin/sh apunta en su sistema?

La complicación es que /bin/sh podría ser un enlace simbólico o un enlace físico. Si es un enlace simbólico, un portátil forma de resolverlo es:

% file -h /bin/sh
/bin/sh: symbolic link to bash

Si es un enlace duro, intente

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

De hecho, el -L La bandera cubre tanto los enlaces simbólicos como los enlaces duros, pero la desventaja de este método es que no es portátil: POSIX no requiere find para apoyar el -samefile opción, aunque ambos GNU encontrar y FreeBSD encontrar apoyarlo.

En última instancia, depende de usted decidir cuál usar, escribiendo la línea «shebang» como la primera línea del guión.

P.ej

#!/bin/sh

utilizará sh (y lo que sea que apunte),

#!/bin/bash

utilizará /bin/bash si está disponible (y fallará con un mensaje de error si no lo está). Por supuesto, también puede especificar otra implementación, p. Ej.

#!/bin/dash

Para mis propios guiones, prefiero sh por las siguientes razones:

  • esta estandarizado
  • es mucho más sencillo y fácil de aprender
  • es portátil en todos los sistemas POSIX, incluso si no tienen bash, están obligados a tener sh

Hay ventajas de usar bash así como. Sus características hacen que la programación sea más conveniente y similar a la programación en otros lenguajes de programación modernos. Estos incluyen cosas como matrices y variables locales de ámbito. Sencillo sh es un lenguaje de programación muy minimalista.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Unix / Linux – Expresiones regulares con SED

gfg 200x200 min

Semáforo en Java – GeeksforGeeks