Diferença entre sh e bash

1305

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

Qual é a principal diferença entre bashe sh?

Do que precisamos estar cientes ao programar bashe sh?

Weiwei Yang
fonte
21
Para obter uma lista útil de bashisms e código correspondente que funciona em Bourne shell, consulte mywiki.wooledge.org/Bashism
Stackexchange entristece dancek
1
Você pode querer ver o POSIX padrão para sh e sua linguagem de comando: * sh * Shell Command Language
Maurício C Antunes
7
como regra geral, todos os scripts sh serão executados no bash graças à sua compatibilidade com posix, mas nem todos os scripts bash podem ser executados no sh, as principais diferenças que você percebe são coisas como [[]] em vez de [] comparações que permitem espaços sem aspas, $ (()) em vez de expressões aritméticas $ [] e outras coisas como "é muito grande e muito lento" diretamente dos documentos do bash. Mas os novos scripts não precisam se limitar a scripts compatíveis com sh, a menos que estejam filmando por algum compatibilidade com versões anteriores, que na maioria das vezes não é o caso hoje em dia, afinal, é (ou foi ...) o ano de 2014, certo?
Osirisgothra # 12/14

Respostas:

1142

O que é sh

sh(ou a Shell Command Language) é uma linguagem de programação descrita pelo padrão POSIX . Ele tem muitas implementações ( ksh88, dash...). bashtambém pode ser considerada uma implementação de sh(veja abaixo).

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

O que é bash

bashcomeçou como uma shimplementação compatível (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 dos scripts de shell POSIX válidos, portanto, por si só, bashnão é um shell POSIX válido. Pelo contrário, é um dialeto da linguagem shell POSIX.

bashsuporta um --posixswitch, o que o torna mais compatível com POSIX. Ele também tenta imitar o POSIX se chamado como sh.

sh = festança?

Por um longo tempo, /bin/shcostumava apontar para /bin/basha 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 para os quais /bin/shnão aponta /bin/bash(e em alguns dos quais /bin/bashpodem até não existir) são:

  1. Sistemas modernos Debian e Ubuntu, que simbolizam shcomo dashpadrão;
  2. Busybox , que geralmente é executado durante o tempo de inicialização do sistema Linux como parte de initramfs. Ele usa a ashimplementação do shell.
  3. BSDs e, em geral, quaisquer sistemas não Linux. O OpenBSD usa pdksh, um descendente do shell Korn. O FreeBSD's shé um descendente do shell original do UNIX Bourne. O Solaris possui um sistema shque, 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 /bin/shaponta para o seu sistema?

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

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

Se for um link físico, tente

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

De fato, a -Lflag cobre links simbólicos e hardlinks, mas a desvantagem desse método é que ele não é portátil - o POSIX não precisa find oferecer suporte à -samefileopção, embora o GNU find e o FreeBSD o apóiem.

Linha Shebang

Por fim, cabe a você decidir qual usar, escrevendo a linha «shebang» como a primeira linha do script.

Por exemplo

#!/bin/sh

usará sh(e o que quer que isso aconteça),

#!/bin/bash

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

#!/bin/dash

Qual usar

Para meus próprios scripts, prefiro shpelos seguintes motivos:

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

Existem vantagens em usar bashtambém. Seus recursos tornam a programação mais conveniente e semelhante à programação em outras linguagens de programação modernas. Isso inclui coisas como variáveis ​​locais e matrizes com escopo. Plain shé uma linguagem de programação muito minimalista.

Roman Cheplyaka
fonte
Se você executar um script com basha exibição de mensagens de erro mais úteis no caso de erro de sintaxe. Você pode simplesmente economizar tempo usando o bash.
PHPst 7/04
O que %significa o início de suas linhas de comando?
JosephHarriott 16/04
@ JosephphHarriott é um prompt: um caractere impresso pelo próprio shell, após o qual seu comando segue. Algumas conchas usam em $vez de %ou #para o shell raiz.
Roman Cheplyaka 17/04
@RomanCheplyaka que conchas? Eu só vi $e #...
JosephHarriott 17/04
@RomanCheplyaka Tenho certeza que shexistia bem antes do bash (que significa bourne-again shell). Mas foi muito primitivo e não respondeu a eventos terminais, como ESCpersonagens. Então kshveio (também antes do bash), depois o bash iniciado por quem amava a idéia de um shell melhor, mas odiava o ksh. :-)
raminr
145

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

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

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

