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?
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?
Respostas:
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.
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.
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:
shcomo dashpadrão;initramfs. Ele usa a ashimplementação do shell.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.
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
Para meus próprios scripts, prefiro shpelos seguintes motivos:
bash, eles precisam tershExistem 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.
basha 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 #...
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. :-)
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.
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.
sh scriptname, ou scriptnametiver #!/bin/shna linha shebang , deverá esperar um shcomportamento POSIX .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.local, source, function, shopt, let, declare, e selectnão são portáteis para sh. (Algumas shimplementações suportam, por exemplo local.)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).<<<'here strings'.*.{png,jpg}e {0..12}prepara a expansão.~refere-se $HOMEapenas ao Bash (e mais geralmente ~usernameao diretório inicial de username)./bin/shimplementações pré-POSIX .<(cmd)e >(cmd).&|para 2>&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 . (Algumas shimplementações pré-POSIX herdadas podem não suportar isso, no entanto.)$RANDOM, $SECONDS, $PIPESTATUS[@]e $FUNCNAMEsão extensões da festança.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).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
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:
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.
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:
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:
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.
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.
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.
/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.
shnã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.
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
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.