Diferença entre sh e bash

Ao escrever programas shell, geralmente usamos /bin/sh e /bin/bash . Eu costumo usar bash , mas não sei qual é a diferença entre eles.

Qual a principal diferença entre bash e sh ?

O que precisamos saber ao programar em bash and sh ?

O que é sh

sh (ou o Shell Command Language) é uma linguagem de programação descrita pelo padrão POSIX . Tem muitas implementações ( ksh88 , dash , …). bash também pode ser considerado uma implementação do sh (veja abaixo).

Como sh é uma especificação, não uma implementação, /bin/sh é um link simbólico (ou link físico) para uma implementação real na maioria dos sistemas POSIX.

O que é bash

bash começou como uma implementação compatível com sh (embora anteceda o padrão POSIX em alguns anos), mas com o passar do tempo adquiriu muitas extensões. Muitas dessas extensões podem alterar o comportamento de scripts de shell POSIX válidos, portanto, por si só o bash não é um shell POSIX válido. Pelo contrário, é um dialeto da linguagem de shell POSIX.

bash suporta um switch --posix , o que o torna mais compatível com POSIX. Ele também tenta imitar POSIX se invocado como sh .

sh = bash?

Por muito tempo, /bin/sh costumava apontar para /bin/bash na maioria dos sistemas GNU / Linux. Como resultado, quase se tornou seguro ignorar a diferença entre os dois. Mas isso começou a mudar recentemente.

Alguns exemplos populares de sistemas em que /bin/sh não aponta para /bin/bash (e em alguns dos quais /bin/bash podem nem existir) são:

  1. Debian moderno e sistemas Ubuntu, que symlink sh para dash por padrão;
  2. Busybox , que geralmente é executado durante o tempo de boot do sistema Linux como parte do initramfs . Ele usa a implementação do shell de ash .
  3. BSDs e, em geral, quaisquer sistemas não-Linux. O OpenBSD usa pdksh , um descendente do shell Korn. O sh do FreeBSD é um descendente do shell Bourne do UNIX original. O Solaris tem seu próprio sh que por um longo tempo não era compatível com POSIX; uma implementação gratuita está disponível no projeto Heirloom .

Como você pode descobrir o que o /bin/sh aponta no seu sistema?

A complicação é que /bin/sh pode ser um link simbólico ou um link físico. Se é um link simbólico, uma maneira portátil de resolvê-lo é:

 % file -h /bin/sh /bin/sh: symbolic link to bash 

Se é um link difícil, tente

 % find -L /bin -samefile /bin/sh /bin/sh /bin/bash 

De fato, o flag -L cobre tanto os links simbólicos quanto os hardlinks, mas a desvantagem deste método é que ele não é portátil – o POSIX não requer o find para suportar a opção -samefile , embora tanto o GNU find quanto o FreeBSD o encontrem .

Linha de shebang

Em última análise, cabe a você decidir qual usar, escrevendo a linha «shebang».

Por exemplo

 #!/bin/sh 

vai usar sh (e tudo o que acontece para apontar para),

 #!/bin/bash 

usará /bin/bash se estiver disponível (e falhará com uma mensagem de erro, se não estiver). Claro, você também pode especificar outra implementação, por exemplo

 #!/bin/dash 

Qual deles usar

Para meus próprios scripts, eu prefiro sh pelos seguintes motivos:

  • é padronizado
  • é muito mais simples e fácil de aprender
  • ele é portátil em sistemas POSIX – mesmo que eles não tenham o bash , eles precisam ter

Há vantagens em usar o bash também. Suas características tornam a programação mais conveniente e semelhante à programação em outras linguagens de programação modernas. Isso inclui coisas como variables ​​locais e matrizes com escopo definido. Plain sh é uma linguagem de programação muito minimalista.

sh : http://man.cx/sh
bash : http://man.cx/bash

TL; DR : bash é um superconjunto de sh com uma syntax mais elegante e mais funcionalidade. É seguro usar uma linha bash shebang em quase todos os casos, pois é bastante onipresente em plataformas modernas.

NB: em alguns ambientes, sh é bash . Verifique sh --version .

Postar do UNIX.COM

Recursos do shell