Rein Henrichs
fonte
31
se o bash for chamado como sh, ele se comportará de maneira um pouco diferente. Consulte gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files ("Invocado com o nome sh") e gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode . Por exemplo, nenhuma substituição de processo.
precisa saber é o seguinte
11
Como o bash é um superconjunto do sh e alguns sistemas operacionais, como o FreeBSD, não têm o bash instalado por padrão, os scripts no sh fornecerão maior portabilidade.
user674062
1
Como não há uma maneira portátil de script para obter um shell POSIX para um script específico, os scripts portáteis não podem assumir mais do que os recursos do Bourne Shell.
schily 12/09
83

Essa pergunta tem sido frequentemente indicada como canônica para pessoas que tentam usar she ficam surpresas por não estar se comportando da mesma maneira bash. Aqui está um rápido resumo de mal-entendidos e armadilhas comuns.

Primeiro, você deve entender o que esperar.

  • Se você executar seu script com sh scriptname, ou scriptnametiver #!/bin/shna linha shebang , deverá esperar um shcomportamento POSIX .
  • Se você executar seu script com bash scriptname, ou scriptnametiver #!/bin/bash(ou o equivalente local) na linha shebang, deverá esperar o comportamento do 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 possui 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 Bash gosto local, source, function, shopt, let, declare, e selectnão são portáteis para sh. (Algumas shimplementações suportam, por exemplo local.)
  • Bash tem muitas extensões de sintaxe de estilo C, como o de três argumentos for((i=0;i<=3;i++))loop, +=atribuição incremento, etc. O $'string\nwith\tC\aescapes'recurso está provisoriamente aceito para POSIX (o que significa que funciona em Bash agora, mas ainda não será apoiado por shem sistemas que aderem somente a corrente Especificação POSIX e provavelmente não virá por algum tempo).
  • Bash suporta <<<'here strings'.
  • O Bash tem *.{png,jpg}e {0..12}prepara a expansão.
  • ~refere-se $HOMEapenas ao Bash (e mais geralmente ~usernameao diretório inicial de username).Isso está no POSIX, mas pode estar ausente em algumas /bin/shimplementações pré-POSIX .
  • O Bash tem substituição de processo com <(cmd)e >(cmd).
  • O Bash possui aliases de redirecionamento de conveniência no estilo Csh, como &|para 2>&1 |e &>para> ... 2>&1
  • O Bash suporta coprocessos com <>redirecionamento.
  • Bash apresenta um rico conjunto de expandidas expansões de parâmetros não-padrão, tais como ${substring:1:2}, ${variable/pattern/replacement}, conversão caso, etc.
  • O Bash ampliou significativamente as instalações de aritmética de shell (embora ainda não haja suporte de ponto flutuante). Existe uma $[expression]sintaxe legada obsoleta que, no entanto, deve ser substituída pela $((expression))sintaxe aritmética POSIX . (Algumas shimplementações pré-POSIX herdadas podem não suportar isso, no entanto.)
  • Variáveis magia como $RANDOM, $SECONDS, $PIPESTATUS[@]e $FUNCNAMEsão extensões da festança.
  • Diferenças sintáticas como export variable=valuee [ "x" == "y" ]que não são portáteis ( export variabledevem ser separadas da atribuição de variáveis ​​e a comparação de cadeias portáteis [ ... ]usa um único sinal de igual).
  • Muitas extensões somente Bash para ativar ou desativar 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 lista resumida. Consulte o manual de referência para obter informações completas e http://mywiki.wooledge.org/Bashism para obter muitas soluções alternativas; e / ou tente http://shellcheck.net/, que avisa sobre muitos recursos exclusivos do Bash.

