Bash ( bash) es uno de los muchos shells de Unix disponibles (aunque los más utilizados). Bash significa " B ourne A gain SH ell", 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.
EDITAR: En realidad, el shell de secuencias de comandos predeterminado en Ubuntu es dash, mientras que el shell interactivo predeterminado (lo que obtienes si arrancas un terminal) es Bash. No obstante, los dos términos siguen siendo en su mayoría intercambiables.
¿Qué define a dash como el shell de scripting predeterminado?
wjandrea
1
@wjandrea El hecho de que /bin/shsea un enlace simbólico /bin/dashhace que el shell del sistema sea predeterminado , pero no es un shell de scripting predeterminado , es decir, no hay una regla escrita que absolutamente tengas que usar /bin/sh. Cuando uno lo usa /bin/shes principalmente por razones de portabilidad, cuando espera que su script se use en múltiples plataformas de sistema operativo tipo Unix, la mayoría de las cuales tienen un /bin/shshell Bourne-family compatible con POSIX.
Sergiy Kolodyazhnyy
29
Introducción
Los scripts de shell y Bashscripting no son lo mismo, ya que existen otros shells como los shque se pueden usar para ejecutar un script; un script destinado a ser ejecutado por Bashdebe etiquetarse como un Bashscript. Los términos a menudo se usan indistintamente porque Bash, con su funcionalidad extendida en comparación con sh, es el que se usa más comúnmente para ejecutar scripts de usuario en muchas distribuciones. Sin embargo, hay otras cubiertas tales como el Korn (ksh), C shell (csh)y el Z shell (zsh), pero no vamos a entrar en ellos aquí como una discusión de shy bashes más relevante para Ubuntu. Un gran artículo de IBM aquí entra en más detalles sobre la evolución de los shells en Linux y describe bien la arquitectura de shell y cómo difieren los shells.
Shell Scripting
Shfue el shell original de Unix desarrollado por Stephen Bourne; sin embargo, los sistemas basados en Debian y Ubuntu lo consideran dashcomo su shshell (en shrealidad está vinculado a dash). En Debian y Ubuntu, debido a la velocidad sh, se usa con más frecuencia para procedimientos críticos del sistema y para ejecutar scripts clave al inicio; para más detalles ver el wiki de Ubuntu . Bashsignifica Bourne Again SHell y fue desarrollado más tarde por Brian Fox y extendió mucho el original sh. El desarrollo de Fox y otros Bashfue una parte importante del proyecto GNU. Vea esta gran discusión de la historia de Bashpara más información.
Es importante tener en cuenta que tanto shy Bash, como se usa en Ubuntu y otras distribuciones, son POSIXcompatibles, lo que significa que se suscriben a una serie de estándares sobre cómo se ejecutan los comandos en el Shell. Esto es para garantizar que los resultados de los scripts utilizados en el sistema operativo se puedan predecir de manera confiable y que el comportamiento del shell se pueda mantener dentro de esos POSIXparámetros, ya que eso es particularmente importante para los desarrolladores. Para obtener más información sobre los estándares, consulte la documentación oficial .
A menudo, los scripts de shell tienen el sufijo .sh, a pesar de que están destinados a ejecutarse como bashscripts, y se encuentran #!/bin/bashen la parte superior del script. En realidad, no importa si el guión se llama script.sh o my.script , lo que importa es si la llamada al intérprete es /bin/sho /bin/bash. Los scripts de shell también se pueden invocar en la línea de comando con sho bash.
Sin embargo, es importante tener en cuenta que los resultados pueden ser diferentes dependiendo de qué intérprete se llame, ya que no todos los bashcomandos funcionarán sh, mientras que la mayoría de los shcomandos funcionarán bash. En general, la mayoría de los usuarios querrán usar /bin/bashsus scripts para poder aprovechar el conjunto de funciones ampliado; los scripts del sistema se pueden ejecutar /bin/shsi es necesario.
Recursos para scripts de Bash Shell
A veces es difícil encontrar recursos útiles en línea que sigan las buenas prácticas y que brinden consejos que le permitirán crear scripts útiles. Después man bash, algunos de los recursos más importantes son la wiki de Greg , los hackers de Bash y el reciente libro de Steve Parker sobre scripting de Shell que se centra principalmente en BashO'Reilly y lo publica. La Guía para principiantes de Bash también realiza una buena introducción .
Esta respuesta es en realidad superior a la mía (la respuesta aceptada), la mía llegó una semana antes que esta.
Hilton Shumway
4
Hay varios proyectiles disponibles para Ubuntu, como bash, zsh, ksh, tcshy csh.
Entonces, cada vez que alguien dice shell , está hablando de uno de esos. Sin embargo, esos proyectiles difieren un poco entre sí. Entonces, cuando alguien habla de bashscripting, está usando un shell, pero cuando alguien habla de scripting de shell, no está usando per se bash. Pero como bashse usa comúnmente en las secuencias de comandos para Ubuntu, generalmente lo es. Además, los diferentes caparazones son iguales en muchos aspectos, por lo que generalmente no importa.
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4Mar2911:53/bin/sh -> dash*
$ ls -l /bin/dash
-rwxr-xr-x 1 root root 109768Mar2911:53/bin/dash*
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 955024Apr308:58/bin/bash*
Esto muestra que 'sh' es un enlace simbólico a 'dash', y que / bin / bash, que es el shell interactivo predeterminado en Ubuntu, es un ejecutable que es casi 9 veces más grande que / bin / sh.
De hecho, 'man sh' (1590 líneas) vs 'man bash' (5459 líneas) revela que bash es un gran superconjunto de la tradicional 'sh'.
El script de shell se definiría como un script orientado a la portabilidad que puede ser ejecutado por un shell de sistema de sistemas operativos compatibles con POSIX. La sintaxis sería idéntica o similar con la sintaxis del lenguaje de scripting de shell definida por el estándar POSIX. Ese es el estándar para la mayoría de los sistemas operativos compatibles con POSIX, como Linux / Unix / * BSD, etc. POSIX es la base más común para la compatibilidad entre sistemas operativos.
Los diferentes sistemas operativos de los mencionados anteriormente implementan diferentes shells para el uso no interactivo (es decir, para ejecutar scripts del sistema o scripts que usan #! /bin/shshebang) que, además de implementar comandos y sintaxis POSIX, tienen sus propias extensiones o pueden ser despojados de algunas características menos útiles por motivos de rendimiento, pero el terreno POSIX permite un nivel muy alto de portabilidad de scripts diseñados para diferentes Oss compatibles con POSIX.
La mayoría de los sistemas operativos mencionados tienen un shell interactivo separado que generalmente es bash con todas las funciones . Bash es compatible con POSIX en gran parte, pero también tiene un gran conjunto de comandos adicionales y admite diferentes sintaxis. Iniciar Bash con la opción de línea de comandos --posix o ejecutar 'set -o posix' mientras Bash se está ejecutando hará que Bash se ajuste más al estándar POSIX cambiando el comportamiento para que coincida con el especificado por POSIX en áreas donde el Bash predeterminado difiere, ver: https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html
Especificador Shebang y rutas uniformes para ejecutables de shell en sistemas operativos tipo Unix
Gracias a las reglas uniformes sobre la colocación de ejecutables para shells (generalmente están en el directorio '/ bin /'), podemos tener reglas uniformes para crear scripts de shell, más específicamente, tenemos claro qué ruta poner en la expresión shebang para señalar Un ejecutable de shell adecuado para ejecutar el script. Los sistemas de archivos Unix / Linux / * BSD no admiten extensiones intrínsecamente, por lo que las extensiones de archivo sirven solo como una sugerencia adicional o para fines de indexación.
Debian / Ubuntu terminal interactivo es por defecto, como en muchos otros sistemas similares a Unix que operan, golpe, para lo cual el camino también es uniforme: /bin/bash.
Si POSIX no define un comando u opción, entonces no lo coloque en un
#! /bin/shscript en primer lugar.
Convierta su secuencia de comandos o compruebe si hay errores
Para convertir su script de bash a POSIX, es posible que desee verificar automáticamente si hay errores en su script de shell o ver qué cambios debe hacer en su script de bash para que sea compatible con POSIX:
Respuestas:
Bash (
bash
) es uno de los muchos shells de Unix disponibles (aunque los más utilizados). Bash significa " B ourne A gain SH ell", 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.
EDITAR: En realidad, el shell de secuencias de comandos predeterminado en Ubuntu es dash, mientras que el shell interactivo predeterminado (lo que obtienes si arrancas un terminal) es Bash. No obstante, los dos términos siguen siendo en su mayoría intercambiables.
fuente
/bin/sh
sea un enlace simbólico/bin/dash
hace que el shell del sistema sea predeterminado , pero no es un shell de scripting predeterminado , es decir, no hay una regla escrita que absolutamente tengas que usar/bin/sh
. Cuando uno lo usa/bin/sh
es principalmente por razones de portabilidad, cuando espera que su script se use en múltiples plataformas de sistema operativo tipo Unix, la mayoría de las cuales tienen un/bin/sh
shell Bourne-family compatible con POSIX.Introducción
Los scripts de shell y
Bash
scripting no son lo mismo, ya que existen otros shells como lossh
que se pueden usar para ejecutar un script; un script destinado a ser ejecutado porBash
debe etiquetarse como unBash
script. Los términos a menudo se usan indistintamente porqueBash
, con su funcionalidad extendida en comparación consh
, es el que se usa más comúnmente para ejecutar scripts de usuario en muchas distribuciones. Sin embargo, hay otras cubiertas tales como elKorn (ksh)
,C shell (csh)
y elZ shell (zsh)
, pero no vamos a entrar en ellos aquí como una discusión desh
ybash
es más relevante para Ubuntu. Un gran artículo de IBM aquí entra en más detalles sobre la evolución de los shells en Linux y describe bien la arquitectura de shell y cómo difieren los shells.Shell Scripting
Sh
fue el shell original de Unix desarrollado por Stephen Bourne; sin embargo, los sistemas basados en Debian y Ubuntu lo considerandash
como sush
shell (ensh
realidad está vinculado adash
). En Debian y Ubuntu, debido a la velocidadsh
, se usa con más frecuencia para procedimientos críticos del sistema y para ejecutar scripts clave al inicio; para más detalles ver el wiki de Ubuntu .Bash
significa Bourne Again SHell y fue desarrollado más tarde por Brian Fox y extendió mucho el originalsh
. El desarrollo de Fox y otrosBash
fue una parte importante del proyecto GNU. Vea esta gran discusión de la historia deBash
para más información.Es importante tener en cuenta que tanto
sh
yBash
, como se usa en Ubuntu y otras distribuciones, sonPOSIX
compatibles, lo que significa que se suscriben a una serie de estándares sobre cómo se ejecutan los comandos en el Shell. Esto es para garantizar que los resultados de los scripts utilizados en el sistema operativo se puedan predecir de manera confiable y que el comportamiento del shell se pueda mantener dentro de esosPOSIX
parámetros, ya que eso es particularmente importante para los desarrolladores. Para obtener más información sobre los estándares, consulte la documentación oficial .A menudo, los scripts de shell tienen el sufijo
.sh
, a pesar de que están destinados a ejecutarse comobash
scripts, y se encuentran#!/bin/bash
en la parte superior del script. En realidad, no importa si el guión se llama script.sh o my.script , lo que importa es si la llamada al intérprete es/bin/sh
o/bin/bash
. Los scripts de shell también se pueden invocar en la línea de comando consh
obash
.Sin embargo, es importante tener en cuenta que los resultados pueden ser diferentes dependiendo de qué intérprete se llame, ya que no todos los
bash
comandos funcionaránsh
, mientras que la mayoría de lossh
comandos funcionaránbash
. En general, la mayoría de los usuarios querrán usar/bin/bash
sus scripts para poder aprovechar el conjunto de funciones ampliado; los scripts del sistema se pueden ejecutar/bin/sh
si es necesario.Recursos para scripts de Bash Shell
A veces es difícil encontrar recursos útiles en línea que sigan las buenas prácticas y que brinden consejos que le permitirán crear scripts útiles. Después
man bash
, algunos de los recursos más importantes son la wiki de Greg , los hackers de Bash y el reciente libro de Steve Parker sobre scripting de Shell que se centra principalmente enBash
O'Reilly y lo publica. La Guía para principiantes de Bash también realiza una buena introducción .fuente
Hay varios proyectiles disponibles para Ubuntu, como
bash
,zsh
,ksh
,tcsh
ycsh
.Entonces, cada vez que alguien dice shell , está hablando de uno de esos. Sin embargo, esos proyectiles difieren un poco entre sí. Entonces, cuando alguien habla de
bash
scripting, está usando un shell, pero cuando alguien habla de scripting de shell, no está usando per sebash
. Pero comobash
se usa comúnmente en las secuencias de comandos para Ubuntu, generalmente lo es. Además, los diferentes caparazones son iguales en muchos aspectos, por lo que generalmente no importa.fuente
Esto muestra que 'sh' es un enlace simbólico a 'dash', y que / bin / bash, que es el shell interactivo predeterminado en Ubuntu, es un ejecutable que es casi 9 veces más grande que / bin / sh.
De hecho, 'man sh' (1590 líneas) vs 'man bash' (5459 líneas) revela que bash es un gran superconjunto de la tradicional 'sh'.
Leer más aquí:
fuente
El script de shell se definiría como un script orientado a la portabilidad que puede ser ejecutado por un shell de sistema de sistemas operativos compatibles con POSIX. La sintaxis sería idéntica o similar con la sintaxis del lenguaje de scripting de shell definida por el estándar POSIX. Ese es el estándar para la mayoría de los sistemas operativos compatibles con POSIX, como Linux / Unix / * BSD, etc. POSIX es la base más común para la compatibilidad entre sistemas operativos.
Los diferentes sistemas operativos de los mencionados anteriormente implementan diferentes shells para el uso no interactivo (es decir, para ejecutar scripts del sistema o scripts que usan
#! /bin/sh
shebang) que, además de implementar comandos y sintaxis POSIX, tienen sus propias extensiones o pueden ser despojados de algunas características menos útiles por motivos de rendimiento, pero el terreno POSIX permite un nivel muy alto de portabilidad de scripts diseñados para diferentes Oss compatibles con POSIX.La mayoría de los sistemas operativos mencionados tienen un shell interactivo separado que generalmente es bash con todas las funciones . Bash es compatible con POSIX en gran parte, pero también tiene un gran conjunto de comandos adicionales y admite diferentes sintaxis. Iniciar Bash con la opción de línea de comandos --posix o ejecutar 'set -o posix' mientras Bash se está ejecutando hará que Bash se ajuste más al estándar POSIX cambiando el comportamiento para que coincida con el especificado por POSIX en áreas donde el Bash predeterminado difiere, ver: https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html
Especificador Shebang y rutas uniformes para ejecutables de shell en sistemas operativos tipo Unix
Gracias a las reglas uniformes sobre la colocación de ejecutables para shells (generalmente están en el directorio '/ bin /'), podemos tener reglas uniformes para crear scripts de shell, más específicamente, tenemos claro qué ruta poner en la expresión shebang para señalar Un ejecutable de shell adecuado para ejecutar el script. Los sistemas de archivos Unix / Linux / * BSD no admiten extensiones intrínsecamente, por lo que las extensiones de archivo sirven solo como una sugerencia adicional o para fines de indexación.
En Debian / Ubuntu específicamente,
bin/sh
hay un enlace simbólico que apunta abin/dash
que es un ejecutable de un shell de tablero . Eso hace que dash sea el shell del sistema, que se estima que es 4 veces más rápido y tiene un tamaño ~ 1/10 que el bash más funcional. fuente: https://unix.stackexchange.com/questions/148035/is-dash-or-some-other-shell-faster-than-bashDebian / Ubuntu terminal interactivo es por defecto, como en muchos otros sistemas similares a Unix que operan, golpe, para lo cual el camino también es uniforme:
/bin/bash
.Estándar POSIX.1-2017: http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html
La regla general sería:
Convierta su secuencia de comandos o compruebe si hay errores
Para convertir su script de bash a POSIX, es posible que desee verificar automáticamente si hay errores en su script de shell o ver qué cambios debe hacer en su script de bash para que sea compatible con POSIX:
https://www.shellcheck.net/
http://mywiki.wooledge.org/Bashism
fuente