June 10, 2009

POSIX shell scripting

Quando fare script compatibili POSIX?

Vi chiederete quando occorre fare script compatibili POSIX e quando invece usare BASH.
Ci sono tre principali motivi per usare script compatibili POSIX:
  1. Quando la portabilità è importante, se dovete fare uno script che vada praticamente ovunque (Solaris, *BSD, etc) è meglio rimanere compatibili POSIX (ove questo sia possibile senza un eccessivo lavoro).
  2. Per gli script di init (debian, ubuntu, Gentoo, etc) dato che debian e ubuntu usano di default dash come /bin/sh invece di bash e su Gentoo è possibile metterla da baselayout2 (o openrc).
  3. Negli script di autoconf, ./configure deve sempre essere compatibile con POSIX

Che cambia?

Partendo dal presupposto che uno sappia scriptare in bash cosa bisogna fare per rimanere compatibili con POSIX e che features di bash non possono essere usate?
Le differenze più comuni sono:
  1. [ $var1 == $var2 ] questa forma funziona su bash, ma non è definita in POSIX. Il comando test (di cui la sintassi [ ] è un derivato) vuole solo = e non == per comparare due stringhe.
  2. [[ condizione ]] questa è una forma avanzata di test che supporta globbing.Di solito si può riscrivere con [ condizione ].
  3. function foo() function è totalmente inutile, basta levarlo.
  4. a=${b/foo} o a=${b:0:1} POSIX non supporta questo genere di operazioni avanzate su stringhe, usare sed e/o grep e/o cut
  5. type -P programma o type -p programma usare command -v o which (sconsiglio di usare which perché è un programma esterno).

Come verifico se il mio script è compatibile POSIX?

Potete usare checkbashism.pl dai devscripts di debian