Diferencia entre sh y bash

1305

Al escribir programas de shell, a menudo usamos /bin/shy /bin/bash. Usualmente uso bash, pero no sé cuál es la diferencia entre ellos.

¿Cuál es la principal diferencia entre bashy sh?

¿Qué debemos tener en cuenta al programar en bashy sh?

Weiwei Yang
fuente
21
Para obtener una lista útil de bashismos y el código correspondiente que funciona en el shell Bourne, consulte mywiki.wooledge.org/Bashism
StackExchange saddens dancek el
1
Es posible que desee ver el estándar POSIX para sh y su lenguaje de comando: * sh * Idioma de comando de Shell
Maurício C Antunes
77
como regla general, todos los scripts sh se ejecutarán bajo bash gracias a su compatibilidad posix, pero no todos los scripts bash pueden ejecutarse bajo sh, las principales diferencias que observa son cosas como [[]] en lugar de [] comparaciones que permiten espacios sin comillas, $ (()) en lugar de expresiones aritméticas $ [], y otras cosas como "es demasiado grande y demasiado lento" directamente desde los documentos bash .. Pero los nuevos scripters no necesitan limitarse a scripts compatibles con sh a menos que estén disparando para algunos compatibilidad con versiones anteriores, que en la mayoría de los casos no es el caso en estos días, después de todo, es (o fue ...) el año 2014 ¿verdad?
osirisgothra

Respuestas:

1142

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, ...). bashTambién se puede considerar una implementación de sh(ver más abajo).

Porque shes una especificación, no una implementación, /bin/shes un enlace simbólico (o un enlace duro) a una implementación real en la mayoría de los sistemas POSIX.

¿Qué es bash?

bashcomenzó como una shimplementació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 bashlo que no es un shell POSIX válido. Más bien, es un dialecto del lenguaje de shell POSIX.

bashadmite un --posixconmutador, 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/shsolía apuntar a la /bin/bashmayorí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/shno apunta /bin/bash(y en algunos de los cuales /bin/bashpueden no existir) son:

  1. Los sistemas Debian y Ubuntu modernas, que SYMLINK shde dashforma predeterminada;
  2. Busybox , que generalmente se ejecuta durante el tiempo de arranque del sistema Linux como parte de initramfs. Utiliza la ashimplementación de shell.
  3. BSD y, en general, cualquier sistema que no sea Linux. OpenBSD utiliza pdksh, un descendiente del shell Korn. FreeBSD shes un descendiente del shell original Bourne de UNIX. Solaris tiene la suya shque durante mucho tiempo no fue compatible con POSIX; Se encuentra disponible una implementación gratuita del proyecto Heirloom .

¿Cómo puede averiguar qué /bin/shpuntos tiene en su sistema?

La complicación es que /bin/shpodrí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, el -Lindicador 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 -samefileopció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

#!/bin/sh

usará sh(y lo que sea que apunte),

#!/bin/bash

usará /bin/bashsi 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 shpor 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 bashtambié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 shes un lenguaje de programación muy minimalista.

Roman Cheplyaka
fuente
Si ejecuta una secuencia de comandos con bashla forma de visualización de mensajes de error más útiles en el caso de error de sintaxis. Simplemente puede ahorrar tiempo usando bash.
PHPst
¿Qué %significa el comienzo de sus líneas de comando?
JosephHarriott
@JosephHarriott es un mensaje: un personaje impreso por el propio shell después del cual sigue su comando. Algunos shells se usan en $lugar de %, o #para el shell raíz.
Roman Cheplyaka
@RomanCheplyaka qué conchas? Solo he visto $y #...
JosephHarriott
@RomanCheplyaka Estoy seguro de que shexistía mucho antes de bash (que significa bourne-again shell). Pero fue muy primitivo y no respondió a eventos terminales, como los ESCpersonajes. Luego kshvino (también antes de bash), luego bash comenzó por aquellos que amaban la idea de un mejor caparazón, pero odiaban ksh. :-)
raminr
145

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

TL; DR : bashes un superconjunto shcon 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 . Compruebe sh --version.

Rein Henrichs
fuente
31
si bash se invoca como sh, se comporta de manera un poco diferente. Consulte gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files ("Se invoca con el nombre sh") y gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode . Por ejemplo, no hay sustitución del proceso.
Glenn Jackman
11
Como bash es un superconjunto de sh y algunos sistemas operativos como FreeBSD no tienen instalado bash de forma predeterminada, las secuencias de comandos en sh proporcionarán una mayor portabilidad.
user674062
1
Como no hay una forma portátil de secuencias de comandos para obtener un shell POSIX para una secuencia de comandos específica, las secuencias de comandos portátiles no pueden asumir más que las características de Bourne Shell.
schily
83

