Que es sh
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
(ver más abajo).
Debido a que sh
es una especificación, no una implementación, /bin/sh
es un enlace simbólico (o un enlace duro) a una implementación real en la mayoría de los sistemas POSIX.
¿Qué es bash?
bash
comenzó como una sh
implementación compatible (aunque es anterior al estándar POSIX por algunos años), pero con el paso del tiempo ha adquirido muchas extensiones. Muchas de estas extensiones pueden cambiar el comportamiento de los scripts de shell POSIX válidos, por bash
lo que no es un shell POSIX válido. Más bien, es un dialecto del lenguaje de shell POSIX.
bash
admite un --posix
conmutador, lo que lo hace más compatible con POSIX. También intenta imitar POSIX si se invoca como sh
.
sh = bash?
Durante mucho tiempo, /bin/sh
solía apuntar a la /bin/bash
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 a los /bin/sh
que no apunta /bin/bash
(y en algunos de los cuales /bin/bash
pueden no existir) son:
- Los sistemas Debian y Ubuntu modernas, que SYMLINK
sh
de dash
forma predeterminada;
- Busybox , que generalmente se ejecuta durante el tiempo de arranque del sistema Linux como parte de
initramfs
. Utiliza la ash
implementación de shell.
- BSD y, en general, cualquier sistema que no sea Linux. OpenBSD utiliza
pdksh
, un descendiente del shell Korn. FreeBSD sh
es un descendiente del shell original Bourne de UNIX. Solaris tiene la suya sh
que durante mucho tiempo no fue compatible con POSIX; Se encuentra disponible una implementación gratuita del proyecto Heirloom .
¿Cómo puede averiguar qué /bin/sh
puntos de su sistema?
La complicación es que /bin/sh
podría ser un enlace simbólico o un enlace duro. Si es un enlace simbólico, una forma portátil 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, la -L
bandera cubre tanto enlaces simbólicos como enlaces duros, pero la desventaja de este método es que no es portátil: POSIX no requiere find
admitir la -samefile
opción, aunque tanto GNU find como FreeBSD encuentran que lo admiten.
Línea Shebang
En última instancia, depende de usted decidir cuál usar, escribiendo la línea «shebang».
P.ej
#!/bin/sh
usará sh
(y lo que sea que apunte),
#!/bin/bash
usará /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, por ejemplo
#!/bin/dash
Cual usar
Para mis propios guiones, prefiero sh
por las siguientes razones:
- esta estandarizado
- es mucho más simple y fácil de aprender
- es portátil a través de los sistemas POSIX, incluso si no tienen
bash
, deben tenersh
Hay ventajas de usar bash
también. 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 variables locales localizadas y matrices. Plain sh
es un lenguaje de programación muy minimalista.