O que não é específico do shell?

9

Sob algumas respostas, vejo comentários que recomendam evitar comandos específicos do shell nas respostas.

Como sei quais comandos, operadores, etc existem em todos os shells? Existe uma lista de padrões?

  • man builtinsfornece uma lista de comandos. Esses são os únicos comandos que posso usar em um script de shell portátil que funciona em todos os shells?
  • Um built-in pode ser específico do shell?
  • Os padrões para Linux diferem dos de outros Unixes?
  • E a sintaxe? Pontuação, operadores, etc. podem ser diferentes em algumas conchas?
musa
fonte

Respostas:

12

O Wiki de Greg tem um post sobre a adaptação de scripts bash para o Dash, que aponta muitos 'bashisms' - recursos extras que não são padrão, mas fazem parte do bash. Evitar esses basismos pode ajudar a tornar seu script mais amigável para diferentes ambientes. Isso responde particularmente a algumas de suas perguntas. Por exemplo, sim, existem operadores que diferem (gostam ==), mas há um conjunto Posix padrão que deve funcionar em todos os ambientes.

Para uma leitura mais completa, você pode conferir o padrão Posix , ao qual todas as conchas devem estar em conformidade. Particularmente, o volume em "Shell & Utilities".

O que acho mais desafiador do que as diferenças de shell são as diferenças de comando. Muitos sistemas Linux têm GNU find, mas se você estiver escrevendo um script portátil, não confie em si próprio man find, porque existem muitos sistemas por aí com o BSD find, que possui um conjunto de recursos diferentes. Se você estiver escrevendo scripts para o busybox, verá que existem versões diferentes com ncs totalmente diferentes . Esse é o tipo de coisa que sempre me ocorre quando implanto um script em ambientes diferentes.

Para uma leitura extra sobre boas práticas de script de shell, também há um bom recurso no blog de David Pashley: Escrevendo scripts robustos para shell Bash

Leia também as respostas e comentários de Gilles neste site. Ele tem muitas dicas sobre como usar o código portátil.

Shawn J. Goff
fonte
5

Escrever um script de shell em um shell específico significa instalá-lo. O único padrão é ter cshe shinstalar sobre todas as variantes do Unix. Portanto, se você quiser que seu script seja executado no Solaris, * BSD e GNU, precisará escrevê-lo, por exemplo, no shell Bourne.

No entanto, a maioria dos comandos do Unix possui diferentes sintaxes em diferentes implementações - veja psSolaris, FreeBSD e GNU -, portanto, dependendo de quais ferramentas você usa, seu script pode não ser portátil. Onde o shell está instalado também será importante. É /bin/bash /usr/bin/bash, /usr/local/bin/bashou em algum outro lugar?

Não conheço nenhum padrão que defina um shell. Dê uma olhada em rc ou http:// 192.220.96.201 /es/es- usenix -winter93.html`"> para obter invólucros estranhos e fora do padrão, mas esses parecem ainda estar em conformidade com algumas idéias comuns.

Sardathrion - contra o abuso de SE
fonte
7
POSIX define sh.
precisa saber é o seguinte