Esta tabela abaixo lista a maioria dos resources que eu acho que faria você escolher um shell em detrimento de outro. Ele não pretende ser uma lista definitiva e não inclui todos os resources possíveis para cada shell possível. Um recurso só é considerado em um shell se estiver na versão fornecida com o sistema operacional ou se estiver disponível como compilado diretamente da distribuição padrão. Em particular, a shell C especificada abaixo é aquela disponível no SUNOS 4. *, um número considerável de fornecedores agora envia tcsh ou seu próprio shell C aprimorado (eles nem sempre tornam óbvio que eles estão enviando o tcsh.

Código:

  sh csh ksh bash tcsh zsh rc es Job control NYYYYYNN Aliases NYYYYYNN Shell functions Y(1) NYYNYYY "Sensible" Input/Output redirection YNYYNYYY Directory stack NYYYYYFF Command history NYYYYYLL Command line editing NNYYYYLL Vi Command line editing NNYYY(3) YLL Emacs Command line editing NNYYYYLL Rebindable Command line editing NNNYYYLL User name look up NYYYYYLL Login/Logout watching NNNNYYFF Filename completion NY(1) YYYYLL Username completion NY(2) YYYYLL Hostname completion NY(2) YYYYLL History completion NNNYYYLL Fully programmable Completion NNNNYYNN Mh Mailbox completion NNNN(4) N(6) N(6) NN Co Processes NNYNNYNN Builtin artithmetic evaluation NYYYYYNN Can follow symbolic links invisibly NNYYYYNN Periodic command execution NNNNYYNN Custom Prompt (easily) NNYYYYYY Sun Keyboard Hack NNNNNYNN Spelling Correction NNNNYYNN Process Substitution NNNY(2) NYYY Underlying Syntax sh csh sh sh csh sh rc rc Freely Available NNN(5) YYYYY Checks Mailbox NYYYYYFF Tty Sanity Checking NNNNYYNN Can cope with large argument lists YNYYYYYY Has non-interactive startup file NYY(7) Y(7) YYNN Has non-login startup file NYY(7) YYYNN Can avoid user startup files NYNYNYYY Can specify startup file NNYYNNNN Low level command redefinition NNNNNNNY Has anonymous functions NNNNNNYY List Variables NYYNYYYY Full signal trap handling YNYYNYYY File no clobber ability NYYYYYNF Local variables NNYYNYYY Lexically scoped variables NNNNNNNY Exceptions NNNNNNNY 

Chave para a tabela acima.

Y Recurso pode ser feito usando este shell.

N Recurso não está presente no shell.

F O recurso só pode ser feito usando o mecanismo de function de shells.

LA biblioteca readline deve estar vinculada ao shell para habilitar esse recurso.

Notas para a tabela acima

 1. This feature was not in the original version, but has since become almost standard. 2. This feature is fairly new and so is often not found on many versions of the shell, it is gradually making its way into standard distribution. 3. The Vi emulation of this shell is thought by many to be incomplete. 4. This feature is not standard but unofficial patches exist to perform this. 5. A version called 'pdksh' is freely available, but does not have the full functionality of the AT&T version. 6. This can be done via the shells programmable completion mechanism. 7. Only by specifying a file via the ENV environment variable. 

Esta questão tem sido freqüentemente nomeada como canônica para pessoas que tentam usar sh e ficam surpresas por não estar se comportando da mesma forma que bash . Aqui está um resumo rápido de mal-entendidos e armadilhas comuns.

Primeiramente, você deve entender o que esperar.

  • Se você executar seu script com sh scriptname , ou executá-lo com scriptname e ter #!/bin/sh na linha shebang , você deve esperar o comportamento sh POSIX.
  • Se você executar seu script com bash scriptname , ou executá-lo com scriptname e ter #!/bin/bash (ou o equivalente local) na linha shebang, você deve esperar um comportamento Bash.

Ter um shebang correto e executar o script digitando apenas o nome do script (possivelmente com um caminho relativo ou completo) geralmente é a solução preferida. Além de um shebang correto, isso requer que o arquivo de script tenha permissão de execução ( chmod a+x scriptname ).

Então, como eles realmente diferem?

O manual Bash Reference tem uma seção que tenta enumerar as diferenças, mas algumas fonts comuns de confusão incluem

  • [[ não está disponível em sh (apenas [ que é mais desajeitado e limitado).
  • sh não tem matrizes.
  • Algumas palavras-chave do Bash, como local , function e select não são portáveis ​​para sh .
  • O Bash tem muitas extensões de syntax no estilo C como $'string\nwith\tC\aescapes' e o three-argumento for((i=0;i<=3;i++)) loop, += incremento de atribuição, etc.
  • Bash suporta <<<'here strings' .
  • Bash tem *.{png,jpg} e {0..9} expansão de contraventamento.
  • ~ refere-se a $HOME somente no Bash (e mais geralmente ~username no diretório home do username de username ).
  • O Bash tem uma substituição de processo com <(cmd) e >(cmd) .
  • O Bash suporta coprocessos com redirecionamento <> .
  • O Bash estendeu significativamente os resources para a aritmética de shell (embora ainda não suporte de ponto flutuante) e a manipulação de substring variável com ${substring:1:2} , ${variable/pattern/replacement} , conversão de caso etc.
  • Muitas, muitas extensões somente de Bash para habilitar ou desabilitar o comportamento opcional e expor o estado interno do shell.
  • Muitos, muitos resources de conveniência para uso interativo que, no entanto, não afetam o comportamento do script.

Lembre-se, esta é uma listview abreviada. Consulte o manual de referência para obter informações completas e http://mywiki.wooledge.org/Bashism para obter muitas soluções boas; e / ou tente http://shellcheck.net/, que alerta para muitos resources somente do Bash.

Um erro comum é ter uma linha #!/bin/bash shebang, mas mesmo assim usando sh scriptname para executar o script. Isso basicamente desativa qualquer funcionalidade somente do Bash, assim você obtém erros de syntax, por exemplo, para tentar usar arrays.

Infelizmente, o Bash não avisará quando você tentar usar essas construções quando for invocado como sh . Ele também não desabilita completamente todas as funcionalidades do Bash, então rodar o Bash invocando-o como sh não é uma boa maneira de verificar se o seu script é propriamente portável para o ash / dash / POSIX sh .

O Shell é uma interface entre um usuário e um sistema operacional para acessar os serviços de um sistema operacional. Pode ser GUI ou CLI (interface de linha de comando).

sh (Bourne sh ell) é um interpretador de linha de comandos shell, para sistemas operacionais Unix / Unix-like. Ele fornece alguns comandos internos. Na linguagem de script, denotamos interpretador como #!/bin/sh . Foi um dos mais amplamente suportados por outros shells como bash (free / open), kash (não livre).

Bash ( B ourne a gain s hell) é um substituto de shell para o shell Bourne. Bash é superconjunto de sh. Bash suporta sh. POSIX é um conjunto de padrões que define como os sistemas compatíveis com POSIX devem funcionar. O Bash não é realmente um shell compatível com POSIX. Em uma linguagem de script, denotamos o interpretador como #!/bin/bash .

Analogia:

  • Shell é como uma interface ou especificações ou API.
  • sh é uma class que implementa a interface Shell.
  • Bash é uma subclass do sh.

TERMINAL

  • programa (s) que colocam uma janela
  • xterm, rxvt, konsole, kvt, gnome-terminal, nxterm e eterm.

CONCHA

  • É um programa que roda no terminal
  • Shell é um interpretador de comandos e uma linguagem de programação
  • Shell é simplesmente um processador de macros que executa comandos.
  • Processador de macro significa funcionalidade em que texto e símbolos são expandidos para criar expressões maiores.

SH vs. BASH

SH

  • (Concha)
  • É uma concha específica
  • um interpretador de comandos e uma linguagem de programação
  • Antecessor de BASH

BASH

  • (Bourne-Again SHell)
  • É uma concha específica
  • um interpretador de comandos e uma linguagem de programação
  • Tem funcionalidade sh e mais
  • Sucessor do SH
  • BASH é o padrão SHELL

MATERIAL DE REFERÊNCIA:

SHELL gnu.org:

Na sua base, um shell é simplesmente um processador de macros que executa comandos. O termo processador de macro significa funcionalidade em que texto e símbolos são expandidos para criar expressões maiores.

Um shell Unix é um interpretador de comandos e uma linguagem de programação. Como um interpretador de comandos, o shell fornece a interface do usuário para o rico conjunto de utilitários GNU. Os resources da linguagem de programação permitem que esses utilitários sejam combinados. Arquivos contendo comandos podem ser criados e se tornarem comandos. Esses novos comandos têm o mesmo status que os comandos do sistema em diretórios como / bin, permitindo que usuários ou grupos estabeleçam ambientes personalizados para automatizar suas tarefas comuns.

Os reservatórios podem ser usados ​​interativamente ou não interativamente. No modo interativo, eles aceitam input digitada no teclado. Ao executar de forma não interativa, shells executam comandos lidos de um arquivo.

Um shell permite a execução de comandos GNU, de forma síncrona e assíncrona. O shell aguarda que os comandos síncronos sejam concluídos antes de aceitar mais input; comandos asynchronouss continuam a executar em paralelo com o shell enquanto lê e executa comandos adicionais. As construções de redirecionamento permitem um controle refinado da input e saída desses comandos. Além disso, o shell permite controlar o conteúdo dos ambientes dos comandos.

Os shells também fornecem um pequeno conjunto de comandos internos (builtins) que implementam funcionalidades impossíveis ou inconvenientes de obter por meio de utilitários separados . Por exemplo, cd, break, continue e exec não podem ser implementados fora do shell porque manipulam diretamente o próprio shell. O histórico, getopts, kill ou pwd builtins, entre outros, podem ser implementados em utilitários separados, mas eles são mais convenientes para usar como comandos embutidos. Todos os builtins de shell são descritos nas seções subseqüentes.

Embora a execução de comandos seja essencial, a maior parte da potência (e complexidade) dos shells se deve às suas linguagens de programação incorporadas. Como qualquer linguagem de alto nível, o shell fornece variables, construções de controle de stream, citações e funções.

Os shells oferecem resources voltados especificamente para uso interativo, em vez de aumentar a linguagem de programação. Esses resources interativos incluem controle de tarefas, edição de linha de comando, histórico de comandos e aliases. Cada um desses resources é descrito neste manual.

BASH gnu.org:

Bash é o shell, ou interpretador de linguagem de comandos, para o sistema operacional GNU. O nome é um acrônimo para o ‘Bourne-Again SHell’, um trocadilho com Stephen Bourne, o autor do ancestral direto do atual Unix shell sh, que apareceu na sétima edição da Bell Labs Research do Unix.

O Bash é amplamente compatível com sh e incorpora resources úteis do Ksh shell ksh e do C shell csh. Pretende-se que seja uma implementação em conformidade da parte IEEE POSIX Shell and Tools da especificação IEEE POSIX (Norma IEEE 1003.1). Ele oferece melhorias funcionais sobre sh para uso interativo e de programação.

Enquanto o sistema operacional GNU fornece outros shells, incluindo uma versão do csh, o Bash é o shell padrão . Como outros softwares GNU, o Bash é bastante portátil. Atualmente, ele é executado em quase todas as versões do Unix e de alguns outros sistemas operacionais – existem portas suportadas independentemente para as plataformas MS-DOS, OS / 2 e Windows.

Outras respostas geralmente apontam a diferença entre o Bash e um padrão de shell POSIX. No entanto, ao escrever scripts de shell portáteis e ser usado para a syntax Bash, uma lista de bashisms típicos e soluções POSIX puras correspondentes é muito útil. Tal lista foi compilada quando o Ubuntu mudou de Bash para Dash como shell de sistema padrão e pode ser encontrado aqui: https://wiki.ubuntu.com/DashAsBinSh

Além disso, existe uma ótima ferramenta chamada checkbashisms que verifica os bashisms no seu script e é útil quando você quer ter certeza de que seu script é portátil.

/bin/sh pode ou não invocar o mesmo programa que /bin/bash .

sh suporta pelo menos os resources requeridos pelo POSIX (assumindo uma implementação correta). Pode suportar extensões também.

bash , o “Bourne Again Shell”, implementa os resources necessários para extensões sh e específicas do bash. O conjunto completo de extensões é muito longo para descrever aqui e varia de acordo com novos lançamentos. As diferenças estão documentadas no manual bash. Digite info bash e leia a seção “Bash Features” (seção 6 na versão atual), ou leia a documentação on-line atual .

Bash (bash) é um dos muitos shells Unix disponíveis (ainda que usados ​​com mais frequência). Bash significa “Bourne Again SHell”, e é uma substituição / melhoria do shell Bourne original (sh).

O script do shell é script em qualquer shell, enquanto o script Bash é script especificamente para o Bash.

O sistema operacional Linux oferece diferentes tipos de shell. Embora os shells tenham muitos comandos em comum, cada tipo possui resources exclusivos. Vamos estudar diferentes tipos de invólucros usados ​​principalmente.

Shell Sh:

Sh shell também é conhecido como Bourne Shell. Sh shell é o primeiro shell desenvolvido para computadores Unix por Stephen Bourne no Bell Labs da AT & T em 1977. Ele inclui muitas ferramentas de script.

Bash shell:

Bash shell significa Bourne Again Shell. Bash shell é o shell padrão na maioria das distribuições linux e substituto para Sh Shell (shell Sh também será executado no shell Bash). Bash Shell pode executar a grande maioria dos scripts de shell Sh sem modificação e fornecer resources de edição de linha de comandos também.