ti-enxame.com

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 e sh?

1068
Weiwei Yang

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 de sh (veja abaixo).

Como sh é uma especificação, não uma implementação, /bin/sh é um symlink (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 válidos do POSIX Shell, portanto, por si só, bash não é um Shell POSIX válido. Pelo contrário, é um dialeto da linguagem do 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 onde /bin/sh não aponta para /bin/bash (e em alguns dos quais /bin/bash podem nem existir) são:

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

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

A complicação é que /bin/sh poderia ser um link simbólico ou um hard link. Se é um link simbólico, uma maneira portátil para 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

Na verdade, o sinalizador -L abrange tanto links simbólicos quanto hardlinks, mas a desvantagem desse método é que ele não é portátil - POSIX não requerfind para suportar a opção -samefile, embora ambos GNU find e FreeBSD encontra suporta.

Linha de shebang

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

Por exemplo.

#!/bin/sh

usará sh (e qualquer coisa que aponte para apontar),

#!/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, prefiro sh pelos seguintes motivos:

  • é padronizado
  • é muito mais simples e fácil de aprender
  • é portátil em sistemas POSIX - mesmo que eles não tenham bash, eles são obrigados a ter sh

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

968
Roman Cheplyaka

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

TL; DR : bash é um superconjunto de sh com uma sintaxe 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, shisbash. Verifique sh --version.

107
Rein Henrichs

Esta questão tem sido frequentemente 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 tiver #!/bin/sh na linha Shebang , você deve esperar o comportamento POSIX sh.
  • Se você executar seu script com bash scriptname, ou executá-lo com scriptname e tiver #!/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 fontes comuns de confusão incluem

  • [[ não está disponível em sh (apenas [, que é mais desajeitado e limitado).
  • sh não possui matrizes.
  • Algumas palavras-chave do Bash como local, source, function e select não são portáveis ​​para sh. (Algumas implementações sh supprt, por exemplo, local.)
  • O Bash tem muitas extensões de sintaxe no estilo C como $'string\nwith\tC\aescapes' e o loop for((i=0;i<=3;i++)) de três argumentos, += designação de incremento, etc.
  • Bash suporta <<<'here strings'.
  • Bash tem *.{png,jpg} e {0..12} brace expansion.
  • ~ refere-se a $HOME apenas no Bash (e mais geralmente ~username ao diretório inicial de username).Isto está em POSIX, mas pode estar em mísseis a partir de algumas implementações de /bin/sh pré-POSIX.
  • Bash tem substituição de processo com <(cmd) e >(cmd).
  • O Bash tem aliases de redirecionamento de conveniência ao estilo Csh como &| para 2>&1 | e &> para > ... 2>&1
  • O Bash suporta coprocessos com redirecionamento <>.
  • O Bash apresenta um amplo conjunto de expansões de parâmetros não padrão expandidas, como ${substring:1:2}, ${variable/pattern/replacement}, conversão de casos, etc.
  • O Bash aumentou significativamente as facilidades para a aritmética do Shell (embora ainda não haja suporte de ponto flutuante).
  • Muitas, muitas extensões somente de Bash para habilitar ou desabilitar o comportamento opcional e expor o estado interno do Shell.
  • Muitos, muitos recursos de conveniência para uso interativo que, no entanto, não afetam o comportamento do script.

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

Um erro comum é ter uma linha Shebang #!/bin/bash, mas mesmo assim usar sh scriptname para realmente executar o script. Isso basicamente desativa qualquer funcionalidade somente do Bash, por isso você recebe erros de sintaxe, por exemplo, por tentar usar matrizes.

Infelizmente, o Bash não avisará quando você tentar usar essas construções quando for chamado como sh. Ele não desativa completamente a funcionalidade all Bash-only, portanto, executar o Bash invocando-o como sh não é uma boa maneira de verificar se o seu script é adequadamente portável para ash / dash / POSIX sh ou variantes como Herança sh

53
tripleee

Postar de UNIX.COM

recursos do shell

Esta tabela abaixo lista a maioria dos recursos 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 recursos 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, o C Shell especificado abaixo é o disponível no SUNOS 4. *, um número considerável de fornecedores agora envia tcsh ou seu próprio C Shell aprimorado (eles nem sempre tornam óbvio que eles estão enviando tcsh).

Código:

                                     sh   csh  ksh  bash tcsh zsh  rc   es
Job control                          N    Y    Y    Y    Y    Y    N    N
Aliases                              N    Y    Y    Y    Y    Y    N    N
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y
Directory stack                      N    Y    Y    Y    Y    Y    F    F
Command history                      N    Y    Y    Y    Y    Y    L    L
Command line editing                 N    N    Y    Y    Y    Y    L    L
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L
User name look up                    N    Y    Y    Y    Y    Y    L    L
Login/Logout watching                N    N    N    N    Y    Y    F    F
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L
Username completion                  N    Y(2) Y    Y    Y    Y    L    L
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L
History completion                   N    N    N    Y    Y    Y    L    L
Fully programmable Completion        N    N    N    N    Y    Y    N    N
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N
Co Processes                         N    N    Y    N    N    Y    N    N
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N
Periodic command execution           N    N    N    N    Y    Y    N    N
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N
Spelling Correction                  N    N    N    N    Y    Y    N    N
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y
Can specify startup file             N    N    Y    Y    N    N    N    N
Low level command redefinition       N    N    N    N    N    N    N    Y
Has anonymous functions              N    N    N    N    N    N    Y    Y
List Variables                       N    Y    Y    N    Y    Y    Y    Y
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y
File no clobber ability              N    Y    Y    Y    Y    Y    N    F
Local variables                      N    N    Y    Y    N    Y    Y    Y
Lexically scoped variables           N    N    N    N    N    N    N    Y
Exceptions                           N    N    N    N    N    N    N    Y

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 função de shells.

LA biblioteca readline deve estar vinculada ao Shell para ativar este 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.
47
SriniV

Shell é uma interface entre um usuário e 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 comando da Shell, para sistemas operacionais Unix/Unix. Ele fornece alguns comandos internos. Na linguagem de script, denotamos intérprete como #!/bin/sh. Foi um dos mais amplamente suportados por outros shells como bash (free/open), kash (não livre).

Bash (Bourne a ganho s hell) é um substituto da Shell para a Bourne Shell. 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 intérprete como #!/bin/bash.

Analogia:

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

enter image description here

33
Premraj

TERMINAL

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

casca

  • É 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 Shell específica
  • um interpretador de comandos e uma linguagem de programação
  • Antecessor de BASH

BASH

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

MATERIAL DE REFERÊNCIA:

Shell gnu.org:

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

Um Unix Shell é 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 recursos 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 dos 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 entrada 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 a conclusão de comandos síncronos antes de aceitar mais entrada; comandos assíncronos continuam a executar em paralelo com o Shell enquanto lê e executa comandos adicionais. As construções de redirecionamento permitem um controle refinado da entrada e saída desses comandos. Além disso, o Shell permite controlar o conteúdo dos ambientes de comandos.

Shells também fornecem um pequeno conjunto de comandos embutidos (builtins) implementando funcionalidade impossível ou inconveniente de obter através 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. Todas as builtins da Shell são descritas nas seções subseqüentes.

Embora a execução de comandos seja essencial, a maior parte da potência (e complexidade) dos shells é devida às suas linguagens de programação incorporadas. Como qualquer linguagem de alto nível, o Shell fornece variáveis, construções de controle de fluxo, citações e funções.

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

BASHgnu.org:

Bash é o Shell, ou interpretador de linguagem de comando, para o sistema operacional GNU. O nome é um acrônimo para "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 recursos ú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). Oferece melhorias funcionais sobre sh para uso interativo e de programação.

Enquanto o sistema operacional GNU fornece outros shells, incluindo uma versão de csh, Bash é o padrão Shell . Como outro software 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.

22
Timothy L.J. Stewart

Outras respostas geralmente apontam a diferença entre o Bash e o padrão POSIX Shell. No entanto, ao escrever scripts portáveis ​​do Shell e ser usado na sintaxe 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 sistema padrão Shell e pode ser encontrado aqui: https://wiki.ubuntu.com/DashAsBinSh

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

14
Andrzej Pronobis

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

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

bash, o "Bourne Again Shell", implementa os recursos 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 atual online .

3
Keith Thompson

bash e sh são duas camadas diferentes. Basicamente o bash é sh, com mais recursos e melhor sintaxe. A maioria dos comandos funciona da mesma forma, mas eles são diferentes. O Bash (bash) é um dos muitos shells Unix disponíveis (mas os mais usados). Bash significa "Bourne Again Shell", e é uma substituição/melhoria do original Bourne Shell (sh).

O script do shell é script em qualquer Shell, enquanto o script Bash é script especificamente para o Bash. Na prática, no entanto, "Shell script" e "bash script" são freqüentemente usados ​​de forma intercambiável, a menos que o Shell em questão não seja o Bash.

Dito isto, você deve perceber que/bin/sh na maioria dos sistemas será um link simbólico e não invocará sh. No Ubuntu/bin/sh usado para vincular a bash, comportamento típico em distribuições Linux, mas agora mudou para vincular a outro Shell chamado traço. Eu usaria bash, como isso é praticamente o padrão (ou pelo menos mais comum, da minha experiência). Na verdade, surgem problemas quando um script bash usará #!/Bin/sh porque o criador de scripts assume que o link é para bater quando não precisa ser.

0
Gopika BG