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 builtins fornece uma lista de comandos. São aqueles os únicos comandos que eu posso usar em um script de shell portátil que funciona em todas as conchas?
  • Um built-in pode ser específico para shell?
  • Os padrões do Linux diferem dos de outros Unixes?
  • E a sintaxe? A pontuação, os operadores, etc. podem ser diferentes em algumas camadas?
por musa 12.09.2011 / 12:37

2 respostas

12

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

Para uma leitura mais completa, você pode conferir o padrão Posix , ao qual todos os shells devem obedecer. Particularmente, o volume em "Shell e utilitários".

O que eu acho mais desafiador do que as diferenças de shell são as diferenças de comando. Muitos sistemas Linux têm o GNU find , mas se você estiver escrevendo um script portátil, não confie no seu próprio man find , porque existem muitos sistemas com o BSD find , que tem um conjunto de recursos diferente . Se você estiver escrevendo scripts para o busybox, descobrirá que existem versões diferentes com nc s totalmente diferentes. Esses são os tipos de coisas que sempre me afetam quando eu implemento um script em diferentes ambientes.

Para ler mais sobre boas práticas de script de shell, há também um bom recurso no blog de David Pashley: Escrevendo Scripts Robustos de Bash Shell

Além disso, leia Gilles respostas e comentários neste site. Ele tem muitas dicas sobre como usar o código portátil.

    
por 12.09.2011 / 14:16
5

Escrever um script de shell em um shell específico significa ter esse shell instalado. O único padrão é ter csh e sh instalado em todas as variantes do Unix. Então, se você quisesse que seu script fosse executado no Solaris, * BSD e GNU, você teria que escrevê-lo, digamos, no shell Bourne.

No entanto, a maioria dos comandos Unix tem diferentes sintaxes sob diferentes implementações - veja em ps no Solaris, FreeBSD e GNU - então, dependendo das ferramentas que você usa, seu script pode não ser portátil de qualquer maneira. Onde o shell está instalado também será importante. É /bin/bash /usr/bin/bash , /usr/local/bin/bash ou algum outro lugar?

Não tenho conhecimento de nenhum padrão que defina um shell. Dê uma olhada em rc ou http://192.220.96.201/es/es-usenix- winter93.html '' > es para invólucros não padronizados estranhos. Entretanto, esses parecem ainda estar de acordo com algumas idéias comuns.

    
por 12.09.2011 / 13:10