Esta pregunta ha sido frecuentemente nominada como canónica para las personas que intentan usar shy se sorprenden de que no se comporta de la misma manera bash. Aquí hay un resumen rápido de malentendidos y dificultades comunes.

En primer lugar, debe entender qué esperar.

  • Si ejecuta su script con sh scriptname, o lo ejecuta con scriptnamey tiene #!/bin/shen la línea shebang , debe esperar el shcomportamiento POSIX .
  • Si ejecuta su script con bash scriptname, o lo ejecuta con scriptnamey 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 en sh(solo [que es más torpe y limitado).
  • sh no tiene matrices
  • Algunas palabras clave del golpe como local, source, function, shopt, let, declare, y selectno son portátiles a sh. (Algunas shimplementaciones admiten, por ejemplo local).
  • Bash tiene muchas extensiones de sintaxis C-estilo como el de tres argumentos 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 por shsobre los sistemas que sólo se adhieren a la corriente Especificación POSIX, y probablemente no lo hará por algún tiempo).
  • Bash apoya <<<'here strings'.
  • Bash tiene *.{png,jpg}y {0..12}abrazadera de expansión.
  • ~se refiere $HOMEsolo a Bash (y más generalmente ~usernameal directorio de inicio de username).Esto está en POSIX, pero puede faltar en algunas /bin/shimplementaciones anteriores a POSIX .
  • Bash tiene sustitución de proceso con <(cmd)y >(cmd).
  • Bash tiene estilo Csh alias conveniencia del cambio de dirección como &|de 2>&1 |y &>para> ... 2>&1
  • Bash admite coprocesos con <>redireccionamiento.
  • Bash cuenta con un rico conjunto de expansiones de parámetros no estándar expandidos, tales como ${substring:1:2}, ${variable/pattern/replacement}, la conversión caso, etc.
  • Bash ha ampliado significativamente las instalaciones para la aritmética de shell (aunque todavía no tiene soporte de punto flotante). Existe una $[expression]sintaxis heredada obsoleta que, sin embargo, debe reemplazarse con la $((expression))sintaxis aritmética POSIX . (Sin shembargo, algunas implementaciones anteriores a POSIX pueden no ser compatibles).
  • Variables de magia como $RANDOM, $SECONDS, $PIPESTATUS[@]y $FUNCNAMEson extensiones del golpe.
  • Las diferencias sintácticas como export variable=valuey [ "x" == "y" ]que no son portátiles ( export variabledeben estar separadas de la asignación de variables, y la comparación de cadenas portátil en [ ... ]usa un solo signo igual).
  • Muchas, muchas extensiones de solo Bash 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 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/bashlínea shebang, pero luego usarla sh scriptnamepara 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 que shno es una buena manera de verificar si su script es correctamente portátil para ash/ dash/ POSIX sho variantes como Heirloomsh

tripleee
fuente
2
Básicamente, la versión TL; DR es la respuesta de And .
tripleee
44
shellcheck.net era todo lo que necesitaba. muchas gracias.
Josh Habdas
FWIW, export variable=valuees 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.
Roman Cheplyaka
54

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:

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

ingrese la descripción de la imagen aquí

Premraj
fuente
3
No lo entiendo Has mencionado "Bash es un superconjunto de sh" y "Bash es una subclase de sh", ¿no son afirmaciones contrarias? ¿Puedes por favor aclarar?
Keerthana Prabhakaran
11
Creo que esto está tratando de decir que Bash hereda de sh(por lo que es una "subclase" en el sentido OOP) y lo extiende (también tiene un superconjunto de la funcionalidad).
tripleee
53

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:

                                     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 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

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.
SriniV
fuente
Su tabla no es útil para mí, ya que trata de comparar las características de Bourne Shell y las características de ksh de antes de 1988. Si realmente hace una tabla para 1988, necesitaría eliminar la mayoría de los otros shells de esa tabla, incluido bash , sh y rc. ¿Podría explicar de dónde obtuvo los valores para su tabla?
schily
1
Permítanme dar algunas sugerencias: el Control de trabajos se agregó a Bourne Shell en 1989 y Bourne Shell se convirtió en OpenSource en 2005. El shell Korn tiene sustitución de procesos desde al menos 1988 y es OpenSource desde 1997. Por cierto: sus declaraciones con respecto a $ ENV no son correctos, $ ENV solo se lee / ejecuta para shells interactivos.
schily
3
@schily Esta publicación ha sido capturada de cs.virginia.edu/helpnet/Computer_OS/unix/shells/shelldiff.html
SriniV el
@schily Si cree que es incorrecto en alguna parte, no dude en editarlo adecuadamente.
SriniV
8
Según lo expuesto de manera acertada, parecería que sería mejor eliminar esta respuesta, ya que es esencialmente fraudulenta, y OP realmente no examinó la información que pegó.
danno
24

TERMINAL

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