Um erro comum é ter uma #!/bin/bashlinha shebang, mas, no entanto, usar sh scriptnamepara realmente executar o script. Isso basicamente desativa qualquer funcionalidade somente Bash, para que você obtenha erros de sintaxe, por exemplo, ao tentar usar matrizes. (A linha shebang é sintaticamente um comentário, portanto é simplesmente ignorada nesse cenário.)

Infelizmente, o Bash não avisa quando você tenta usar essas construções quando é invocado como sh. Também não desativa completamente todas as funcionalidades somente do Bash, portanto, executando o Bash invocando-o, pois shnão é uma boa maneira de verificar se o seu script é adequadamente portátil para o ash/ dash/ POSIX shou variantes como o Heirloomsh

triplo
fonte
2
Fundamentalmente, a versão TL; DR é a resposta de And .
tripleee
4
shellcheck.net era tudo que eu precisava. Muito Obrigado.
Josh Habdas 30/07/2018
O FWIW export variable=valueé mandatado pelo POSIX: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html . Talvez não esteja disponível em algumas conchas antigas, mas definitivamente não é um basismo.
Roman Cheplyaka 17/04
53

Postagem 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 é considerado apenas em um shell se estiver na versão que acompanha o sistema operacional ou se estiver disponível conforme compilado diretamente na distribuição padrão. Em particular, o shell C especificado abaixo é o disponível no SUNOS 4. *, um número considerável de fornecedores agora envia o tcsh ou seu próprio shell C aprimorado (eles nem sempre tornam óbvio que estão enviando o 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.

O recurso Y pode ser feito usando esse shell.

N O recurso não está presente no shell.

O recurso F só pode ser feito usando o mecanismo da função shells.

LO biblioteca de linha de leitura 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.
SriniV
fonte
Sua tabela não é útil para mim, pois tenta comparar os recursos do Bourne Shell e os do ksh anteriores a 1988. Se você realmente criar uma tabela para 1988, será necessário remover a maioria das outras conchas da tabela - incluindo o bash , sh e rc. Você poderia explicar de onde você obteve os valores para sua tabela?
schily 12/09
1
Deixe-me dar algumas dicas: O Job Control foi adicionado ao Bourne Shell em 1989 e o Bourne Shell tornou-se OpenSource em 2005. O shell Korn tem substituição de processo desde pelo menos 1988 e é OpenSource desde 1997. BTW: suas declarações sobre $ ENV não estão corretos, $ ENV é lido / executado apenas para shells interativos.
schily 12/09
3
@schily Esta publicação foi capturada de cs.virginia.edu/helpnet/Computer_OS/unix/shells/shelldiff.html
SriniV
@schily Se você acha que está incorreto em qualquer lugar, sinta-se à vontade para editá-lo adequadamente.
SriniV
8
Com base no que astuciosamente exposto, parece que seria melhor remover essa resposta, pois ela é essencialmente fraudulenta, e a OP realmente não examinou as informações que ele colou.
Danno
53

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

sh (Bourne sh ell) é um interpretador de linha de comando do 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 (livre / aberto), kash (não livre).

Bash ( B ourne um ganho s inferno) é uma substituição shell para o shell Bourne. Bash é um superconjunto de sh. Bash suporta sh. POSIX é um conjunto de padrões que definem 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 do Shell.
  • Bash é uma subclasse do sh.

insira a descrição da imagem aqui

Premraj
fonte
3
Eu não entendo. Você mencionou "Bash é um superconjunto de sh" e "Bash é uma subclasse de sh", não são afirmações contrárias? Você pode esclarecer por favor?
Keerthana Prabhakaran,
11
Eu acho que isso está tentando dizer que o Bash herda sh(por isso é uma "subclasse" no sentido OOP) e o estende (por isso tem um superconjunto da funcionalidade).
Tripleee 19/05/19
24

TERMINAL

  • programas que abrem 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 macro que executa comandos.
  • Processador de macro significa funcionalidade em que texto e símbolos são expandidos para criar expressões maiores.

SH vs. BATER

SH

  • (Concha)
  • É um shell específico
  • um intérprete de comando e uma linguagem de programação
  • Predecessor do BASH

BATER

  • (Bourne-Novamente Shell)
  • É um shell específico
  • um intérprete de comando e uma linguagem de programação
  • Possui funcionalidade sh e mais
  • Sucessor da 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 de macros 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 intérprete de comando, 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 maneira não interativa, os 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 entradas; comandos assíncronos continuam a ser executados em paralelo com o shell enquanto ele 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 o controle sobre o conteúdo dos ambientes dos comandos.

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

Embora a execução de comandos seja essencial, a maior parte do poder (e complexidade) dos shells se deve a suas linguagens de programação incorporadas. Como qualquer linguagem de alto nível, o shell fornece variáveis, construções de controle de fluxo, cotação 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.

BASH gnu.org:

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

O Bash é amplamente compatível com sh e incorpora recursos úteis do Korn shell ksh e do C shell csh. Pretende-se que seja uma implementação conforme da parte do IEEE POSIX Shell and Tools da especificação IEEE POSIX (IEEE Standard 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 do csh, o Bash é o shell padrão . Como outros softwares GNU, o Bash é bastante portátil. Atualmente, ele roda em quase todas as versões do Unix e em alguns outros sistemas operacionais - existem portas com suporte independente para plataformas MS-DOS, OS / 2 e Windows.

Timothy LJ Stewart
fonte
14

Outras respostas geralmente apontaram 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 sintaxe do Bash, é muito útil uma lista de basismos comuns e soluções POSIX puras correspondentes. Essa lista foi compilada quando o Ubuntu mudou do Bash para o Dash como shell do sistema padrão e pode ser encontrada aqui: https://wiki.ubuntu.com/DashAsBinSh

Além disso, existe uma ótima ferramenta chamada checkbashisms que verifica se há basismos em seu script e é útil quando você deseja garantir que seu script seja portátil.

Andrzej Pronobis
fonte
Isso é basicamente o que minha resposta até agora realmente se resume. +1
tripleee
7

Eles são quase idênticos, mas bashtêm mais recursos - shé (mais ou menos) um subconjunto mais antigo de bash.

shgeralmente significa o original Bourne shell, que é anterior a bash( Bourne *again* shell), e foi criado em 1977. Mas, na prática, pode ser melhor pensar nele como um shell altamente compatível com o padrão POSIX de 1992.

Os scripts que iniciam #!/bin/shou usam o shshell geralmente o fazem para compatibilidade com versões anteriores. Qualquer sistema operacional unix / linux terá um shshell. No Ubuntu shfrequentemente chama dashe no MacOS é uma versão POSIX especial do bash. Esses shells podem ser preferidos para comportamento em conformidade com os padrões, velocidade ou compatibilidade com versões anteriores.

bashé mais recente que o original sh, adiciona mais recursos e procura ser compatível com versões anteriores sh. Em teoria, os shprogramas devem ser executados bash. bashestá disponível em quase todas as máquinas linux / unix e geralmente é usado por padrão - com a exceção notável do MacOS zshcomo padrão na Catalina (10.15). O FreeBSD, por padrão, não vem com o bashinstalado.

Ryan Taylor
fonte
shagora é anterior ao POSIX. Atualmente, você espera que qualquer um que shvocê encontre seja pelo menos compatível com POSIX; mas em sistemas legados isso não é de forma alguma um dado. O POSIX padroniza muito mais que o shell; de fato, você poderia argumentar que a padronização de chamadas do sistema operacional e funções da biblioteca é mais importante.
Tripleee 18/12/19
I removido o material sobre POSIX para torná-lo menos confuso
Ryan Taylor
3

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

shsuporta pelo menos os recursos exigidos pelo POSIX (assumindo uma implementação correta). Também pode suportar extensões.

bash, o "Bourne Again Shell", implementa os recursos necessários para extensões sh + bash específicas. O conjunto completo de extensões é longo demais para ser descrito aqui e varia com os novos lançamentos. As diferenças estão documentadas no manual do bash. Digite info bashe leia a seção "Recursos do Bash" (seção 6 na versão atual) ou leia a documentação atual online .

Keith Thompson
fonte
shfornece apenas um shell POSIX, se você tiver o direito PATHconfigurado no seu shell atual. Não há PATH-name definido que fornece um shell POSIX.
schily 12/09/2015
Por um longo tempo, shnão era necessariamente mesmo dando-lhe um shell POSIX, no Solaris, por exemplo.
Tripleee
3

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

Os scripts de shell são scripts em qualquer shell, enquanto os scripts do Bash são scripts especificamente para o Bash. Na prática, no entanto, "shell script" e "bash script" são frequentemente usados ​​de forma intercambiável, a menos que o shell em questão não seja o Bash.

Dito isto, você deve perceber / bin / sh na maioria dos sistemas será um link simbólico e não chamará sh. No Ubuntu / bin / sh costumava se conectar ao bash, comportamento típico nas distribuições Linux, mas agora mudou para o link para outro shell chamado dash. Eu usaria o bash, pois esse é praticamente o padrão (ou pelo menos o mais comum, da minha experiência). De fato, surgem problemas quando um script bash usa #! / Bin / sh porque o criador do script assume que o link deve bash quando não precisa.

Gopika BG
fonte
0

As diferenças da maneira mais fácil possível: Após ter um entendimento básico, os outros comentários postados acima serão mais fáceis de entender.

Shell - "Shell" é um programa que facilita a interação entre o usuário e o sistema operacional (kernel). Existem muitas implementações de shell disponíveis, como sh, bash, csh, zsh ... etc.

Usando qualquer um dos programas Shell, seremos capazes de executar comandos suportados por esse programa shell.

Bash - É derivado do B ourne- um ganho de Sh ell. Usando este programa, poderemos executar todos os comandos especificados pelo Shell. Além disso, poderemos executar alguns comandos que são adicionados especificamente a este programa. O Bash tem compatibilidade com sh.

Sh - É derivado de Bourne Sh ell. "sh" suporta todos os comandos especificados no shell. Significa que, usando este programa, poderemos executar todos os comandos especificados pelo Shell.

Para obter mais informações, faça: - https://man.cx/sh - https://man.cx/bash

Raihanhbh
fonte
Para entender o POSIX, leia a resposta de Alex. Verifique: stackoverflow.com/a/1780614/1261003
Raihanhbh 16/04
Não estou tentando entender o POSIX. Estou analisando sua resposta e, como tal, preciso vê-la, sua resposta agrega valor. Eu não acho que sim.
Scratte 16/04
Acredito que esses pequenos esclarecimentos ajudariam um novato a entender o jargão usado nas discussões acima com mais conforto. @Scratte
Raihanhbh
-1

O sistema operacional Linux oferece diferentes tipos de shell. Embora os shells tenham muitos comandos em comum, cada tipo tem recursos exclusivos. Vamos estudar diferentes tipos de conchas usadas principalmente.

Sh shell:

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. O shell Bash é o shell padrão na maioria das distribuições Linux e substitui o Sh Shell (o shell Sh também será executado no shell Bash). O Bash Shell pode executar a grande maioria dos scripts de shell Sh sem modificação e também fornece o recurso de edição de linha de comandos.

rashedcs
fonte
Havia uma concha anterior de Ken Thompson. O shell Bourne foi oficialmente introduzido na v7 Unix (1979).
Tripleee