script - bash shell
Diferencia entre sh y bash (10)
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 de sh
(ver más abajo).
Debido a que sh
es una especificación, no una implementación, /bin/sh
es un enlace simbólico (o un enlace físico) a una implementación real en la mayoría de los sistemas POSIX.
Que es bash
bash
comenzó como una implementación compatible con sh
(aunque es anterior a la norma POSIX de algunos años), pero con 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 bash
no es un shell POSIX válido. Más bien, es un dialecto del lenguaje de shell POSIX.
bash
admite un conmutador --posix
, 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/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
ni siquiera existen) son:
- Los sistemas modernos de Debian y Ubuntu, que tienen un enlace simbólico de
dash
por defecto; - Busybox , que generalmente se ejecuta durante el tiempo de arranque del sistema Linux como parte de
initramfs
. Utiliza la implementación del shellash
. - BSDs, y en general cualquier sistema que no sea Linux. OpenBSD usa
pdksh
, un descendiente del shell Korn. Sh de FreeBSD es un descendiente del shell original de UNIX Bourne. Solaris tiene su propiosh
que durante mucho tiempo no era compatible con POSIX; una implementación gratuita está disponible desde el proyecto Heirloom .
¿Cómo puedes saber qué puntos /bin/sh
apunta en tu 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 manera portable 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, la bandera -L
cubre los enlaces simbólicos y los enlaces físicos, pero la desventaja de este método es que no es portátil: POSIX no requiere find
para admitir la opción -samefile
, aunque tanto GNU find como FreeBSD find lo admiten.
Línea de Shebang
En última instancia, depende de usted decidir cuál usar, escribiendo la línea «shebang».
P.ej
#!/bin/sh
usará sh
(y cualquier cosa que suceda para señalar),
#!/bin/bash
usará /bin/bash
si está disponible (y falla 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 scripts, prefiero sh
por las siguientes razones:
- esta 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 tengansh
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 de ámbito y matrices. Plain sh
es un lenguaje de programación muy minimalista.
Al escribir programas 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
?
El sistema operativo Linux ofrece diferentes tipos de shell. Aunque los shells tienen muchos comandos en común, cada tipo tiene características únicas. Vamos a estudiar diferentes tipos de conchas de uso general.
Sh shell:
Sh shell también se conoce como Bourne Shell. Sh shell es la primera shell desarrollada para computadoras Unix por Stephen Bourne en los Laboratorios Bell 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 Bash). Bash Shell puede ejecutar la gran mayoría de los scripts de shell Sh sin modificaciones y también proporciona la función de edición de línea de comandos.
Esta pregunta ha sido frecuentemente nominada como canónica para las personas que intentan usar sh
y se sorprenden de que no se comporte como bash
. Aquí hay un rápido resumen de malentendidos y dificultades comunes.
En primer lugar, debe entender qué esperar.
- Si ejecuta su script con
sh scriptname
, o si lo ejecuta conscriptname
y tiene#!/bin/sh
en la línea de shebang , debe esperar el comportamiento de POSIXsh
. - Si ejecuta su script con
bash scriptname
, o si lo ejecuta conscriptname
y tiene#!/bin/bash
(o el equivalente local) en la línea de shebang, debe esperar un comportamiento Bash.
Por lo general, 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 de las fuentes comunes de confusión incluyen:
-
[[
no está disponible ensh
(solo[
que es más torpe y limitado). -
sh
no tiene matrices. - Algunas palabras clave de Bash como
local
,function
yselect
no son portátiles parash
. - Bash tiene muchas extensiones de sintaxis de estilo C como
$''string/nwith/tC/aescapes''
y los tres argumentosfor((i=0;i<=3;i++))
buclefor((i=0;i<=3;i++))
bucle,+=
asignación de incremento, etc. - Bash soporta
<<<''here strings''
. - Bash tiene
*.{png,jpg}
y{0..9}
expansión de corsé. ~
refiere a$HOME
solo en Bash (y más generalmente~username
de~username
al directorio principal deusername
deusername
)./bin/sh
.- Bash tiene sustitución de proceso con
<(cmd)
y>(cmd)
. - Bash soporta coprocesos con redireccionamiento
<>
. - Bash ha ampliado significativamente las instalaciones para la aritmética de shell (aunque todavía no es compatible con punto flotante) y la manipulación de subcadenas variables con
${substring:1:2}
,${variable/pattern/replacement}
, conversión de casos, etc. - Muchas, muchas extensiones solo de 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, este es un listado abreviado. Consulte el manual de referencia para obtener información completa, y mywiki.wooledge.org/Bashism para muchas soluciones adecuadas; y / o pruebe con http://shellcheck.net/ que advierte sobre muchas funciones solo para Bash.
Un error común es tener una línea #!/bin/bash
shebang, pero sin embargo, usar sh scriptname
para ejecutar el script. Básicamente, esto deshabilita cualquier funcionalidad de solo Bash, por lo que obtienes errores de sintaxis, por ejemplo, al tratar de usar arreglos.
Desafortunadamente, Bash no avisará cuando intente utilizar estas construcciones cuando se invoque como sh
. Tampoco desactiva completamente toda la funcionalidad de solo Bash, por lo que ejecutar Bash invocando como sh
no es una buena manera de verificar si su script es adecuadamente portátil para ash
/ dash
/ POSIX sh
o variantes como Heirloom sh
Otras respuestas en general señalaron la diferencia entre Bash y un estándar de shell POSIX. Sin embargo, al escribir scripts de shell portátiles y estar acostumbrado a la sintaxis de 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 predeterminado del sistema y se puede encontrar aquí: https://wiki.ubuntu.com/DashAsBinSh
Además, hay una gran herramienta llamada checkbashisms que comprueba si hay bashismos en su script y es útil cuando quiere asegurarse de que su script sea portátil.
Publicar desde UNIX.COM
Características de shell
Esta tabla a continuación enumera la mayoría de las funciones que creo que harían que elijas un shell sobre otro. No pretende ser una lista definitiva y no incluye todas las características posibles para cada shell posible. Solo se considera que una característica está en un shell si está en la versión que viene con el sistema operativo, o si está disponible 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 tcsh o su propio shell C mejorado en su lugar (no siempre hacen que sea 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 característica Y se puede hacer usando este shell.
La característica N no está presente en el shell.
F La característica solo se puede hacer usando el mecanismo de la función 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.
/bin/sh
puede o no puede invocar el mismo programa que /bin/bash
.
sh
admite al menos las funciones sh (asumiendo una implementación correcta). Puede soportar extensiones también.
bash
, el "Bourne Again Shell", implementa las funciones requeridas para las extensiones específicas de sh plus de 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 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 .
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 de bash shebang en casi todos los casos, ya que es bastante ubicuo en las plataformas modernas.
NB: en algunos entornos, sh
es bash
. Compruebe sh --version
.
Bash (bash) es uno de los muchos depósitos Unix disponibles (aunque los más utilizados). Bash significa "Bourne Again SHell", y es un reemplazo / mejora de la carcasa original de Bourne (sh).
Los scripts de shell son scripts en cualquier shell, mientras que los scripts de Bash son scripts específicamente para Bash.
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 Unix / Unix. Proporciona algunos comandos incorporados. En el lenguaje de scripting denotamos intérprete como #!/bin/sh
. Fue uno de los más soportados por otros shells como bash (free / open), kash (no free).
Bash ( B ourne a gain s hell) es un reemplazo de shell para el shell Bourne. Bash es superconjunto de sh. Bash apoya 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 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 la sh.
TERMINAL
- programa (s) que levanta una ventana
- 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 procesador de macros 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 shell especifico
- un intérprete de comandos y un lenguaje de programación
- Predecesor de BASH
GOLPETAZO
- (Bourne Again Shell)
- Es un shell especifico
- 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 procesador de macros que ejecuta comandos. El término procesador de macros significa funcionalidad donde 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 al amplio conjunto de utilidades de GNU. Las características del lenguaje de programación permiten combinar estas utilidades. 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, permitiendo a los usuarios o grupos establecer entornos personalizados para automatizar sus tareas comunes.
Los depósitos pueden ser utilizados de forma interactiva o no interactiva. En modo interactivo, aceptan la entrada escrita desde el teclado. Cuando se ejecuta de forma no interactiva, los shells ejecutan los comandos leídos desde un archivo.
Un shell permite la ejecución de comandos GNU, tanto de forma síncrona como asíncrona. El shell espera a que se completen los comandos síncronos antes de aceptar más entrada; Los comandos asíncronos continúan ejecutándose en paralelo con el shell mientras lee y ejecuta comandos adicionales. Las construcciones de redireccionamiento permiten un control preciso de la entrada y salida de esos comandos. Además, el shell permite el control sobre el contenido de los entornos de comandos.
Shells también proporciona un pequeño conjunto de comandos incorporados (builtins) 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. La historia, getopts, kill o pwd builtins, entre otros, podrían implementarse en utilidades separadas, pero son más convenientes de usar como comandos incorporados. Todos los shell construidos 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, presupuestos y funciones.
Las carcasas ofrecen características diseñadas específicamente para uso interactivo en lugar de aumentar el lenguaje de programación. Estas funciones 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 un acrónimo de ''Bourne-Again SHell'', un juego de palabras de Stephen Bourne, el autor del antepasado directo del actual shell de Unix, que apareció en la versión de investigación de Unix de los Laboratorios Bell de la Séptima Edición.
Bash es en gran parte compatible con sh e incorpora características útiles de Korn shell ksh y C shell csh. Pretende ser una implementación conforme de la parte del Shell y las Herramientas POSIX de IEEE de la especificación POSIX de IEEE (Estándar IEEE 1003.1). Ofrece mejoras funcionales sobre sh para uso tanto interactivo como de programación.
Si bien 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 en algunos otros sistemas operativos; existen puertos con soporte independiente para las plataformas MS-DOS, OS / 2 y Windows.