Por que obtenho diferentes saídas em 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 executar com sh file.sh:

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

Saída no caso de executar 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 o shell, ele não deveria rodar com o bash, se eu uso sh file.shou bash file.sh?

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

rishiag
fonte

Respostas:

16

sh, a concha Bourne, é antiga . Seu comportamento é especificado pelo padrão POSIX . Se você deseja um novo comportamento, use basho shell Bourne Again, que adiciona novos recursos o tempo todo. Em muitos sistemas, shé justo bashe bashativa um modo de compatibilidade quando executado sob esse nome. No Ubuntu, shé dasho shell Debian Almquist.

A expansão de chaves é um recurso relativamente novo e também não estaria disponível em versões anteriores. Certamente não deveria estar presente sh.

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

./myscript.sh

Eu posso dar um script qualquer shebang e ainda tê-lo aberto no Python executando:

python myscript.sh

Veja estas excelentes perguntas sobre Unix e Linux:

muru
fonte
5

SH é estúpido. Não pode fazer nada.

Ele conhece apenas os comandos mais básicos. Não faz mais nada.

Ele não pode entender {1..99} como um valor numérico. Entende isso como uma corda.

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

O Bash é recomendado, pois ele pode fazer tudo o que a SH pode, além dos mais novos em personalização e recursos poderosos.

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

Kaz Wolfe
fonte
6
" Ele deve ser um prompt de emergência para as circunstâncias do DIRE. " dash, Que, como você diz shno Ubuntu, não está presente principalmente "como um prompt de emergência para as circunstâncias do DIRE", mas para que o sistema possa executar e iniciar rapidamente . Desta forma, dashé bem adequado para uso em um sistema operacional moderno, mas o que é bem adequado para é como um low-profile, shell rápido para scripting - particularmente, a execução de scripts do sistema durante a inicialização um grande, complexo, sistema operacional moderno, com o mínimo sobrecarga de desempenho.
Eliah Kagan 30/08/14
@EliahKagan Você realmente só usa SH se algo terrivelmente errado.
Kaz Wolfe
1
Você usa shconstantemente, e particularmente intensamente, como o Ubuntu inicializa. É importante principalmente para o uso de scripts automatizados, e esse é um caso de uso muito importante no Ubuntu. (Se você fosse para remover o /bin/shlink simbólico - de modo que, com efeito, não haveria "SH" - as coisas iriam correr terrivelmente errado: Ubuntu não poderia iniciar em um estado utilizável.)
Elias Kagan
@EliahKagan Quando você usou o SH pela última vez como seu terminal preferido? Eu sei que você o usa para script, mas quando você realmente o usa no modo interativo?
Kaz Wolfe
2
Ontem, para verificar o quão portátil era um comando. Mas seu argumento de que o uso interativo do traço é raro é válido. (E, de qualquer forma, o contexto do meu uso interativo ainda era orientado a scripts.) ... Mas "uso" não significa "uso interativo" e, mais importante, o caso de uso nesta pergunta não é interativo!
Eliah Kagan