De Diferença entre bash e sh :
ABck à pergunta: Se você tiver
/bin/sh
um link para o bash, o bash não se comportará da mesma maneira quando chamado,/bin/sh
como é chamado quando/bin/bash
. Quando chamado comosh
, ele se limitará principalmente à conformidade com POSIX, além de um conjunto limitado de extensões.
Isso significa que sempre que me deparei com um script de shell no Linux com um shebang para sh:, #!/bin/sh
mesmo que nessa distribuição, bin/sh
seja um link simbólico para outro shell, como dash ou bash, ele deve ser 100% compatível com o shell bourne, pois se limita a um conjunto limitado de extensão? Então eu poderia executá-los no FreeBSD? Há exceção a isso? Ou devo estar seguro em assumir que funcionará?
Portanto, se em uma distro, bin/sh
houver um link simbólico para bin/bash
, e um script usar #!/bin/sh
e o script contiver bashism, ele não será executado, pois o bash gostará do modo sh?
fonte
/bin/sh
como shebang. Um script de shell ainda pode usar explicitamente/bin/bash
. De qualquer forma, a maioria dos scripts shell provavelmente funcionará bem em / bin / sh, mas o problema serão as ferramentas do usuário, por exemplo, a maioria dos scripts shell espera a área de usuário GNU, o que provavelmente será mais um problema do que apenas um erro de sintaxe. Eu também adicionei um link para a referência do bash que lista o comportamento diferente no modo posixParece haver alguma confusão em torno da concha Bourne. O shell Bourne era o shell Unix décadas atrás, nos dias pré-POSIX. Atualmente, "sh" é uma implementação ou outra de um shell que implementa a especificação POSIX, entre as quais temos bash, pdksh, AT&T ksh, novos shell Almquist e seus derivados que foram compatíveis com POSIX (incluindo o "sh" de alguns BSDs). , outros BSDs estão sendo baseados em pdksh e Debian ash (dash)). Até o zsh tem um modo no qual é principalmente compatível com POSIX.
O shell Bourne não é compatível com POSIX e não pode ser encontrado em muitos sistemas atualmente. Onde o shell Bourne é encontrado ou onde não é, sempre haverá um "sh" compatível com POSIX (e não será o shell Bourne), geralmente
/bin
enquanto uma exceção notável (irritante) é o Solaris.Observe que antes do shell Bourne, e estamos falando há mais de 30 anos, "sh" era o shell Thompson. Não estamos mais escrevendo scripts compatíveis com o shell Thompson. Da mesma forma, devemos parar de pensar em "sh" como a casca de Bourne.
Agora "sh" é uma especificação, não há muitas variantes incompatíveis de uma implementação. Isso facilita muito a gravação de scripts portáteis. Basta seguir a especificação .
Isso vale para "sh" e todos os utilitários padrão (sed, cut, tr ...)
fonte
sed -r
. Em sistemas com utilitários baseados em BSD, você usased -E
. O sed do FreeBSD aceita os dois, mas o Mac OS X aceita apenas-E
. E assim por diante.\(...\)\1
os BREs não têm tradução nos EREs padrão).\|
respeite os BREs. Sou a favor de escrever da maneira mais portável possível. Eu estava apenas fazendo a observação (pensei amplamente apreciada) de que isso pode ser doloroso, e às vezes escrever no POSIX simplesmente não é possível. Em algum lugar, existem links que exibem muitas dessas perversões; procurará por eles.${VAR:=stuff...here}
mas muitas conchas não permitem, você precisa colocar aspasstuff...here
.