Coprendo solo 1) della tua domanda.
Naturalmente le API possono sempre cambiare a piacimento dei loro creatori e quindi rompere il software dipendente, in qualsiasi lingua. Detto questo, la grande idea delle "API" degli I / O degli strumenti Unix è che praticamente non ce ne sono (forse 0x0a
come fine della linea). Un buon script filtra i dati con gli strumenti Unix invece di crearli. Ciò significa che il tuo script potrebbe interrompersi perché le specifiche di input o output sono cambiate, ma non perché il formato I / O (di nuovo, non ce n'è davvero uno) dei singoli strumenti utilizzati nello script è cambiato (perché qualcosa che in realtà non esiste non posso davvero cambiare).
Scorrendo un elenco di strumenti di base, ce ne sono alcuni che attribuirei anche a produttore , invece di filtrare solo:
- wc - stampa il numero di byte, parole, righe - formato molto semplice, quindi assolutamente improbabile che cambi, e inoltre non molto probabilmente usato in uno script.
- diff - ci sono stati diversi formati di output ma non ho sentito parlare di problemi. Inoltre, normalmente non utilizzato senza supervisione.
- data - Ora qui dobbiamo davvero prenderci cura di ciò che produciamo, soprattutto per quanto riguarda le impostazioni locali del sistema. Ma per il resto il formato di output è RFC dato che non lo si specifica esattamente da soli.
- cal - non parliamone, so che il formato di output differisce molto da un sistema all'altro.
- ls , che , w , ultima - non posso aiuto se si vuole analizzare ls, semplicemente non ero destinato a essere. Inoltre, chi, w, ultimo, sono lister più interattivi; Se li usi in uno script devi prenderti cura di quello che fai.
- il tempo è stato indicato in un altro post. Ma sì, è lo stesso di ls. Altro per uso interattivo / locale. E il built-in bash è molto diverso dalla versione GNU, e la versione GNU ha avuto bug non corretti per molti anni. Basta non fare affidamento su di esso.
Ecco alcuni strumenti che prevedono un particolare formato di input più specifico di un flusso di byte:
- bc , dc - calcolatrici. Già dal lato più intricato delle cose (davvero, non le uso negli script) e presumibilmente formati I / O molto stabili.
C'è un'altra area con un rischio molto più elevato di rottura, ovvero l'interfaccia della riga di comando. La maggior parte degli strumenti ha funzionalità diverse sia tra i sistemi sia attraverso la sequenza temporale. Ne sono esempi
- Tutti gli strumenti che usano regex - regex possono cambiare significato in base alle impostazioni locali del sistema (ad esempio LC_COLLATE) e ci sono molte sottigliezze e peculiarità nelle implementazioni di regex.
- Semplicemente non usare interruttori di fantasia. Ad
man 1p find
esempio, si può facilmente usare per leggere la manpage di POSIX find invece della manpage di sistema. Sul mio sistema, ho bisogno che manpages-posix sia installato.
E anche quando si utilizzano tali interruttori, normalmente non vengono introdotti sottilmente errori e non si avvelenano i dati. La maggior parte dei programmi semplicemente rifiuta di funzionare con un interruttore sconosciuto.
Per concludere, direi che la shell ha effettivamente il potenziale di essere uno dei linguaggi più portatili (è portatile quando si esegue lo script in modo portabile). Confronta con i tuoi linguaggi di script preferiti in cui si verificano errori sottili o il tuo programma compilato preferito che verrà compilato.
Inoltre, nei rari luoghi in cui possono verificarsi rotture a causa di incompatibilità, probabilmente non a causa del tempo indotto, ma a causa della diversità tra i diversi sistemi (il che significa che se funziona per te, lo ha fatto 20 anni prima e lo farà in 20 anni , pure). Questo è un corollario della semplicità degli strumenti.