Qual é a diferença entre usar bash e sh para executar um script?

O bash e o sh executam um script de maneira diferente? Executei um script de shell com bash e sh, e obtive a mesma saída. Então, qual é a diferença?

Além disso, quando você apenas executa ./executable, ele usa bash ou sh?

Comentários

  • @Pandya A variável $SHELL não é usada para decidir qual shell interpretará o ./executable roteiro. Ele não ' necessariamente diz qual é o shell atual.
  • @jlliagre oh! OK. wiki.debian.org diz " SHELL = O shell atual. "
  • @Pandya, na verdade, deve ser " O shell de login do usuário ' s ". O shell atual pode ser diferente.

Resposta

Isso depende do sistema que você está executando. Muitos sistemas operacionais, especialmente os baseados em Linux, sh é um link para bash.

Nesse caso, há ainda existem algumas diferenças no comportamento em que bash tenta ser mais como o shell bourne tradicional quando chamado sh, mas ainda aceita a maioria dos basismos.

Em alguns outros sistemas operacionais, como os baseados em Debian, sh é fornecido por dash, não bash. Isso faz uma diferença muito maior, pois dash não suporta bashismos, sendo projetado para ser uma implementação de shell POSIX limpa.

Em sistemas operacionais proprietários, sh geralmente é fornecido por um ksh88 compatível com POSIX que, como dash, não implementa bashismos. No Solaris 10 e anteriores, dependendo de qual é o seu PATH, sh provavelmente será um shell Bourne legado, anterior ao POSIX.

Em qualquer caso, você provavelmente obteve a mesma saída com seu teste simplesmente porque seu script não estava usando nenhum bash comando, opção ou sintaxe específica.

Quando você executa ./executable, o shell que será executado depende essencialmente do conteúdo escrito no início do script .executable. Isso será bash se o shebang especificar:

#!/bin/bash .... 

Se não houver shebang e você chamar o script de um shell compatível com POSIX, o script deve ser tecnicamente executado pelo primeiro sh encontrado no PATH. Muitos interpretadores de shell como bash, dash e ksh estão se considerando POSIX, então o farão interpretar o script. Observe que a SHELL variável de ambiente não é usada aqui.

Comentários

  • Eu olhei em /bin e descobri que sh é um link simbólico para dash em vez de bash. Então, como eles funcionam da mesma forma? Não estava ' realmente executando nenhum comando de script bash, apenas comandos de terminal para usar outros pacotes ' ferramentas.
  • Se o seu script de shell está apenas chamando sequencialmente outros comandos, qualquer interpretador de shell o executará com o mesmo resultado. Nada inesperado aqui.
  • Isso não está ' t relacionado à pergunta, mas qual é exatamente a diferença entre bash e dash?
  • Ambos estão usando a sintaxe do shell Bourne. Como escrevi em minha resposta, dash é uma implementação limpa do padrão de shell POSIX. Por outro lado, bash é um shell com um grande número de extensões e recursos não padrão, alguns inspirados em ksh, ksh93 e outros shells, e alguns específicos do bash, conhecidos como bashisms. Existe uma ferramenta chamada checkbashisms que ajuda a identificar tudo o que não é estritamente portátil em um determinado script de shell.

Resposta

Sim, poderia ser, mas não precisa ser. Os dois shells não são iguais, mas os básicos são compatíveis. Verifique esta postagem para obter mais detalhes.

Você pode usar a seguinte linha em um script para verificar o interpretador usado:

ps h -p $$ -o args="" | cut -f1 -d" " 

Você pode especificar explicitamente o shell que deve ser usado quando o script é executado diretamente com a linha sheebang:

#!/bin/sh 

ou

#!/bin/bash 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *