Pregunta Diferencia entre sh y bash


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?

¿De qué debemos ser conscientes al programar en bash y sh?


901
2018-04-20 03:33


origen


Respuestas:


Qué es sh

sh (o el lenguaje de comandos de shell) es un lenguaje de programación descrito por POSIX estándar. Tiene muchas implementaciones (ksh88, dash, ...). bash puede también ser considerado 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 fijo) a una implementación real en la mayoría de los sistemas POSIX.

¿Qué es bash?

bash comenzó como un sh-instalación compatible (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 los scripts de shell POSIX válidos, por lo que en sí mismo bash no es un shell POSIX válido. Más bien, es un dialecto del lenguaje de shell POSIX.

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

sh = bash?

Por mucho tiempo, /bin/sh utilizado para 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 puede que ni siquiera exista) son:

  1. Sistemas modernos Debian y Ubuntu, que enlazan sh a dash por defecto;
  2. Busybox, que generalmente se ejecuta durante el tiempo de inicio del sistema Linux como parte de initramfs. Utiliza el ash implementación de shell.
  3. BSD y, en general, cualquier sistema que no sea Linux. OpenBSD usa pdksh, un descendiente del caparazón Korn. FreeBSD's sh es un descendiente del shell Bourne UNIX original. Solaris tiene su propio sh que durante mucho tiempo no fue compatible con POSIX; una implementación gratuita está disponible desde el Proyecto de herencia.

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

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

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

De hecho, el -L la bandera cubre enlaces simbólicos y 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 encuentra y FreeBSD encuentra apoyarlo

Línea Shebang

En última instancia, depende de usted decidir cuál usar, escribiendo la línea «shebang».

P.ej.

#!/bin/sh

utilizará sh (y lo que sea que señale),

#!/bin/bash

utilizará /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, p.

#!/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 todos los sistemas POSIX, incluso si no tienen bash, se les requiere tener sh

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 las variables locales y las matrices. Llanura sh es un lenguaje de programación muy minimalista.


855
2018-04-20 04:10



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

TL; DR: bash es un superconjunto de sh 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  es  bash. Comprobar sh --version.


85
2018-04-20 03:43



Publicar desde 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 compilada 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                          N    Y    Y    Y    Y    Y    N    N
Aliases                              N    Y    Y    Y    Y    Y    N    N
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y
Directory stack                      N    Y    Y    Y    Y    Y    F    F
Command history                      N    Y    Y    Y    Y    Y    L    L
Command line editing                 N    N    Y    Y    Y    Y    L    L
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L
User name look up                    N    Y    Y    Y    Y    Y    L    L
Login/Logout watching                N    N    N    N    Y    Y    F    F
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L
Username completion                  N    Y(2) Y    Y    Y    Y    L    L
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L
History completion                   N    N    N    Y    Y    Y    L    L
Fully programmable Completion        N    N    N    N    Y    Y    N    N
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N
Co Processes                         N    N    Y    N    N    Y    N    N
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N
Periodic command execution           N    N    N    N    Y    Y    N    N
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N
Spelling Correction                  N    N    N    N    Y    Y    N    N
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y
Can specify startup file             N    N    Y    Y    N    N    N    N
Low level command redefinition       N    N    N    N    N    N    N    Y
Has anonymous functions              N    N    N    N    N    N    Y    Y
List Variables                       N    Y    Y    N    Y    Y    Y    Y
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y
File no clobber ability              N    Y    Y    Y    Y    Y    N    F
Local variables                      N    N    Y    Y    N    Y    Y    Y
Lexically scoped variables           N    N    N    N    N    N    N    Y
Exceptions                           N    N    N    N    N    N    N    Y

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 función F solo se puede hacer utilizando la función de shells           mecanismo.

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.

42
2017-08-04 06:10



