¿Por qué obtengo diferentes salidas en caso de sh y bash?

8

Tengo el siguiente script simple:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {1..99..2}
do
        echo $i
done

Salida en caso de que corra con sh file.sh:

Bash version ...
{1..99..2}

Salida en caso de que corra con bash file.sh:

Bash version 4.2.25(1)-release...
1
3
5
.
.
.
99

Tengo dos consultas:

  1. Si he escrito una línea shabang que especifica shell, ¿no debería ejecutarse con bash si uso sh file.sho bash file.sh?

  2. Entiendo que $BASH_VERSIONsh no lo reconoce, pero ¿cuál es el problema con for loop? ¿Por qué no se imprimen los números?

rishiag
fuente

Respuestas:

16

sh, la cáscara de Bourne, es vieja . Su comportamiento está especificado por el estándar POSIX . Si desea un nuevo comportamiento, utilice bashel shell Bourne Again, que le agrega nuevas funciones todo el tiempo. En muchos sistemas, shes justo bashy bashactiva un modo de compatibilidad cuando se ejecuta con ese nombre. En Ubuntu, shes dashel shell Debian Almquist.

La expansión de llaves es una característica relativamente nueva , y no estaría disponible también en bashes más antiguos. Ciertamente no debería estar adentro sh.

La línea shebang solo se respeta si llama al script como ejecutable:

./myscript.sh

Puedo dar un script a cualquier shebang y aún tenerlo abierto en Python ejecutando:

python myscript.sh

Vea estas excelentes preguntas sobre Unix y Linux:

muru
fuente
5

SH es estúpido. No puede hacer nada.

Solo conoce los comandos más básicos. No hace nada más.

No puede entender {1..99} como un valor numérico. Lo entiende como una cuerda.

SH / Dash no está desarrollado. Está destinado a ser un aviso de emergencia para circunstancias DIRE (en modo interactivo. De lo contrario, es algo realmente bueno para los scripts).

Se recomienda Bash, ya que puede hacer todo lo que SH puede hacer, así como lo último en personalización y funciones potentes.

En respuesta al n. ° 1, #!solo se analiza si se llama directamente al programa. (como en ./program.sh)

Kaz Wolfe
fuente
66
" Está destinado a ser un aviso de emergencia para las circunstancias de DIRE " dash, que como usted dice shen Ubuntu, no está presente principalmente "para ser un aviso de emergencia para las circunstancias de DIRE", sino para que el sistema pueda ejecutarse y comenzar rápidamente . De esta manera, dashes muy adecuado para su uso en un sistema operativo moderno, pero lo que está bien adaptado para es como un bajo perfil, cáscara rápido para scripting - en particular, la ejecución de scripts del sistema al iniciar un grande, complejo, sistema operativo moderno, con un mínimo Rendimiento sobrecarga.
Eliah Kagan
@EliahKagan Realmente solo usas SH si algo cuando está terriblemente mal.
Kaz Wolfe
1
Usas shbastante constantemente, y particularmente intensivamente como arranca Ubuntu. Es principalmente importante para sus usos automáticos de secuencias de comandos, y ese es un caso de uso muy importante en Ubuntu. (Si tuviera que eliminar el /bin/shenlace simbólico, de modo que, en efecto, no hubiera "SH", las cosas saldrían terriblemente mal: Ubuntu no podría arrancar en un estado utilizable).
Eliah Kagan
@EliahKagan ¿Cuándo usaste SH por última vez como tu terminal preferida? Sé que lo usas para script, pero ¿cuándo lo usas en modo interactivo?
Kaz Wolfe
2
Ayer, para comprobar qué tan portátil era un comando. Pero su argumento de que el uso interactivo del tablero es raro es válido. (Y de todos modos, el contexto de mi uso interactivo todavía estaba orientado a los scripts). Pero "uso" no significa "uso interactivo", y lo que es más importante, ¡ el caso de uso en esta pregunta no es interactivo!
Eliah Kagan