¿Bash scripting es lo mismo que shell scripting?

58

Soy muy nuevo en Ubuntu. Escucho a la gente decir "scripting de shell", "scripting de bash".

Me pregunto si son iguales. ¿O son diferentes?

hombre murciélago
fuente
Hay una respuesta útil en SO
Sr. Pei

Respuestas:

55

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.

Hilton Shumway
fuente
1
¿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 .


fuente
2
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.

fromnaboo
fuente
2
$ 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í:

arielf
fuente
2

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.

En Debian / Ubuntu específicamente, bin/shhay un enlace simbólico que apunta a bin/dashque 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

La regla general sería:

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:

https://www.shellcheck.net/

http://mywiki.wooledge.org/Bashism

Ola
fuente
1
Muy buena respuesta, +1. ¡Bienvenido a AskUbuntu!
Sergiy Kolodyazhnyy
1
Con respecto a Dash como / bin / sh en ubuntu, hay un artículo para eso que también puede citar. Y también hay askubuntu.com/q/976485/295286
Sergiy Kolodyazhnyy