Cobrindo apenas 1) da sua pergunta.
Naturalmente, as APIs sempre podem mudar à vontade de seus criadores e, assim, quebrar software dependente em qualquer idioma. Dito isso, a grande ideia das APIs " I / O das ferramentas Unix" é que praticamente não há nenhuma (talvez 0x0a
como fim da linha). Um bom script filtra os dados com as ferramentas do Unix, em vez de criá-los. Isso significa que seu script pode quebrar porque a especificação de entrada ou saída mudou, mas não porque o formato de E / S (novamente, não há realmente um) das ferramentas individuais usadas no script foi alterado (porque algo que realmente não existe) não pode realmente mudar).
Passando por uma lista de ferramentas básicas, há poucas que eu também atribuiria produtor , em oposição a apenas filtro:
-
wc - imprime o número de bytes, palavras, linhas - muito formato simples, assim, é absolutamente improvável que mude e, além disso, não é muito provável que seja usado em um script.
-
diff - evoluíram diferentes formatos de saída, mas não ouvi falar de nenhum problema. Também não é normalmente usado sem supervisão.
-
date - Agora, aqui realmente temos que cuidar do que produzimos, especialmente em relação à localidade do sistema. Caso contrário, o formato de saída é RFC, dado que você não especifica exatamente você mesmo.
-
cal - não vamos falar sobre isso, eu sei que o formato de saída difere muito entre os sistemas.
-
ls , quem , w , último - não posso ajudar se você quiser analisar ls, apenas não era para ser. Além disso, quem, por último, são mais interativos; Se você usá-los em um script, você deve cuidar do que faz.
-
time foi apontado em outro post. Mas sim, é o mesmo que com ls. Mais para uso interativo / local. E o bash builtin é muito diferente da versão GNU, e a versão GNU tem erros não corrigidos há muitos anos. Apenas não confie nisso.
Aqui estão as ferramentas que esperam um formato de entrada específico mais específico do que ser um fluxo de bytes:
-
bc , dc - calculadoras. Já no lado mais agressivo das coisas (na verdade, não as uso em scripts) e presumivelmente em formatos de E / S muito estáveis.
Existe outra área com um risco muito maior de quebra, a saber, a interface de linha de comando. A maioria das ferramentas possui recursos diferentes nos vários sistemas e na linha do tempo. Exemplos são
-
Todas as ferramentas que usam regex - regex podem alterar o significado com base na localidade do sistema (por exemplo, LC_COLLATE) e há muitas sutilezas e peculiaridades nas implementações de regex.
- Simplesmente não use switches sofisticados. Você pode facilmente usar
man 1p find
, por exemplo, para ler a página de localização do POSIX em vez da página de manual do sistema. No meu sistema, preciso de manpages-posix instalado.
E mesmo quando você usa essas opções, normalmente não haverá erros introduzidos e envenenarão seus dados. A maioria dos programas simplesmente se recusará a trabalhar com um switch desconhecido.
Para concluir, eu diria que o shell tem realmente o potencial de ser uma das linguagens mais portáteis (é portátil quando você faz um script portável). Compare com as suas linguagens de script favoritas, onde ocorrem erros sutis, ou o seu programa compilado favorito, que irá ceder a compilação.
Além disso, nos raros lugares onde a quebra pode ocorrer devido a incompatibilidades, provavelmente não seria por causa do tempo induzido, mas por causa da diversidade entre os diferentes sistemas (ou seja, se funciona para você, o fez 20 anos antes e em 20 anos também). Isso é um corolário da simplicidade das ferramentas.