Soy muy nuevo en Ubuntu. Escucho a la gente decir "scripting de shell", "scripting de bash".
Me pregunto si son iguales. ¿O son diferentes?
Soy muy nuevo en Ubuntu. Escucho a la gente decir "scripting de shell", "scripting de bash".
Me pregunto si son iguales. ¿O son diferentes?
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.
/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 los sh
que se pueden usar para ejecutar un script; un script destinado a ser ejecutado por Bash
debe etiquetarse como un Bash
script. 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 sh
y bash
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 consideran dash
como su sh
shell (en sh
realidad 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 . Bash
significa Bourne Again SHell y fue desarrollado más tarde por Brian Fox y extendió mucho el original sh
. El desarrollo de Fox y otros Bash
fue una parte importante del proyecto GNU. Vea esta gran discusión de la historia de Bash
para más información.
Es importante tener en cuenta que tanto sh
y Bash
, como se usa en Ubuntu y otras distribuciones, son POSIX
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 esos POSIX
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 como bash
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 con sh
o 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 bash
comandos funcionarán sh
, mientras que la mayoría de los sh
comandos funcionarán bash
. 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 en Bash
O'Reilly y lo publica. La Guía para principiantes de Bash también realiza una buena introducción .
Hay varios proyectiles disponibles para Ubuntu, como bash
, zsh
, ksh
, tcsh
y 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 bash
scripting, está usando un shell, pero cuando alguien habla de scripting de shell, no está usando per se bash
. Pero como bash
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.
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 29 11:53 /bin/sh -> dash*
$ ls -l /bin/dash
-rwxr-xr-x 1 root root 109768 Mar 29 11:53 /bin/dash*
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 955024 Apr 3 08: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'.
Leer más aquí:
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
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 a bin/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-bash
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
.
Estándar POSIX.1-2017: http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html
Si POSIX no define un comando u opción, entonces no lo coloque en un
#! /bin/sh
script en primer lugar.
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: