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/bash
como 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 bash
e shell
intercambiá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?
fonte
bash
etiqueta sozinha, alguém comenta "É basismo e não é portátil". Quando respondo a uma pergunta marcadaC
, não me importo se é portátilJava
ou não.bash
recurso 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".Respostas:
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
bash
seu shebang, você pode esperar que o script seja executado usandobash
. 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.É 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.
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.
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.
fonte
find
e 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.FIND=/opt/gnu/dispicable/bin/find
no início do script e, em seguida, usar em${FIND}
vez dele,find
dê às pessoas um lugar (!) para colocar os caminhos de instalação e fazer com que o script use as ferramentas corretas.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 /
rm
substituição de lixoMark 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.
fonte