Existem aproximadamente quatro níveis de portabilidade para scripts de shell (no que diz respeito à linha shebang):
-
Mais portável: use um
#!/bin/sh
shebang e use somente a sintaxe básica do shell especificada no Padrão POSIXO . Isso deve funcionar em praticamente qualquer sistema POSIX / unix / linux. (Bem, exceto o Solaris 10 e versões anteriores, que tinham o verdadeiro shell Bourne legado, precedendo o POSIX de modo não compatível, como/bin/sh
.) -
Segundo mais portável: use uma linha shebang
#!/bin/bash
(ou#!/usr/bin/env bash
) e atenha-se aos recursos do bash v3. Isso funcionará em qualquer sistema que tenha bash (no local esperado). -
Terceiro mais portátil: use uma linha shebang
#!/bin/bash
(ou#!/usr/bin/env bash
) e use os recursos do bash v4. Isso falhará em qualquer sistema que tenha o bash v3 (por exemplo, macOS, que precisa usá-lo por motivos de licenciamento). -
Menos portável: use um
#!/bin/sh
shebang e use extensões bash para a sintaxe do shell POSIX. Isso falhará em qualquer sistema que tenha algo diferente de bash para / bin / sh (como versões recentes do Ubuntu). Nunca faça isso; não é apenas um problema de compatibilidade, é simplesmente errado. Infelizmente, é um erro que muitas pessoas cometem.
Minha recomendação: use o mais conservador dos três primeiros que fornece todos os recursos de shell necessários para o script. Para a portabilidade máxima, use a opção 1, mas, na minha experiência, alguns recursos bash (como arrays) são úteis o suficiente para que eu vá com o número 2.
A pior coisa que você pode fazer é # 4, usando o shebang errado. Se você não tiver certeza de quais recursos são POSIX básicos e quais são extensões bash, fique com o bash shebang (ou seja, a opção nº 2) ou teste o script completamente com um shell muito básico (como dash em seus servidores Ubuntu LTS). O wiki do Ubuntu tem uma boa lista de bashisms a serem observados .
Há algumas informações muito boas sobre a história e as diferenças entre os shells no Unix & Questão do Linux "O que significa ser compatível com sh?" / a> e a pergunta Stackoverflow "Diferença entre sh e bash" .
Além disso, esteja ciente de que o shell não é a única coisa que difere entre sistemas diferentes; Se você está acostumado com o Linux, você está acostumado com os comandos GNU, que têm muitas extensões fora do padrão que você pode não encontrar em outros sistemas Unix (por exemplo, bsd, macOS). Infelizmente, não há regra simples aqui, você só precisa saber o intervalo de variação dos comandos que está usando.
Um dos comandos mais desagradáveis em termos de portabilidade é um dos mais básicos: echo
. Sempre que você usá-lo com alguma opção (por exemplo, echo -n
ou echo -e
) ou com quaisquer escapes (barras invertidas) na sequência para imprimir, versões diferentes farão coisas diferentes. Toda vez que você quiser imprimir uma string sem um avanço de linha depois dela, ou com fugas na string, use printf
(e aprenda como funciona - é mais complicado que echo
é). O comando ps
é também uma bagunça .
Outra coisa geral a ser observada são as extensões recentes / do GNU para a sintaxe da opção de comando: o formato de comando antigo (padrão) é que o comando é seguido por opções (com um único traço e cada opção é uma única letra) , seguido por argumentos de comando. As variantes recentes (e muitas vezes não portáteis) incluem opções longas (geralmente introduzidas com --
), permitindo que as opções sejam exibidas após os argumentos e usando --
para separar as opções dos argumentos.