Me di cuenta de que básicamente ningún sistema con el que he trabajado tiene /bin/sh
un ejecutable real. Siempre es un enlace simbólico a dash
, bash
en modo POSIX, o algo similar.
¿Por qué? ¿Cuáles son las desventajas de usar el verdadero original /bin/sh
? (¿Velocidad? ¿Licencias?)
sh
enlace simbólico aksh
?ksh
.bash
, IIRC.sh
se basa en un estándar, lo que significa que podemos tener varias implementaciones que se comportarán de una manera clara y específica siempre que use la sintaxis estándar en su secuencia de comandos.Respuestas:
Supongo que la falta de características: sin historial de comandos, sin redirección elegante, sin edición de línea de comandos. BSD introdujo
csh
el shell C por esas razones. Otro factor es que el Bourne Shell original solo estuvo disponible recientemente en forma de código abierto . A menos que lo licenciara, no podría distribuirlo. Eso lo puso fuera del alcance de las distribuciones gratuitas y lo hizo ideológicamente desagradable para otras distribuciones, y * BSD.Pero el código está disponible ahora. Puedes echar un vistazo, compilarlo, darle una vuelta.
fuente
sh
es exactamente como usar,bash
excepto que es: más lento, los programas son más largos y es más difícil de mantener.sh
comando ejecute un shell compatible con POSIX, lo que no es el shell Bourne heredado. Si bien POSIX no requieresh
estar/bin/sh
, ese es el directorio más lógico para que esté.sh
, no tiene expansión de tilde y arriostramiento, faltan algunos elementos integrados (por ejemplo ,pushd
y )popd
,select
no hay expansión aritmética. Faltan muchas variables, por ejemploPIPESTATUS
.La afirmación en su pregunta es incorrecta. Solaris hasta la versión 10 está proporcionando el legado verdadero Bourne shell como
/bin/sh
. Esto se hizo para no romper la compatibilidad con scripts antiguos que podrían fallar con un shell diferente. Sin embargo, esta elección fue muy frustrante.La mayoría, si no todas, las versiones restantes de Unix y Unix, incluido Solaris 11, proporcionan un shell compatible con
/bin/sh
POSIX porque POSIX exige que elsh
comando inicie un shell POSIX, no el shell Bourne heredado que no es compatible./bin/sh
es generalmente :ksh88
oksh93
en las implementaciones comerciales de Unixbash
enOS/X
(aunque solía serzsh
)ash
opdksh
derivada en otraBSDs
bash
odash
en distribuciones Gnu / Linux.No es necesariamente un enlace, pero puede ser un ejecutable real en muchos sistemas, pero Gnu / Linux.
Curiosamente, a pesar de lo que dice la respuesta más votada a su pregunta, no es la falta de características lo que lleva a los desarrolladores de distribución a instalar algo diferente al shell Bourne heredado,
/bin/sh
sino el deseo de cumplir con POSIX lo más posible, es decir, comportarse como un Unix como sistema operativo. El hecho de que el shell POSIX tenga más funciones que el shell Bourne heredado es solo un efecto secundario de este objetivo de cumplimiento estándar.También es un hecho que algunos shells, en particular
bash
, se comportan de manera diferente cuando se los llamash
, y esto elimina principalmente las características del shell, no al revés.fuente
Por lo que sé, el shell Bourne original no podía ser utilizado por los BSD y el proyecto GNU, debido a su licencia.
En aquel entonces, el Unix original no tenía licencia y el proyecto GNU necesitaba un shell que estaba bajo la GPL, por lo que usaron el bash.
Lo mismo es cierto para BSD4, el padre de todos los BSD. Gracias a la demanda de AT&T, tuvieron que reescribir toda la fuente del Unix original, incluido el shell Bourne.
De FreeBSDs
man sh
Por lo tanto, ambos proyectos se vieron obligados a no usar el shell Bourne y conformarse con un verdadero shell de código abierto.
fuente
Ha habido otros problemas. Bourne Shell usó sbrk () en lugar de malloc () y esto lo hizo no muy portátil.
Después de que Bourne Shell se convirtiera en OpenSource a través de OpenSolaris, creé una versión portátil hafway y luego una versión realmente portátil reemplazando sbrk () por malloc () con la ayuda de Geoff Collyer (la misma persona que ayudó a evitar sbrk () en el Korn Shell).
La razón inicial por la que hice una versión portátil de Bourne Shell es que me gustaba hacer que el Editor de Historia que escribí para mi "bsh" entre 1982 y 1984 también estuviera disponible en Bourne Shell. Mientras tanto, porté la mayoría de las características únicas que escribí para "bsh" al Bourne Shell.
Esto es entre otros:
La página de manual en línea está en: http://schillix.sourceforge.net/man/man1/bosh.1.html Las fuentes son parte de la caja de herramientas schily en:
https://sourceforge.net/projects/schilytools/files/
Recomiendo usar: http://sourceforge.net/projects/schilytools/files/schily-2015-08-18.tar.bz2 o una versión más nueva.
PD Estoy interesado en comentarios
fuente
Está vinculado a shells que proporcionan una compatibilidad con el 100% hacia atrás . No pierdes nada de lo que tiene el shell original, pero obtienes más funciones. No hay inconveniente, ¿por qué perderse las nuevas funciones? Esta es la misma razón por la
/bin/vi
que generalmente está vinculada a vim .fuente
bash
es mucho, mucho más lento quedash
IFS=,; rm file1,file2,file3
eliminaría esos 3 archivos en el shell Bourne. Eso (tonto) característica se eliminó en POSIX sh. Hay docenas de diferencias sutiles que podrían hacer que un script escrito para el shell Bourne funcione de manera diferente con un POSIX sh.