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:
Sistemas modernos Debian e Ubuntu, que simbolizam shcomo dashpadrão;
Busybox , que geralmente é executado durante o tempo de inicialização do sistema Linux como parte de initramfs. Ele usa a ashimplementação do shell.
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 precisafind 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.
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. :-)
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.
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).
[[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
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
ViCommand line editing N N Y Y Y(3) Y L L
EmacsCommand line editing N N Y Y Y Y L L
RebindableCommand 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
MhMailbox completion N N N N(4) N(6) N(6) N N
CoProcesses 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
CustomPrompt(easily) N N Y Y Y Y Y Y
SunKeyboardHack N N N N N Y N N
SpellingCorrection N N N N Y Y N N
ProcessSubstitution N N N Y(2) N Y Y Y
UnderlyingSyntax sh csh sh sh csh sh rc rc
FreelyAvailable N N N(5) Y Y Y Y Y
ChecksMailbox N Y Y Y Y Y F F
TtySanityChecking 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
ListVariables 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.TheVi 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.
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 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.
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
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 é 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.
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.
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.
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 .
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.
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.
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.
Respostas:
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
...).bash
também pode ser considerada uma implementação desh
(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
bash
começou como umash
implementaçã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ó,bash
não é um shell POSIX válido. Pelo contrário, é um dialeto da linguagem shell POSIX.bash
suporta um--posix
switch, o que o torna mais compatível com POSIX. Ele também tenta imitar o POSIX se chamado comosh
.sh = festança?
Por um longo tempo,
/bin/sh
costumava apontar para/bin/bash
a 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/sh
não aponta/bin/bash
(e em alguns dos quais/bin/bash
podem até não existir) são:sh
comodash
padrão;initramfs
. Ele usa aash
implementação do shell.pdksh
, um descendente do shell Korn. O FreeBSD'ssh
é um descendente do shell original do UNIX Bourne. O Solaris possui um sistemash
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
/bin/sh
aponta para o seu sistema?A complicação é que
/bin/sh
poderia ser um link simbólico ou um link físico. Se for um link simbólico, uma maneira portátil de resolvê-lo é:Se for um link físico, tente
De fato, a
-L
flag cobre links simbólicos e hardlinks, mas a desvantagem desse método é que ele não é portátil - o POSIX não precisafind
oferecer suporte à-samefile
opçã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
usará
sh
(e o que quer que isso aconteça),usará
/bin/bash
se estiver disponível (e falhará com uma mensagem de erro, se não estiver). Obviamente, você também pode especificar outra implementação, por exemploQual usar
Para meus próprios scripts, prefiro
sh
pelos seguintes motivos:bash
, eles precisam tersh
Existem vantagens em usar
bash
també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. Plainsh
é uma linguagem de programação muito minimalista.fonte
bash
a exibição de mensagens de erro mais úteis no caso de erro de sintaxe. Você pode simplesmente economizar tempo usando o bash.%
significa o início de suas linhas de comando?$
vez de%
ou#
para o shell raiz.$
e#
...sh
existia bem antes do bash (que significa bourne-again shell). Mas foi muito primitivo e não respondeu a eventos terminais, comoESC
personagens. Entãoksh
veio (também antes do bash), depois o bash iniciado por quem amava a idéia de um shell melhor, mas odiava o ksh. :-)sh
: http://man.cx/shbash
: http://man.cx/bashTL; DR :
bash
é um superconjuntosh
com 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
. Verifiquesh --version
.fonte
Essa pergunta tem sido frequentemente indicada como canônica para pessoas que tentam usar
sh
e ficam surpresas por não estar se comportando da mesma maneirabash
. Aqui está um rápido resumo de mal-entendidos e armadilhas comuns.Primeiro, você deve entender o que esperar.
sh scriptname
, ouscriptname
tiver#!/bin/sh
na linha shebang , deverá esperar umsh
comportamento POSIX .bash scriptname
, ouscriptname
tiver#!/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 emsh
(apenas[
que é mais desajeitado e limitado).sh
não possui matrizes.local
,source
,function
,shopt
,let
,declare
, eselect
não são portáteis parash
. (Algumassh
implementações suportam, por exemplolocal
.)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 porsh
em sistemas que aderem somente a corrente Especificação POSIX e provavelmente não virá por algum tempo).<<<'here strings'
.*.{png,jpg}
e{0..12}
prepara a expansão.Isso está no POSIX, mas pode estar ausente em algumas~
refere-se$HOME
apenas ao Bash (e mais geralmente~username
ao diretório inicial deusername
)./bin/sh
implementações pré-POSIX .<(cmd)
e>(cmd)
.&|
para2>&1 |
e&>
para> ... 2>&1
<>
redirecionamento.${substring:1:2}
,${variable/pattern/replacement}
, conversão caso, etc.$[expression]
sintaxe legada obsoleta que, no entanto, deve ser substituída pela$((expression))
sintaxe aritmética POSIX . (Algumassh
implementações pré-POSIX herdadas podem não suportar isso, no entanto.)$RANDOM
,$SECONDS
,$PIPESTATUS[@]
e$FUNCNAME
são extensões da festança.export variable=value
e[ "x" == "y" ]
que não são portáteis (export variable
devem ser separadas da atribuição de variáveis e a comparação de cadeias portáteis[ ... ]
usa um único sinal de igual).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/bash
linha shebang, mas, no entanto, usarsh scriptname
para 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, poissh
não é uma boa maneira de verificar se o seu script é adequadamente portátil para oash
/dash
/ POSIXsh
ou variantes como o Heirloomsh
fonte
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.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:
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
fonte
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:
fonte
sh
(por isso é uma "subclasse" no sentido OOP) e o estende (por isso tem um superconjunto da funcionalidade).TERMINAL
CONCHA
SH vs. BATER
SH
BATER
MATERIAL DE REFERÊNCIA:
SHELL gnu.org:
BASH gnu.org:
fonte
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.
fonte
Eles são quase idênticos, mas
bash
têm mais recursos -sh
é (mais ou menos) um subconjunto mais antigo debash
.sh
geralmente significa o originalBourne shell
, que é anterior abash
(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/sh
ou usam osh
shell geralmente o fazem para compatibilidade com versões anteriores. Qualquer sistema operacional unix / linux terá umsh
shell. No Ubuntush
frequentemente chamadash
e no MacOS é uma versão POSIX especial dobash
. 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 originalsh
, adiciona mais recursos e procura ser compatível com versões anterioressh
. Em teoria, ossh
programas devem ser executadosbash
.bash
está disponível em quase todas as máquinas linux / unix e geralmente é usado por padrão - com a exceção notável do MacOSzsh
como padrão na Catalina (10.15). O FreeBSD, por padrão, não vem com obash
instalado.fonte
sh
agora é anterior ao POSIX. Atualmente, você espera que qualquer um quesh
você 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./bin/sh
pode ou não pode invocar o mesmo programa que/bin/bash
.sh
suporta 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. Digiteinfo bash
e leia a seção "Recursos do Bash" (seção 6 na versão atual) ou leia a documentação atual online .fonte
sh
fornece apenas um shell POSIX, se você tiver o direitoPATH
configurado no seu shell atual. Não há PATH-name definido que fornece um shell POSIX.sh
não era necessariamente mesmo dando-lhe um shell POSIX, no Solaris, por exemplo.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.
fonte
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
fonte
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.
fonte