Esta pregunta ha sido frecuentemente nominada como canónica para las personas que intentan usar sh y se sorprenden de que no se comporta lo mismo 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 ejecutarlo con scriptname y tiene #!/bin/sh en el el asunto línea, debe esperar POSIX sh comportamiento.
  • Si ejecuta su secuencia de comandos con bash scriptname, o ejecutarlo 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 fuentes comunes de confusión incluyen

  • [[no está disponible en sh (solamente [ que es más torpe y limitado).
  • sh no tiene arreglos
  • Algunas palabras clave de Bash como local, functiony select no son portátiles para sh.
  • Bash tiene muchas extensiones de sintaxis estilo C, como $'string\nwith\tC\aescapes' y el argumento de tres for((i=0;i<=3;i++)) lazo, += asignación incremental, etc.
  • Bash apoya <<<'here strings'.
  • Bash tiene *.{png,jpg} y {0..9} expansión de la abrazadera
  • ~ se refiere a $HOME solo en Bash (y de manera más general ~username al directorio de inicio de username)
  • Bash tiene 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 casos, 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 la primicia completa, y http://mywiki.wooledge.org/Bashism para muchas buenas soluciones; y / o intentar http://shellcheck.net/ que advierte de muchas características Bash-only.

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

Lamentablemente, Bash no advertirá cuando intente utilizar estos constructos cuando se invoque como sh. No deshabilita completamente todas Funcionalidad Bash-only, cualquiera, por lo que ejecutar Bash invocando como sh no es una buena manera de verificar si su script es apropiadamente portable a ash/dash/ POSIX sh.


32
2018-03-08 08:44



Cáscara es una interfaz entre un usuario y OS para acceder a los servicios de un sistema operativo. Puede ser GUI o CLI (interfaz de línea de comandos).

sh (Bourne shell) es un intérprete de línea de comandos de shell, para sistemas operativos tipo Unix / Unix. Proporciona algunos comandos incorporados. En el 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).

Intento (segundoourne unganancia sinfierno) 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.

21
2018-02-09 09:46



TERMINAL 

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

CÁSCARA

  • Es un programa que se ejecuta en la terminal
  • Shell es a la vez un intérprete de comandos y un lenguaje de programació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 programación
  • Predecesor de BASH

INTENTO

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

MATERIAL DE REFERENCIA:

CÁSCARA gnu.org:

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

A Unix shell es a la vez un intérprete de comandos y un lenguaje de programación.   Como intérprete de comandos, el shell proporciona la interfaz de usuario a la   rico conjunto de utilidades GNU. Las características del lenguaje de programación permiten   estas utilidades para ser combinadas. Los archivos que contienen comandos pueden ser   creado, y se convierten en comandos ellos mismos. Estos nuevos comandos tienen   mismo estado que los comandos del sistema en directorios como / bin, lo que permite   usuarios o grupos para establecer entornos personalizados para automatizar su   tareas comunes.

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

Un shell permite la ejecución de comandos GNU, tanto sincrónicamente como   asincrónicamente El shell espera a que se completen los comandos sincrónicos   antes de aceptar más información; los comandos asincrónicos continúan ejecutándose   en paralelo con el shell mientras lee y ejecuta adicional   comandos. Las construcciones de redirección permiten un control detallado de   la entrada y la salida de esos comandos. Además, el caparazón permite   control sobre los contenidos de los entornos de los comandos.

Las shells también proporcionan un pequeño conjunto de comandos incorporados (builtins)   implementar funcionalidad imposible o inconveniente para obtener vía   servicios separados. Por ejemplo, cd, break, continue y exec no pueden   ser implementado fuera del caparazón porque manipulan directamente   el caparazón mismo. La historia, getopts, kill o pwd builtins, entre   otros, podrían implementarse en utilidades separadas, pero son más   conveniente para usar como comandos integrados. Todos los shell builtins son   descrito en secciones posteriores.

Mientras que ejecutar comandos es esencial, la mayor parte del poder (y   complejidad) de shells se debe a sus lenguajes de programación incrustados.   Como cualquier lenguaje de alto nivel, el shell proporciona variables, flujo   control de construcciones, citas y funciones.

Las conchas ofrecen características diseñadas específicamente para uso interactivo en lugar de   que aumentar el lenguaje de programación. Estas funciones interactivas   incluye control de trabajo, edición de línea de comando, historial de comandos y   alias Cada una de estas características se describe en este manual.

INTENTO  gnu.org:

Bash es el shell o intérprete de lenguaje de comando para GNU   sistema operativo. El nombre es un acrónimo de 'Bourne-Again SHell',   un juego de palabras sobre Stephen Bourne, el autor del ancestro directo de la   Unix shell sh actual, que apareció en la Séptima Edición Bell Labs   Versión de investigación de Unix.

Bash es ampliamente compatible con sh e incorpora funciones útiles   desde Korn shell ksh y C shell csh. Está destinado a ser un   la implementación conforme de la porción de shell y herramientas IEEE POSIX de   la especificación IEEE POSIX (IEEE Standard 1003.1). Ofrece   mejoras funcionales sobre sh para interactivos y programación   utilizar.

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


20
2017-09-03 12:51



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 sintaxis Bash, es muy útil una lista de bashisms típicos y soluciones POSIX puras correspondientes. Dicha lista ha sido compilada 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 busca bashisms en su script y es útil cuando quiere asegurarse de que su script sea portable.


14
2018-05-18 02:22



/bin/sh puede o no invocar el mismo programa que /bin/bash.

sh apoyos al menos Las características requerido 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. Tipo info bash y lea la sección "Funciones de Bash" (sección 6 en la versión actual), o lea el documentación actual en línea.


3
2018-04-09 16:01