Abrangendo apenas 1) da sua pergunta.
Naturalmente, as APIs sempre podem mudar à vontade de seus criadores e, portanto, quebrar o software dependente, em qualquer idioma. Dito isso, a grande idéia das "APIs" de E / S das ferramentas do Unix é que praticamente não há (talvez 0x0a
como fim de linha). Um bom script filtra os dados com as ferramentas Unix, em vez de criá-los. Isso significa que seu script pode ser interrompido porque as especificações de entrada ou saída foram alteradas, mas não porque o formato de E / S (novamente, não existe realmente) das ferramentas individuais usadas no script foi alterado (porque algo que realmente não existe realmente não posso mudar).
Percorrendo uma lista de ferramentas básicas, há poucas que eu também atribuiria produtor , em vez de apenas filtrar:
- wc - imprime número de bytes, palavras, linhas - formato muito simples, portanto, é absolutamente improvável que seja alterado e, além disso, não é muito provável que seja usado em um script.
- diff - evoluímos diferentes formatos de saída, mas não ouvi nenhum problema. Também normalmente não é usado sem supervisão.
- date - Agora, aqui realmente precisamos cuidar do que produzimos, especialmente em relação à localidade do sistema. Mas, caso contrário, o formato de saída é baseado em RFC, pois você não o especifica exatamente.
- cal - não vamos falar sobre isso, eu sei que o formato de saída difere muito entre os sistemas.
- ls , quem , u , ultimo - não posso ajudar se você quiser analisar ls, simplesmente não era para ser. Além disso, quem, w, por último, são mais interativos; Se você os usar em um script, terá que cuidar do que faz.
- o tempo foi apontado em outro post. Mas sim, é o mesmo que com sl. Mais para uso local / interativo. E o bash embutido é muito diferente da versão GNU, e a versão GNU possui bugs não corrigidos por muitos anos. Só 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 hackish das coisas (na verdade, eu não as uso em scripts) e presumivelmente em formatos de E / S muito estáveis.
Há outra área com um risco muito maior de quebra, a interface da linha de comandos. A maioria das ferramentas possui recursos diferentes nos 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 existem muitas sutilezas e particularidades nas implementações de regex.
- Simplesmente não use interruptores sofisticados. Você pode facilmente usar,
man 1p find
por exemplo, para ler a página de manual de localização do POSIX, em vez da página de manual do sistema. No meu sistema, preciso do manpages-posix instalado.
E mesmo ao usar essas opções, normalmente não há erros sutilmente introduzidos e envenenam seus dados. A maioria dos programas simplesmente se recusa a trabalhar com um switch desconhecido.
Para concluir, eu diria que o shell realmente tem o potencial de ser uma das linguagens mais portáteis (é portátil quando você executa scripts de maneira portável). Compare com suas linguagens de script favoritas onde ocorrem erros sutis ou com seu programa compilado favorito que cederá à compilação.
Além disso, nos raros locais em que 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 funcionar para você, o fez 20 anos antes e ocorrerá em 20 anos). , também). Esse é um corolário da simplicidade das ferramentas.