Diferencia entre sh y bash

Al escribir progtwigs de shell, a menudo usamos /bin/sh y /bin/bash . bash usar bash , pero no sé cuál es la diferencia entre ellos.

¿Cuál es la principal diferencia entre bash y sh ?

¿De qué debemos ser conscientes cuando progtwigmos en bash y sh ?

Qué es sh

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

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

¿Qué es bash?

bash comenzó como una implementación compatible con sh (aunque es anterior al estándar POSIX en unos pocos años), pero a medida que pasa el 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 de shell POSIX.

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

sh = bash?

Durante mucho tiempo, /bin/sh solía apuntar 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 pueden no existir) son:

  1. Los modernos sistemas Debian y Ubuntu, que enlazan simbólicamente sh para dash de forma predeterminada;
  2. Busybox , que generalmente se ejecuta durante el tiempo de arranque del sistema Linux como parte de initramfs . Utiliza la implementación de shell de ash .
  3. BSD y, en general, cualquier sistema que no sea Linux. OpenBSD usa pdksh , un descendiente del shell Korn. FreeBSD’s sh es un descendiente del shell Bourne original de UNIX. Solaris tiene su propio sh que durante mucho tiempo no fue compatible con POSIX; una implementación gratuita está disponible desde el proyecto Heirloom .

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

La complicación es que /bin/sh podría ser un enlace simbólico o un enlace rígido. Si se trata de 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 difícil, prueba

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

De hecho, el indicador -L abarca enlaces simbólicos y enlaces duros, pero la desventaja de este método es que no es portátil: POSIX no requiere la opción de find para admitir la opción -samefile , aunque tanto GNU find como FreeBSD encuentran que lo admite.

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 falla con un mensaje de error si no es así). Por supuesto, también puede especificar otra implementación, por ejemplo

 #!/bin/dash 

Cuál usar

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

  • está estandarizado
  • es mucho más simple y fácil de aprender
  • es portátil en los sistemas POSIX, incluso si no tienen bash , se requiere que tengan sh

También hay ventajas de usar bash . Sus características hacen que la progtwigción sea más conveniente y similar a la progtwigción en otros lenguajes de progtwigción modernos. Estos incluyen cosas como las variables locales y las matrices. Plain sh es un lenguaje de progtwigción muy minimalista.

sh : http://man.cx/sh
bash : http://man.cx/bash

TL; DR : bash es un superconjunto de sh con una syntax más elegante y más funcionalidades. 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 es bash . Ver sh --version .

Publicación de UNIX.COM

Características de Shell

La siguiente tabla enumera la mayoría de las características que creo que le harían elegir un caparazón sobre otro. No pretende ser una lista definitiva y no incluye todas las características posibles para cada caparazón posible. Una característica solo se considera en un shell si está en la versión que viene con el sistema operativo, o si está disponible como comstackda directamente desde 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 ya sea tcsh o su propio shell C mejorado (no siempre hacen obvio que están enviando tcsh).

Código:

  sh csh ksh bash tcsh zsh rc es Job control NYYYYYNN Aliases NYYYYYNN Shell functions Y(1) NYYNYYY "Sensible" Input/Output redirection YNYYNYYY Directory stack NYYYYYFF Command history NYYYYYLL Command line editing NNYYYYLL Vi Command line editing NNYYY(3) YLL Emacs Command line editing NNYYYYLL Rebindable Command line editing NNNYYYLL User name look up NYYYYYLL Login/Logout watching NNNNYYFF Filename completion NY(1) YYYYLL Username completion NY(2) YYYYLL Hostname completion NY(2) YYYYLL History completion NNNYYYLL Fully programmable Completion NNNNYYNN Mh Mailbox completion NNNN(4) N(6) N(6) NN Co Processes NNYNNYNN Builtin artithmetic evaluation NYYYYYNN Can follow symbolic links invisibly NNYYYYNN Periodic command execution NNNNYYNN Custom Prompt (easily) NNYYYYYY Sun Keyboard Hack NNNNNYNN Spelling Correction NNNNYYNN Process Substitution NNNY(2) NYYY Underlying Syntax sh csh sh sh csh sh rc rc Freely Available NNN(5) YYYYY Checks Mailbox NYYYYYFF Tty Sanity Checking NNNNYYNN Can cope with large argument lists YNYYYYYY Has non-interactive startup file NYY(7) Y(7) YYNN Has non-login startup file NYY(7) YYYNN Can avoid user startup files NYNYNYYY Can specify startup file NNYYNNNN Low level command redefinition NNNNNNNY Has anonymous functions NNNNNNYY List Variables NYYNYYYY Full signal trap handling YNYYNYYY File no clobber ability NYYYYYNF Local variables NNYYNYYY Lexically scoped variables NNNNNNNY Exceptions NNNNNNNY 

