colchetes simples e duplos e portabilidade

4

Encontrei algumas respostas muito boas aqui sobre as diferenças entre [ e [[ em declarações 'if'. Para shells com nomes específicos, parece ser uma boa ideia usar [[ over [ (e também é mais rápido).

Ainda não estou claro sobre portabilidade, no entanto. Se meu objetivo é escrever um script para shells compatíveis com POSIX, scripts com os quais gostaria de começar com #!/bin/sh , como essa sintaxe é permissível. Pelo que eu li, os colchetes duplos não estão no padrão POSIX, mas no "mundo real", quanto de um problema realmente é este?

Suponho que o que eu quero dizer é que eu quero um script portátil, mas é bom o suficiente para ele funcionar em todos os shells POSIX viáveis, digamos, 2000-2005. Significando, não é parte do padrão, é verdade, mas realisticamente qualquer shell de 2005 em diante é quase certo de aceitar a sintaxe.

Além disso, uma pergunta mais geral sobre portabilidade de script e POSIX: como outros autores lidam com isso? Eu entendo que os casos de uso e o público-alvo governam grande parte da decisão, mas você tenta ficar o mais próximo possível do POSIX para reduzir possíveis incompatibilidades da Internet em geral, ou você se beneficia de todas as coisas boas que a maioria das conchas suporte que ainda tem que torná-lo em qualquer lugar perto de um padrão POSIX?

Comecei tentando tornar a maioria dos meus scripts compatíveis com Bourne e POSIX. Com o passar do tempo, porém, lendo mais a documentação do Bash e vendo os scripts de outras pessoas na Net, tenho que dizer que usar esses outros recursos pode fazer com que os scripts sejam muito mais fáceis de ler e, em muitos casos, muito menores.

    
por JetpackJohn 22.09.2014 / 10:01

1 resposta

6

If my goal is to write a script for POSIX compatible shells, scripts that I would begin with #!/bin/sh, how permissible is this [[ syntax.

Nem um pouco . Muitos sistemas modernos baseados em Linux usam dash como /bin/sh por padrão, o que é totalmente compatível com POSIX e não mais, e assim [[ não funcionará. Isso inclui todos os Debian e Ubuntu release e seus derivados, bem como muitas outras distribuições. Historicamente, esses sistemas costumavam usar o Bash lá e deliberadamente mudaram para melhorar o desempenho.

Muitos outros sistemas, incluindo a maioria dos BSDs e a maioria dos Unices comerciais, também não suportam [[ e nunca têm: seu sh é somente POSIX, ou suas extensões não incluem a sintaxe [[ . O sh do OpenBSD suporta uma versão de [[ , que é um pouco diferente do Bash; Eu não sei de nenhum outro que faça isso, embora eles possam existir. Caso contrário, são apenas os sistemas que usam o Bash como /bin/sh (ou menos frequentemente zsh , ou ainda menos alguns outros) onde [[ funcionará em algo declarado como sendo sh script.

Por outro lado, a grande maioria dos sistemas tem Bash instalado na prática, e apenas fazer com que seu script seja executado explicitamente com bash será suficiente para todos eles. O modo de emulação de sh do Bash sempre foi quebrado de qualquer maneira.

Como você está confiando nos recursos do Bash, não vejo nenhum motivo para declará-lo como um script sh : apenas diga #!/bin/bash e termine, usando [[ tanto quanto você quiser - ou melhor ainda, para a exclusão total de [ . Se você quiser a portabilidade máxima, use [ ou test e POSIX sh 1 e escreva com cuidado.

1 Note que alguns dos Unices comerciais possuem, ou tiveram,% POS_ sh como /bin/sh ; para trabalhar uniformemente naqueles que você precisa para executar os scripts com o caminho completo para o sistema POSIX sh .

    
por 22.09.2014 / 10:23