CÁSCARA

  • Es un programa que se ejecuta en la terminal.
  • Shell es tanto un intérprete de comandos como un lenguaje de programación
  • Shell es simplemente un procesador de macro que ejecuta comandos.
  • El procesador de macros significa funcionalidad donde el texto y los símbolos se expanden para crear expresiones más grandes.

SH vs. GOLPETAZO

SH

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

GOLPETAZO

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

MATERIAL DE REFERENCIA:

SHELL gnu.org:

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

Un shell de Unix es tanto un intérprete de comandos como un lenguaje de programación. Como intérprete de comandos, el shell proporciona la interfaz de usuario para el amplio conjunto de utilidades GNU. Las características del lenguaje de programación permiten combinar estas utilidades. Los archivos que contienen comandos pueden crearse y convertirse en comandos en sí mismos. 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 forma interactiva o no interactiva. En modo interactivo, aceptan entradas escritas desde el teclado. Al ejecutar de forma no interactiva, los shells ejecutan comandos leídos de un archivo.

Un shell permite la ejecución de comandos GNU, tanto sincrónica como asincrónicamente. El shell espera a que se completen los comandos síncronos antes de aceptar más entradas; Los comandos asincrónicos 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 salida de esos comandos. Además, el shell permite controlar el contenido de los entornos de los comandos.

Los shells también proporcionan un pequeño conjunto de comandos integrados (incorporados) que implementan funcionalidades imposibles o inconvenientes de obtener a través de utilidades separadas . Por ejemplo, cd, break, continue y exec no se pueden implementar fuera del shell porque manipulan directamente el shell. El historial, getopts, kill o pwd builtins, entre otros, podrían implementarse en utilidades separadas, pero son más convenientes de usar como comandos incorporados. Todas las conchas incorporadas se describen en secciones posteriores.

Si bien la ejecución de comandos es esencial, la mayor parte del poder (y la complejidad) de los shells se debe a sus lenguajes de programación integrados. Al igual que cualquier lenguaje de alto nivel, el shell proporciona variables, construcciones de control de flujo, citas y funciones.

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

BASH gnu.org:

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

Bash es en gran medida compatible con sh e incorpora características útiles de Korn shell ksh y C shell csh. Su objetivo es ser una implementación conforme de la parte 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 programación.

Mientras que el sistema operativo GNU proporciona otros shells, incluida una versión de csh, Bash es el shell predeterminado . Al igual que otro software 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 las plataformas MS-DOS, OS / 2 y Windows.

Timothy LJ Stewart
fuente
14

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.

Andrzej Pronobis
fuente
Esto es básicamente a lo que mi respuesta hasta ahora realmente se reduce. +1
tripleee
8

Son casi idénticos pero bashtienen más características : shes (más o menos) un subconjunto más antiguo bash.

sha menudo significa el original Bourne shell, que es anterior a bash( 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/sho usan el shshell generalmente lo hacen por compatibilidad con versiones anteriores. Cualquier sistema operativo unix / linux tendrá un shshell. En Ubuntu a shmenudo se invoca dashy en MacOS es una versión especial de POSIX bash. Estas carcasas pueden ser preferibles para el comportamiento conforme a los estándares, la velocidad o la compatibilidad con versiones anteriores.

bashes más nuevo que el original sh, agrega más funciones y busca ser compatible con versiones anteriores sh. En teoría, los shprogramas deberían ejecutarse bash. bashestá 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 a zshCatalina (10.15). FreeBSD, por defecto, no viene con bashinstalado.

Ryan Taylor
fuente
shes muy anterior a POSIX. En estos días, esperaría que cualquiera shque 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.
tripleee
Eliminé las cosas sobre POSIX para hacerlo menos confuso
Ryan Taylor
3

/bin/shpuede o no invocar el mismo programa que /bin/bash.

shadmite 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. Escriba info bashy 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 .

Keith Thompson
fuente
shsolo le da un shell POSIX, si tiene la PATHconfiguración correcta en su shell actual. No hay un nombre de RUTA definido que le proporcione un shell POSIX.
schily
Durante mucho tiempo, shno era necesariamente incluso dándole un shell POSIX, en Solaris, por ejemplo.
tripleee
3

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.

Gopika BG
fuente
0

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

Raihanhbh
fuente
Para comprender POSIX, lea la respuesta de Alex. Consulte: stackoverflow.com/a/1780614/1261003
Raihanhbh
No estoy tratando de entender POSIX. Estoy revisando su respuesta y, como tal, necesito verla, su respuesta agrega valor. No creo que lo haga.
Scratte
Creo que estas pequeñas aclaraciones ayudarían a un novato a comprender la jerga utilizada en las discusiones anteriores más cómodamente. @Scratte
Raihanhbh
-1

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.

rashedcs
fuente
Hubo un proyectil anterior de Ken Thompson. El shell Bourne se introdujo oficialmente en v7 Unix (1979).
tripleee