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
?
Do que precisamos estar cientes ao programar bash
e sh
?
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
?
Do que precisamos estar cientes ao programar bash
e 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
...). bash
també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.
bash
começou como uma sh
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 como sh
.
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
como dash
padrão;initramfs
. Ele usa a ash
implementaçã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 sh
que, por um longo tempo, não era compatível com POSIX; uma implementação gratuita está disponível no projeto Heirloom .Como você pode descobrir o que /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 é:
% 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 -L
flag 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 à -samefile
opçã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/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 exemplo
#!/bin/dash
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. Plain sh
é uma linguagem de programação muito minimalista.
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, como ESC
personagens. Então ksh
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/sh
bash
: http://man.cx/bash
TL; DR : bash
é um superconjunto sh
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
. Verifique sh --version
.
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 maneira bash
. Aqui está um rápido resumo de mal-entendidos e armadilhas comuns.
Primeiro, você deve entender o que esperar.
sh scriptname
, ou scriptname
tiver #!/bin/sh
na linha shebang , deverá esperar um sh
comportamento POSIX .bash scriptname
, ou scriptname
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 em sh
(apenas [
que é mais desajeitado e limitado).sh
não possui matrizes.local
, source
, function
, shopt
, let
, declare
, e select
não são portáteis para sh
. (Algumas sh
implementaçõ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 sh
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.~
refere-se $HOME
apenas ao Bash (e mais geralmente ~username
ao diretório inicial de username
)./bin/sh
implementaçõ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 sh
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, usar sh 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, pois sh
não é uma boa maneira de verificar se o seu script é adequadamente portátil para o ash
/ dash
/ POSIX sh
ou 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 bash
têm mais recursos - sh
é (mais ou menos) um subconjunto mais antigo de bash
.
sh
geralmente 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/sh
ou usam o sh
shell geralmente o fazem para compatibilidade com versões anteriores. Qualquer sistema operacional unix / linux terá um sh
shell. No Ubuntu sh
frequentemente chama dash
e 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 sh
programas devem ser executados bash
. 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 MacOS zsh
como padrão na Catalina (10.15). O FreeBSD, por padrão, não vem com o bash
instalado.
sh
agora é anterior ao POSIX. Atualmente, você espera que qualquer um que sh
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. Digite info bash
e leia a seção "Recursos do Bash" (seção 6 na versão atual) ou leia a documentação atual online .
sh
fornece apenas um shell POSIX, se você tiver o direito PATH
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.
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.