Tutte le varianti del linguaggio shell Bourne sono oggettivamente terribili rispetto ai moderni linguaggi di scripting come Perl, Python, Ruby, node.js e persino (probabilmente) Tcl. Se devi fare qualcosa anche un po 'complicato, sarai più felice a lungo termine se usi uno dei precedenti invece di uno script di shell.
L'unico vantaggio che il linguaggio shell ha ancora rispetto a quei linguaggi più recenti è che qualcosa che si chiama /bin/sh
è garantito su qualsiasi cosa che pretenda di essere Unix. Tuttavia, quel qualcosa potrebbe non essere nemmeno conforme a POSIX; molti degli Unix proprietari legacy hanno bloccato il linguaggio implementato da /bin/sh
e le utility nel PATH predefinito prima delle modifiche richieste da Unix95 (sì, Unix95, venti anni fa e oltre). Potrebbe esserci un set di Unix95, o anche POSIX.1-2001 se sei fortunato, strumenti in una directory che non si trova sul PERCORSO predefinito (es. /usr/xpg4/bin
) Ma non è garantito che esistano.
Tuttavia, le basi di Perl hanno più probabilità di essere presenti su un'installazione Unix arbitrariamente selezionata rispetto a Bash. (Con "le basi di Perl" intendo che /usr/bin/perl
esiste ed è una versione , forse piuttosto vecchia, di Perl 5, e se sei fortunato sono disponibili anche i moduli forniti con quella versione dell'interprete.)
Perciò:
Se stai scrivendo qualcosa che deve funzionare ovunque che pretende di essere Unix (come uno script "configura"), devi usare #! /bin/sh
e non devi usare alcuna estensione. Oggi scriverei shell conforme a POSIX.1-2001 in questa circostanza, ma sarei pronto a correggere POSIXismi se qualcuno chiedesse supporto per il ferro arrugginito.
Ma se siete non scrivere qualcosa che deve lavorare ovunque, allora il momento si è tentati di utilizzare qualsiasi da bash a tutti, si dovrebbe smettere e riscrivere l'intera cosa in un linguaggio di scripting meglio invece. Il tuo sé futuro ti ringrazierà.
(Quindi, quando è appropriato usare le estensioni di Bash? Al primo ordine: mai. Al secondo ordine: solo per estendere l'ambiente interattivo di Bash - ad esempio per fornire un completamento intelligente delle schede e istruzioni fantasiose.)
#!/bin/sh
e non usare nient'altro che quello fornito dalla shell originale.