Quando sh é um link simbólico para bash ou dash, bash limita-se à conformidade com POSIX, portanto deve ser 100% compatível com sh?

6

De Diferença entre o bash e o sh :

ABck to the question: If you have /bin/sh as a link to bash, then bash will not behave the same when called as /bin/sh as it does when called as /bin/bash. When called as sh, it will limit itself to mostly POSIX-compliance plus a limited set of extensions.

Significa que sempre que me deparo com um shell script no Linux com shb: #!/bin/sh , mesmo que nessa distro, bin/sh é um link simbólico para outro shell, como dash ou bash, ele deve ser 100% compatível com o shell bourne, uma vez que se limita a um conjunto limitado de extensão? Então eu poderia executá-los no FreeBSD? Há exceções para isso? Ou eu deveria estar seguro para assumir que isso funcionará?

Então, se em uma distro, bin/sh é um link simbólico para bin/bash , e um script usa #!/bin/sh e o script contém bashism, ele não será executado, já que o bash vai gostar de estar no modo sh?

    
por user1115057 06.08.2012 / 03:42

2 respostas

14

Não, se /bin/sh é um symlink para bash bash entra no modo apenas posix - de homem bash :

When invoked as sh, bash enters posix mode after the startup files are read.

Se você procurar agora o modo posix no bash manpage você verá que alguns recursos embutidos do shell como time ou source se comportam de maneira diferente. Isso é tudo. bashishms como escrever function antes de declarar uma função ou usar source em vez de . ainda funcionará, mas os comandos podem se comportar de maneira diferente.

Então, se /bin/sh é um link simbólico para /bin/bash , todos os bashishms típicos ainda funcionam.

Para uma lista bastante extensa de diferenças no modo Posix, consulte o manual de referência da bash .

    
por 06.08.2012 / 04:27
8

Parece haver alguma confusão em torno do shell Bourne. O shell Bourne foi shell Unix décadas atrás, nos dias pré-POSIX. Hoje em dia "sh" é uma implementação ou outra de uma shell que implementa a especificação POSIX, entre as quais temos bash, pdksh, AT & Ksh, novas invólucros Almquist e seus derivados que se tornaram compatíveis com POSIX (incluindo o "sh" de alguns BSDs, outros BSDs são baseados em pdksh e Debian ash (traço)). Mesmo o zsh tem um modo no qual ele é em grande parte 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" que é compatível com POSIX (e não será o shell Bourne), geralmente em /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 Thompson. Da mesma forma, devemos parar de pensar em "sh" como o shell Bourne.

Agora, "sh" é uma especificação, e não muitas variantes incompatíveis de uma implementação. Isso torna muito mais fácil escrever scripts portáveis. Basta seguir a especificação .

Isso vale para "sh" e todos os utilitários padrão (sed, cut, tr ...)

    
por 23.09.2012 / 15:20