Por que recebo saídas diferentes no caso de sh e bash?

8

Eu tenho o seguinte script simples:

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

Saída no caso de eu correr com sh file.sh :

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

Saída no caso de eu correr com bash file.sh :

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

Eu tenho duas consultas:

  1. Se eu escrevi uma linha shabang especificando shell, ela não deveria ser executada com bash se eu usar sh file.sh ou bash file.sh ?

  2. Eu entendo que $BASH_VERSION não é reconhecido por sh, mas qual é o problema com o loop for? Por que não está imprimindo os números?

por rishiag 30.08.2014 / 08:40

2 respostas

17

sh , o shell Bourne, é antigo . Seu comportamento é especificado pelo padrão POSIX . Se você quiser um novo comportamento, use bash , o shell Bourne Again, que recebe novos recursos a cada momento. Em muitos sistemas, sh é apenas bash e bash ativa um modo de compatibilidade quando executado com esse nome. No Ubuntu, sh é dash , o shell do Debian Almquist.

A expansão de chaves é relativamente nova nova funcionalidade e também não estaria disponível em programas mais antigos. Certamente não deveria estar em sh .

A linha shebang só é respeitada se você chamar o script como um executável:

./myscript.sh

Eu posso dar um script a qualquer coisa e ainda tê-lo aberto em Python executando:

python myscript.sh

Veja estas excelentes perguntas sobre o Unix & amp; Linux:

por muru 30.08.2014 / 08:44
5

SH é idiota. Não pode fazer nada.

Só conhece os comandos mais básicos. Não faz mais nada.

Não consegue entender {1..99} como um valor numérico. Entende isso como uma string.

SH / Dash não está desenvolvido. Ele deve ser um prompt de emergência para as circunstâncias da DIRE (no modo interativo. Caso contrário, é realmente uma boa coisa para o script).

O Bash é recomendado, pois pode fazer tudo o que o SH pode, bem como o mais novo em personalização e recursos poderosos.

Em resposta a # 1, o #! é analisado apenas se o programa for chamado diretamente. (como em, ./program.sh )

    
por Kaz Wolfe 30.08.2014 / 08:41