Quando é importante escrever scripts portáteis?

18

A maioria dos códigos que escrevo é em PHP. Recentemente, comecei a aprender scripts de shell. A maioria dos recursos e tutoriais que encontrei são específicos do Bash. Alguns alertam sobre basismos e outros não. Eu tenho lido muito aqui e Stack Overflow.

Sempre que uma resposta usa basismos , alguém inevitavelmente comenta para dizer:

Você não deve usar <inserir basismo aqui>. Não é portátil.

Isso acontece mesmo quando a pergunta foi marcada bash. Para mim, é como dizer a um programador PHP que não deve usar código novo no PHP 5 porque não pode ser usado com o PHP 4. Ou dizer a alguém que não deve escrever algo para Mac porque não pode ser usado no Windows.

Quando escrevo em PHP, escolho um requisito mínimo e escrevo código compatível com a frente . Não me preocupo em torná-lo compatível com versões anteriores .

Se eu uso #!/bin/bashcomo shebang, por que não devo usar basismos? Estou começando a ficar com a impressão de que algumas pessoas como a festança bashisms (trocadilho intencional) apenas para o bem dela.

As pessoas freqüentemente usam bashe shellintercambiável - provavelmente devido ao fato de que o bash é o shell default em muitos sistemas. Para que eu possa entender adicionando um comentário para avisar que o código usa bashisms, mas não entendo a implicação de que é errado usá-los.

Obviamente, se estou escrevendo um script estritamente para uso pessoal, posso escrevê-lo no idioma que desejar. Mas gostaria de pensar que parte do código que escrevo possa ser útil para outras pessoas.

Tentei procurar uma resposta para minha pergunta antes de postar. Encontrei muitas informações sobre como testar a portabilidade, mas não consegui encontrar nada sobre quando é importante fazer isso.

Então, quando é importante escrever scripts portáteis?

Por exemplo,

  • que tipos de scripts devem ser o mais portáveis ​​possível?
  • quão comum são os sistemas que não têm o Bash instalado?
  • se o sistema tiver o Bash instalado, ele também terá a versão GNU do find e outros utilitários?
toxalote
fonte
4
Posicionei essa pergunta com vantagem e respondi, mas quanto mais penso nisso, apenas as duas últimas perguntas se encaixam no site. Os outros são "principalmente baseados em opiniões".
Jordanm
11
Há também um aspecto meta nesta pergunta: Embora possa não ajudar na resposta inicial, comentários como "isso não é portátil" podem ser muito úteis para outros leitores que se deparam com a pergunta / resposta meses ou anos depois.
Bananguin 14/03
2
Os comentários do @Bananguin que dizem "isto não é portátil" não me incomodam. Isso é apenas um FYI. Eu mesmo fiz esses tipos de comentários. É o "Você não deve usar ..." que me incomoda. Isso implica que há algo errado com a resposta. Isso seria válido se a resposta estivesse recomendando código obsoleto, por exemplo. Por isso, fiquei me perguntando o que há de errado com o Bash.
toxalot
2
+1. Especialmente quando a pergunta tem uma bashetiqueta sozinha, alguém comenta "É basismo e não é portátil". Quando respondo a uma pergunta marcada C, não me importo se é portátil Javaou não.
PP
4
Eu sinto que é sempre bom ressaltar que é um bashrecurso específico, e não portátil, assim como eu indicaria que uma extensão específica do GNU está sendo usada para algum utilitário (mesmo que a pergunta tenha sido marcada como Linux). Eu nunca vi alguém dizer "isso é um basismo e você nunca deve usá-lo".
Martin Tournoij

Respostas:

15

Como membro desta comunidade, muitas vezes não vejo pessoas desconsiderando bashismos por coisas que visam o bash. Ao falar sobre portabilidade, GNUisms são muito piores que bashisms. Desde que você use bashseu shebang, você pode esperar que o script seja executado usando bash. No entanto, você não pode garantir a versão, a menos que verifique explicitamente. A versão 4 do Bash trouxe alguns recursos úteis, como matrizes associativas, mas o Bash v3 ainda é amplamente usado no OS X e no RHEL 5.

que tipos de scripts devem ser o mais portáveis ​​possível?

É mais sobre suas necessidades e sobre o que você escolhe apoiar como desenvolvedor. Se você estiver escrevendo um script de instalação para um aplicativo que suporte todos os tipos de * NIX, a portabilidade será muito importante.

quão comum são os sistemas que não têm o Bash instalado?

O FreeBSD e o Solaris 10 são exemplos de sistemas que não vêm com o bash instalado por padrão. A maioria dos sistemas Linux o possui, com exceção dos sistemas embarcados.

se o sistema tiver o Bash instalado, ele também terá a versão GNU do find e outros utilitários?

Não, e esse é o verdadeiro problema da portabilidade. Se a portabilidade for importante, você deve usar apenas os recursos de comando do shell definidos pelo padrão POSIX. Os utilitários GNU podem ser instalados em sistemas não-GNU, como o FreeBSD, mas é improvável que sejam os primeiros no PATH, e você não pode confiar nessas ferramentas a serem instaladas.

jordanm
fonte
11
Eu acho que é mais no SO do que aqui, onde muitas vezes vejo pessoas desconsiderando os basismos . Só sei que notei com frequência o suficiente para me frustrar e me levar a fazer essa pergunta.
toxalot
11
Portanto, se os utilitários GNU estiverem instalados, mas não primeiro no PATH, existe uma maneira de chamá-los especificamente? Caso contrário, por que eles estão instalados?
toxalot
@toxalot: binários e scripts são chamados explicitamente usando caminhos absolutos.
Bananguin 14/03
11
@Banguanguin Então, se alguém tivesse os utilitários Bash e GNU instalados (mas não no PATH), eles poderiam usar o script se o editarem para usar caminhos absolutos finde quaisquer outros utilitários específicos do GNU que eu usei? Obviamente, isso não seria fácil para o script do instalador. Mas estou pensando em colocar algo no GitHub para que outros possam agarrar, se assim o desejarem. Não me importo que não seja portátil para todos os sistemas. Só não quero que seja inútil em muitos sistemas.
039;
11
@ toxalot: sim, isso poderia funcionar. se você colocar algo como FIND=/opt/gnu/dispicable/bin/findno início do script e, em seguida, usar em ${FIND}vez dele, finddê às pessoas um lugar (!) para colocar os caminhos de instalação e fazer com que o script use as ferramentas corretas.
Bananguin
5

Então, quando é importante escrever scripts portáteis?

que tipos de scripts devem ser o mais portáveis ​​possível?

Quando você os usa para o seu ambiente de trabalho e trabalha (ou poderia no futuro) em máquinas diferentes - E não deseja reescrever suas ferramentas antes de começar a trabalhar.

por exemplo: um script / rmsubstituição de lixo


Mark Stewart:

... para o meu kit de ferramentas de solução de problemas, presumo que só terei o shell vi e Korn. E tento usar comandos que funcionam com a maioria dos tipos de Unix.

user3082
fonte
3
Eu gosto de alguns dos slash "Bash-isms", mas para o meu kit de ferramentas de solução de problemas, presumo que só terei o shell vi e Korn. E tento usar comandos que funcionam com a maioria dos tipos de Unix. Dessa forma, eu estou pronto para fazer a triagem em um sistema doente sem ter que me preocupar com o comportamento do comando ps, se Bash, Perl ou PHP está lá ou onde eles estão.
Mark Stewart