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
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
/bine descobri queshé um link simbólico paradashem vez debash. 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
bashedash? - 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 emksh,ksh93e 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
$SHELLnão é usada para decidir qual shell interpretará o./executableroteiro. Ele não ' necessariamente diz qual é o shell atual.