Clave para la tabla de arriba.

La función Y se puede hacer usando este shell.

N Feature no está presente en el shell.

La característica F solo se puede hacer utilizando el mecanismo de función de las conchas.

L La biblioteca readline debe estar vinculada al shell para habilitar esta característica.

Notas a la tabla de arriba

 1. This feature was not in the original version, but has since become almost standard. 2. This feature is fairly new and so is often not found on many versions of the shell, it is gradually making its way into standard distribution. 3. The Vi emulation of this shell is thought by many to be incomplete. 4. This feature is not standard but unofficial patches exist to perform this. 5. A version called 'pdksh' is freely available, but does not have the full functionality of the AT&T version. 6. This can be done via the shells programmable completion mechanism. 7. Only by specifying a file via the ENV environment variable. 

Esta pregunta ha sido frecuentemente nominada como canónica para las personas que intentan usar sh y se sorprenden de que no se comporte del mismo modo que bash . Aquí hay un resumen rápido de los malentendidos y errores comunes.

En primer lugar, debes entender qué esperar.

  • Si ejecuta su secuencia de comandos con sh scriptname , o lo ejecuta con scriptname y tiene #!/bin/sh en la línea shebang , debe esperar comportamiento POSIX sh .
  • Si ejecuta su script con bash scriptname , o lo ejecuta con scriptname y tiene #!/bin/bash (o el equivalente local) en la línea de shebang, debe esperar el comportamiento de Bash.

