ZeroUno ha scritto:Ma in verità non è vero.
In realtà la modalità simil-POSIX di Bash lascia molto a desiderare.
Persino se digiti qualcosa come
Codice: Seleziona tutto
[[ -x $(which uname) ]] && echo -n "YES" || echo -n "NO"
per quella pseudo-sh va sempre bene, sebbene invece avrebbe dovuto dare errore o, nel caso del solo echo, stampare "-n YES"/"-n NO" anziché "YES"/"NO" privato della newline.
Se vuoi una Bash strictly-POSIX devi compilarla con --enable-strict-posix-default --enable-xpg-echo-default --enable-minimal-config.
In quel caso, stai pur tranquillo che avrai una vera shell full-POSIX/SUS. Questa è la configurazione usata dalla sh di Mac OS X, che è certificato come UNIX.
slackware:
solaris
Codice: Seleziona tutto
$ /bin/sh
$ echo $(echo ciao)
syntax error: `(' unexpected
perchè in sh la sintassi $() non esiste.
$(comando) è POSIX, mentre `comando` è considerata una sintassi deprecata e che va usata solo in casi estremi e su sh non POSIX compatibili, come quella che stai usando tu su Solaris. Il problema in questo caso non è di Bash.
Tra l'altro, dato che hai detto che Bash la devi mettere a parte, che release è? Di sicuro non Solaris 11, visto che GNU Bash è la shell utente predefinita, mentre sh dovrebbe essere un symlink a ksh93.
Così come non esiste che funzionano le freccette per riprendere i comandi precedenti, che invece sh su slackware fa.
Questo in realtà non è strettamente collegato a POSIX, quanto al fatto che Bash in Slackware è compilata con il supporto a GNU readline.
se compilo la bourne shell, secondo voi slackware boota?
Non dovrebbe.
rc.S e rc.inet1 fanno uso di array, ed essi non sono definiti in POSIX.
Quei due script sono quelli che mi ricordo di più, ma probabilmente i Bashismi si troveranno anche in altre parti.
Se non sbaglio c'era un progetto su LQ fatto da un tizio che voleva rendere gli script di INIT full-POSIX, ma non ricordo bene.
Ma sinceramente, a che pro?
Io ho una Bash strictly-POSIX in $HOME/.local/bin, ma la uso davvero raramente.
Preferisco più fare uso di
shellcheck, che ha tra l'altro una versione da usare in locale scritta in Haskell, e che risulta davvero comodo se hai bisogno di scrivere script perfettamente aderenti allo standard, o vuoi semplicemente dare un'occhiata alla sintassi prima ancora di eseguire il codice.