Prendi spunto dagli Autotools: atteniti al minimo comune denominatore di Bourne e POSIX shell - eventualmente aumentato da sed
- se devi scrivere qualcosa che deve funzionare ovunque . Potrebbero esistere sistemi in cui qualcosa si rompe, ma è possibile aggirare tali problemi riscrivendo.
Ad esempio, alcuni sistemi antichi hanno problemi con errori di espansione in test
, ovvero [
:
if [ $foo = bar ] ; then...
quindi la pratica di Autoconf è di riscriverla tra virgolette doppie con un prefisso a singolo carattere, in questo modo:
if [ x"$foo" = "xbar" ] ; then...
Puoi anche usare "x$foo"
qui. Questo protegge dalla possibilità che $foo
potrebbe essere un'opzione valida per test(1)
, e poiché [
è un alias per test
, potrebbe interpretare erroneamente l'espressione. La soluzione è creare una situazione in cui l'argomentazione sconosciuta [
con x
cui iniziare sempre , il che significa che non può avere un significato speciale [
.
(Autoconf consiglia inoltre di utilizzare test
invece di [
, ma tale consiglio nasce come reazione a possibili conflitti con M4 , che utilizza anche [
nella sua sintassi.)
awk è POSIX , quindi teoricamente è disponibile ovunque. È anche in Busybox , quindi avrai awk
un'implementazione anche in alcuni sistemi Linux embedded molto restrittivi. Eppure, sarei meno sorpreso di imbattersi in un sistema senza awk
rispetto sed
. Suppongo che si riduca alla complessità: strumenti più semplici hanno maggiori probabilità di sopravvivere al triage aggressivo.
Perl non fa parte di alcuno standard diffuso, POSIX o altro, quindi semplicemente non puoi contare su di esso se non sai nulla in anticipo sull'ambiente di destinazione. Perl non è installato di default in:
- Cygwin
- FreeBSD e NetBSD
- Installazioni "minimal" per alcuni Linux, incluso Slackware
- molti Linux embedded che si basano principalmente su Busybox per la loro area utente
Il manuale di Autoconf contiene un capitolo sulla programmazione della shell portatile che dovrebbe esservi utile. Gli strumenti di ultima sezione riguarda piace sed
, awk
e molti altri.