Tener un shebang correcto y ejecutar el script simplemente escribiendo el nombre del script (posiblemente con una ruta relativa o completa) es generalmente la solución preferida. 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 fonts comunes de confusión incluyen

  • [[ no está disponible en sh (solo [ que es más torpe y limitado]).
  • sh no tiene matrices.
  • Algunas palabras clave de Bash, como local , function y select , no son portátiles para sh .
  • Bash tiene muchas extensiones de syntax estilo C, como $'string\nwith\tC\aescapes' y el argumento tres for((i=0;i<=3;i++)) loop, += asignación incremental, etc.
  • Bash admite <<<'here strings' .
  • Bash tiene *.{png,jpg} y {0..9} expansión de llave.
  • ~ refiere a $HOME solo en Bash (y más generalmente ~username de ~username al directorio de inicio del username de username ).
  • Bash tiene una sustitución de proceso con <(cmd) y >(cmd) .
  • Bash admite coprocesos con <> redirección.
  • Bash ha ampliado significativamente las instalaciones para la aritmética de shell (aunque todavía no es compatible con coma flotante) y la manipulación de subcadenas variable con ${substring:1:2} , ${variable/pattern/replacement} , conversión de mayúsculas y minúsculas, etc.
  • Muchas, muchas extensiones Bash solo para habilitar o deshabilitar el comportamiento opcional y exponer el estado interno del shell.
  • Muchas, muchas características de conveniencia para uso interactivo que, sin embargo, no afectan el comportamiento del script.

Recuerde, esta es una lista abreviada. Consulte el manual de referencia para obtener la primicia completa, y http://mywiki.wooledge.org/Bashism para ver muchas buenas soluciones; y / o pruebe http://shellcheck.net/, que advierte sobre muchas características Bash-only.

Un error común es tener una línea #!/bin/bash shebang, pero sin embargo usar sh scriptname para ejecutar realmente el script. Esto básicamente deshabilita cualquier funcionalidad Bash-only, por lo que obtienes errores de syntax, por ejemplo, para tratar de usar matrices.

Desafortunadamente, Bash no advertirá cuando intentes usar estos constructos cuando se invoque como sh . No deshabilita completamente todas las funcionalidades Bash, tampoco, por lo que ejecutar Bash invocando esto como sh no es una buena manera de verificar si tu script es apropiadamente portable a ash / dash / POSIX sh .

Shell es una interfaz entre un usuario y el 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 incorporados. En lenguaje de scripting denotamos intérprete como #!/bin/sh . Fue uno de los más ampliamente apoyados por otros proyectiles como bash (libre / abierto), kash (no gratuito).

Bash ( B ourne a gain s hell) es un reemplazo de shell para el shell Bourne. Bash es superconjunto de sh. Bash admite sh. POSIX es un conjunto de estándares que definen cómo deberían funcionar los sistemas que cumplen con POSIX. Bash no es en realidad un shell compatible con POSIX. En un lenguaje de scripting denotamos el intérprete como #!/bin/bash .

Analogía:

  • Shell es como una interfaz o especificaciones o API.
  • sh es una clase que implementa la interfaz de Shell.
  • Bash es una subclase de sh.

TERMINAL

  • progtwig (s) que ponen una ventana hacia arriba
  • xterm, rxvt, konsole, kvt, gnome-terminal, nxterm y eterm.

CÁSCARA

  • Es un progtwig que se ejecuta en la terminal
  • Shell es a la vez un intérprete de comandos y un lenguaje de progtwigción
  • Shell es simplemente un macroprocesador que ejecuta comandos.
  • Procesador de macros: funcionalidad donde el texto y los símbolos se expanden para crear expresiones más grandes.

SH vs. INTENTO

SH

  • (Cáscara)
  • Es un shell específico
  • un intérprete de comandos y un lenguaje de progtwigción
  • Predecesor de BASH

INTENTO

  • (Bourne Again Shell)
  • Es un shell específico
  • un intérprete de comandos y un lenguaje de progtwigción
  • Tiene funcionalidad sh y más
  • Sucesor de SH
  • BASH es la SHELL por defecto

MATERIAL DE REFERENCIA:

SHELL gnu.org:

En su base, un shell es simplemente un macroprocesador que ejecuta comandos. El término macroprocesador significa funcionalidad donde el texto y los símbolos se expanden para crear expresiones más grandes.

Un shell Unix es a la vez un intérprete de comandos y un lenguaje de progtwigción. Como intérprete de comandos, el intérprete de comandos proporciona la interfaz de usuario para el amplio conjunto de utilidades de GNU. Las características del lenguaje de progtwigción permiten que estas utilidades se combinen. Los archivos que contienen comandos se pueden crear y convertirse en comandos. Estos nuevos comandos tienen el mismo estado que los comandos del sistema en directorios como / bin, lo que permite a los usuarios o grupos establecer entornos personalizados para automatizar sus tareas comunes.

Las conchas se pueden usar de manera interactiva o no interactiva. En modo interactivo, aceptan entrada escrita desde el teclado. Al ejecutar de forma no interactiva, las shells ejecutan comandos leídos desde un archivo.

Un shell permite la ejecución de comandos GNU, tanto de forma síncrona como asíncrona. El intérprete de comandos espera a que se completen los comandos sincrónicos antes de aceptar más entradas; los comandos asíncronos continúan ejecutándose en paralelo con el shell mientras lee y ejecuta comandos adicionales. Las construcciones de redirección permiten un control detallado de la entrada y la salida de esos comandos. Además, el shell permite controlar el contenido de los entornos de los comandos.

Las shells también proporcionan un pequeño conjunto de comandos incorporados (builtins) que implementan la funcionalidad imposible o incómoda de obtener a través de utilidades separadas . Por ejemplo, cd, break, continue y exec no pueden implementarse fuera del shell porque manipulan directamente el propio shell. La historia, getopts, kill o pwd builtins, entre otros, podrían implementarse en utilidades separadas, pero son más convenientes para usar como comandos integrados. Todos los shell builtins se describen en secciones posteriores.

Si bien la ejecución de comandos es esencial, la mayor parte de la potencia (y complejidad) de las shells se debe a sus lenguajes de progtwigción integrados. Como cualquier lenguaje de alto nivel, el shell proporciona variables, construcciones de control de flujo, citas y funciones.

Las shells ofrecen características diseñadas específicamente para uso interactivo en lugar de boost el lenguaje de progtwigción. Estas características interactivas incluyen control de trabajos, edición de líneas de comandos, historial de comandos y alias. Cada una de estas características se describe en este manual.

BASH gnu.org:

Bash es el shell o intérprete de lenguaje de comando para el sistema operativo GNU. El nombre es un acrónimo del ‘Bourne-Again SHell’, un juego de palabras con Stephen Bourne, el autor del ancestro directo del shell sh Unix actual, que apareció en la versión Seventh Edition Bell Labs Research de Unix.

Bash es ampliamente compatible con sh e incorpora funciones útiles de Korn shell ksh y C shell csh. Se pretende que sea una implementación conforme de la porción de IEEE POSIX Shell y Tools de la especificación IEEE POSIX (IEEE Standard 1003.1). Ofrece mejoras funcionales sobre sh para uso interactivo y de progtwigción.

Mientras que el sistema operativo GNU proporciona otros shells, incluida una versión de csh, Bash es el shell por defecto . Al igual que otros progtwigs de GNU, Bash es bastante portátil. Actualmente se ejecuta en casi todas las versiones de Unix y algunos otros sistemas operativos: existen puertos compatibles de forma independiente para plataformas MS-DOS, OS / 2 y Windows.

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 la syntax Bash, es muy útil una lista de bashisms típicos y soluciones POSIX puras correspondientes. Dicha lista ha sido comstackda cuando Ubuntu cambió de Bash a Dash como shell del sistema por defecto 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 quiere asegurarse de que su script sea portable.

/bin/sh puede o no invocar el mismo progtwig como /bin/bash .

sh admite al menos las características requeridas por POSIX (suponiendo una implementación correcta). También puede admitir extensiones.

bash , el “Bourne Again Shell”, implementa las funciones necesarias para las extensiones sh plus bash-specific. 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 bash. Escriba info bash y lea la sección “Bash Features” (sección 6 en la versión actual) o lea la documentación actual en línea .

Bash (bash) es uno de los muchos cartuchos de Unix disponibles (aunque son los más utilizados). Bash significa “Bourne Again SHell”, y es un reemplazo / mejora del shell Bourne original (sh).

Los scripts de Shell son scripts en cualquier shell, mientras que los scripts de Bash son scripts específicamente para Bash.

El sistema operativo Linux ofrece diferentes tipos de shell. Aunque las shells tienen muchos comandos en común, cada tipo tiene características únicas. Vamos a estudiar diferentes tipos de conchas utilizadas en su mayoría.

Sh Shell:

Sh Shell también se conoce como Bourne Shell. Shield es el primer shell desarrollado para computadoras Unix por Stephen Bourne en Bell Labs de AT & T en 1977. Incluye muchas herramientas de scripting.

Bash shell:

Bash shell significa Bourne Again Shell. Bash shell es el shell predeterminado en la mayoría de las distribuciones de Linux y sustituye a Sh Shell (Sh shell también se ejecutará en el shell Bash). Bash Shell puede ejecutar la gran mayoría de los scripts de shell Sh sin modificación y también proporciona la función de edición de línea de comandos.