Al escribir programas de shell, a menudo usamos /bin/sh
y /bin/bash
. Usualmente uso bash
, pero no sé cuál es la diferencia entre ellos.
¿Cuál es la principal diferencia entre bash
y sh
?
¿Qué debemos tener en cuenta al programar en bash
y sh
?
Respuestas:
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 desh
(ver más abajo).Porque
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 unash
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, porbash
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 comosh
.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 donde
/bin/sh
no apunta/bin/bash
(y en algunos de los cuales/bin/bash
pueden no existir) son:sh
dedash
forma predeterminada;initramfs
. Utiliza laash
implementación de shell.pdksh
, un descendiente del shell Korn. FreeBSDsh
es un descendiente del shell original Bourne de UNIX. Solaris tiene la suyash
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 tiene en 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:Si es un enlace duro, intente
De hecho, el
-L
indicador cubre tanto enlaces simbólicos como enlaces duros, pero la desventaja de este método es que no es portátil: POSIX no requierefind
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» como la primera línea del guión.
P.ej
usará
sh
(y lo que sea que apunte),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 ejemploCual usar
Para mis propios guiones, prefiero
sh
por las siguientes razones: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. Plainsh
es un lenguaje de programación muy minimalista.fuente
bash
la forma de visualización de mensajes de error más útiles en el caso de error de sintaxis. Simplemente puede ahorrar tiempo usando bash.%
significa el comienzo de sus líneas de comando?$
lugar de%
, o#
para el shell raíz.$
y#
...sh
existía mucho antes de bash (que significa bourne-again shell). Pero fue muy primitivo y no respondió a eventos terminales, como losESC
personajes. Luegoksh
vino (también antes de bash), luego bash comenzó por aquellos que amaban la idea de un mejor caparazón, pero odiaban ksh. :-)sh
: http://man.cx/shbash
: http://man.cx/bashTL; DR :
bash
es un superconjuntosh
con una sintaxis más elegante y más funcionalidad. Es seguro usar una línea bash shebang en casi todos los casos, ya que es bastante omnipresente en las plataformas modernas.NB: en algunos entornos,
sh
esbash
. Compruebesh --version
.fuente
Esta pregunta ha sido frecuentemente nominada como canónica para las personas que intentan usar
sh
y se sorprenden de que no se comporta de la misma manerabash
. Aquí hay un resumen rápido de malentendidos y dificultades comunes.En primer lugar, debe entender qué esperar.
sh scriptname
, o lo ejecuta conscriptname
y tiene#!/bin/sh
en la línea shebang , debe esperar elsh
comportamiento POSIX .bash scriptname
, o lo ejecuta conscriptname
y tiene#!/bin/bash
(o el equivalente local) en la línea shebang, debe esperar un comportamiento Bash.Generalmente, la solución preferida es tener un shebang correcto y ejecutar el script escribiendo solo el nombre del script (posiblemente con una ruta relativa o completa ). Además de un shebang correcto, esto requiere que el archivo de script tenga permiso de ejecución (
chmod a+x scriptname
).Entonces, ¿cómo difieren realmente?
El manual de referencia de Bash tiene una sección que intenta enumerar las diferencias, pero algunas fuentes comunes de confusión incluyen
[[
no está disponible ensh
(solo[
que es más torpe y limitado).sh
no tiene matriceslocal
,source
,function
,shopt
,let
,declare
, yselect
no son portátiles ash
. (Algunassh
implementaciones admiten, por ejemplolocal
).for((i=0;i<=3;i++))
de bucle,+=
la asignación de la subasta, etc. La$'string\nwith\tC\aescapes'
función está tentativamente aceptada para POSIX (lo que significa que trabaja en Bash ahora, pero todavía no será apoyado porsh
sobre los sistemas que sólo se adhieren a la corriente Especificación POSIX, y probablemente no lo hará por algún tiempo).<<<'here strings'
.*.{png,jpg}
y{0..12}
abrazadera de expansión.Esto está en POSIX, pero puede faltar en algunas~
se refiere$HOME
solo a Bash (y más generalmente~username
al directorio de inicio deusername
)./bin/sh
implementaciones anteriores a POSIX .<(cmd)
y>(cmd)
.&|
de2>&1 |
y&>
para> ... 2>&1
<>
redireccionamiento.${substring:1:2}
,${variable/pattern/replacement}
, la conversión caso, etc.$[expression]
sintaxis heredada obsoleta que, sin embargo, debe reemplazarse con la$((expression))
sintaxis aritmética POSIX . (Sinsh
embargo, algunas implementaciones anteriores a POSIX pueden no ser compatibles).$RANDOM
,$SECONDS
,$PIPESTATUS[@]
y$FUNCNAME
son extensiones del golpe.export variable=value
y[ "x" == "y" ]
que no son portátiles (export variable
deben estar separadas de la asignación de variables, y la comparación de cadenas portátil en[ ... ]
usa un solo signo igual).Recuerde, esta es una lista resumida. Consulte el manual de referencia para la primicia completa, y http://mywiki.wooledge.org/Bashism para muchas soluciones alternativas; y / o pruebe http://shellcheck.net/, que advierte sobre muchas funciones exclusivas de Bash.
Un error común es tener una
#!/bin/bash
línea shebang, pero luego usarlash scriptname
para ejecutar el script. Básicamente, esto deshabilita cualquier funcionalidad de solo Bash, por lo que obtiene errores de sintaxis, por ejemplo, al intentar usar matrices. (La línea shebang es sintácticamente un comentario, por lo que simplemente se ignora en este escenario).Desafortunadamente, Bash no le avisará cuando intente utilizar estas construcciones cuando se invoque como
sh
. Tampoco deshabilita por completo toda la funcionalidad de Bash, por lo que ejecutar Bash invocandolo ya quesh
no es una buena manera de verificar si su script es correctamente portátil paraash
/dash
/ POSIXsh
o variantes como Heirloomsh
fuente
export variable=value
es un mandato de POSIX: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html . Quizás no esté disponible en algunas conchas antiguas, pero definitivamente no es un bashismo.Shell es una interfaz entre un usuario y un sistema operativo para acceder a los servicios de un sistema operativo. Puede ser GUI o CLI (interfaz de línea de comandos).
sh (Bourne sh ell) es un intérprete de línea de comandos de shell, para sistemas operativos tipo Unix / Unix. Proporciona algunos comandos integrados. En lenguaje de script, denotamos intérprete como
#!/bin/sh
. Fue uno de los más ampliamente apoyados por otros shells como bash (gratis / abierto), kash (no gratis).Bash ( B ourne a gain s hell) es un reemplazo de la shell Bourne. Bash es un superconjunto de sh. Bash soporta sh. POSIX es un conjunto de estándares que definen cómo deberían funcionar los sistemas compatibles con POSIX. Bash no es en realidad un shell compatible con POSIX. En un lenguaje de script, denotamos al intérprete como
#!/bin/bash
.Analogía:
fuente
sh
(por lo que es una "subclase" en el sentido OOP) y lo extiende (también tiene un superconjunto de la funcionalidad).Publicación de UNIX.COM
Características de Shell
Esta tabla a continuación enumera la mayoría de las características que creo que lo harían elegir un shell sobre otro. No pretende ser una lista definitiva y no incluye todas las características posibles para cada shell posible. Una característica solo se considera que está en un shell si está en la versión que viene con el sistema operativo, o si está disponible como compilado directamente de la distribución estándar. En particular, el shell C especificado a continuación es el que está disponible en SUNOS 4. *, un número considerable de proveedores ahora envían tcsh o su propio shell C mejorado (no siempre hacen obvio que están enviando tcsh.
Código:
Clave de la tabla de arriba.
La característica Y se puede hacer usando este shell.
N La función no está presente en el shell.
La función F solo se puede hacer mediante el uso del mecanismo de función de shells.
L La biblioteca readline debe estar vinculada al shell para habilitar esta función.
Notas a la tabla de arriba
fuente
TERMINAL
CÁSCARA
SH vs. GOLPETAZO
SH
GOLPETAZO
MATERIAL DE REFERENCIA:
SHELL gnu.org:
BASH gnu.org:
fuente
Otras respuestas generalmente señalaron la diferencia entre Bash y un estándar de shell POSIX. Sin embargo, cuando se escriben scripts de shell portátiles y se utilizan para sintaxis Bash, es muy útil una lista de bashismos típicos y las correspondientes soluciones POSIX puras. Dicha lista se compiló cuando Ubuntu cambió de Bash a Dash como shell del sistema predeterminado y se puede encontrar aquí: https://wiki.ubuntu.com/DashAsBinSh
Además, hay una gran herramienta llamada checkbashisms que verifica los bashisms en su script y es útil cuando desea asegurarse de que su script sea portátil.
fuente
Son casi idénticos pero
bash
tienen más características :sh
es (más o menos) un subconjunto más antiguobash
.sh
a menudo significa el originalBourne shell
, que es anterior abash
(Bourne *again* shell
), y fue creado en 1977. Pero, en la práctica, puede ser mejor pensar en él como un shell altamente compatible con el estándar POSIX de 1992.Las secuencias de comandos que comienzan con
#!/bin/sh
o usan elsh
shell generalmente lo hacen por compatibilidad con versiones anteriores. Cualquier sistema operativo unix / linux tendrá unsh
shell. En Ubuntu ash
menudo se invocadash
y en MacOS es una versión especial de POSIXbash
. Estas carcasas pueden ser preferibles para el comportamiento conforme a los estándares, la velocidad o la compatibilidad con versiones anteriores.bash
es más nuevo que el originalsh
, agrega más funciones y busca ser compatible con versiones anterioressh
. En teoría, lossh
programas deberían ejecutarsebash
.bash
está disponible en casi todas las máquinas Linux / Unix y generalmente se usa de manera predeterminada, con la notable excepción de que MacOS está predeterminado azsh
Catalina (10.15). FreeBSD, por defecto, no viene conbash
instalado.fuente
sh
es muy anterior a POSIX. En estos días, esperaría que cualquierash
que encuentre sea al menos compatible con POSIX; pero en los sistemas heredados esto no es un hecho. POSIX estandariza mucho más que el shell; de hecho, podría argumentar que la estandarización de las llamadas al sistema operativo y las funciones de la biblioteca es más importante./bin/sh
puede o no invocar el mismo programa que/bin/bash
.sh
admite al menos las características requeridas por POSIX (suponiendo una implementación correcta). Puede admitir extensiones también.bash
, el "Bourne Again Shell", implementa las características requeridas para las extensiones específicas de sh plus bash. El conjunto completo de extensiones es demasiado largo para describirlo aquí, y varía con las nuevas versiones. Las diferencias están documentadas en el manual de bash. Escribainfo bash
y lea la sección "Características de Bash" (sección 6 en la versión actual), o lea la documentación actual en línea .fuente
sh
solo le da un shell POSIX, si tiene laPATH
configuración correcta en su shell actual. No hay un nombre de RUTA definido que le proporcione un shell POSIX.sh
no era necesariamente incluso dándole un shell POSIX, en Solaris, por ejemplo.bash y sh son dos conchas diferentes. Básicamente bash es sh, con más funciones y mejor sintaxis. La mayoría de los comandos funcionan igual, pero son diferentes. Bash (bash) es uno de los muchos shells de Unix disponibles (pero los más utilizados). Bash significa "Bourne Again SHell", y es un reemplazo / mejora del shell Bourne original (sh).
Las secuencias de comandos de Shell son secuencias de comandos en cualquier shell, mientras que las secuencias de comandos Bash son secuencias de comandos específicamente para Bash. En la práctica, sin embargo, "script de shell" y "script de bash" a menudo se usan indistintamente, a menos que el shell en cuestión no sea Bash.
Dicho esto, debe darse cuenta de que / bin / sh en la mayoría de los sistemas será un enlace simbólico y no invocará sh. En Ubuntu / bin / sh solía vincularse a bash, el comportamiento típico en las distribuciones de Linux, pero ahora ha cambiado a vincularse a otro shell llamado dash. Usaría bash, ya que eso es más o menos el estándar (o al menos el más común, según mi experiencia). De hecho, surgen problemas cuando una secuencia de comandos bash usará #! / Bin / sh porque el creador de secuencias de comandos asume que el enlace es bash cuando no es necesario.
fuente
Las diferencias son lo más fácil posible: después de tener una comprensión básica, los otros comentarios publicados anteriormente serán más fáciles de captar.
Shell - "Shell" es un programa que facilita la interacción entre el usuario y el sistema operativo (kernel). Hay muchas implementaciones de shell disponibles, como sh, bash, csh, zsh ... etc.
Usando cualquiera de los programas de Shell, podremos ejecutar comandos compatibles con ese programa de shell.
Bash - Deriva de B ourne- una ganancia Sh ell. Usando este programa, podremos ejecutar todos los comandos especificados por Shell. Además, podremos ejecutar algunos comandos que se agregan específicamente a este programa. Bash tiene compatibilidad con sh.
Sh - Deriva de Bourne Sh ell. "sh" admite todos los comandos especificados en el shell. Significa que, utilizando este programa, podremos ejecutar todos los comandos especificados por Shell.
Para obtener más información, haga: - https://man.cx/sh - https://man.cx/bash
fuente
El sistema operativo Linux ofrece diferentes tipos de shell. Aunque los shells tienen muchos comandos en común, cada tipo tiene características únicas. Estudiemos diferentes tipos de conchas en su mayoría usadas.
Sh shell:
Sh shell también se conoce como Bourne Shell. Sh shell es el primer shell desarrollado para computadoras Unix por Stephen Bourne en los Laboratorios Bell de AT&T en 1977. Incluye muchas herramientas de secuencias de comandos.
Bash shell:
Bash shell significa Bourne Again Shell. Bash shell es el shell predeterminado en la mayoría de la distribución de Linux y sustituye a Sh Shell (Sh shell también se ejecutará en Bash shell). Bash Shell puede ejecutar la gran mayoría de los scripts de Sh shell sin modificación y también proporciona la función de edición de línea de comandos.
fuente