Come posso verificare la conformità POSIX degli script di shell?


72

Considerando che POSIX è la cosa più vicina a uno standard comune tra tutti i sistemi, sono interessato a sapere se esiste una shell che lo supporta esclusivamente. Sebbene la maggior parte delle shell moderne fornisca supporto per POSIX (e eseguirà script POSIX compatibili senza alcun problema), non fanno un buon lavoro nel sottolineare funzionalità non conformi.

Esiste una shell che implementa solo POSIX e POSIX, in modo tale da generare un errore per qualsiasi funzionalità non conforme?

MODIFICA Voglio chiarire che non sto chiedendo suggerimenti generali per la scrittura di script di shell portatili. La domanda correlata menzionata nei commenti copriva già questo. Ho pensato a questa domanda quando ho scoperto che bashha --posixun'opzione, ma solo per scoprire che influenza solo alcuni comportamenti di inizializzazione che non è esattamente quello che sto cercando.



@Gilles: Forse dovrei menzionare che mi sono imbattuto in questa domanda, ma solo una risposta ha suggerito di provare dash. Ho citato la portabilità come contesto generale per la mia domanda, ma non era questo il suo vero intento.
rahmu,

Certo, volevo che le due domande fossero collegate perché potrebbero interessare le stesse persone. Non sono duplicati in alcun modo. A proposito, posh è un test migliore per la conformità POSIX rispetto al trattino.
Gilles 'SO- smetti di essere malvagio' il

2
busybox è abbastanza vicino solo a POSIX e POSIX. Una cosa che può farti inciampare è se installi anche altri pacchetti (come diffutils), allora potrebbe aggiungere funzionalità. Acquista linux alpini livecd s', che si inizia con un ambiente busybox puro. Alpine utilizza la libreria musl C in modo da non ottenere estensioni GNU che possono aggiungere funzionalità come espressioni regolari estese.
Michael Fox,

Risposte:


37

Sfortunatamente, "portabile" è di solito un requisito più forte di "conforme POSIX" per gli script di shell. Cioè, scrivere qualcosa che gira su qualsiasi shell POSIX non è troppo difficile, ma farlo funzionare su qualsiasi shell del mondo reale è più difficile.

Puoi iniziare installando ogni shell nel gestore dei pacchetti, in particolare i poshsuoni di debian come quello che desideri (Ordinary SHell conforme alle norme). La politica di Debian è POSIX con alcune eccezioni ( echo -nspecificato, local...).

Oltre a ciò, i test devono coprire alcune shell (/ bin / sh in particolare) su una vasta gamma di piattaforme. Ho testato su Solaris (/ bin / sh e xpg4 / sh) e BSD. AIX e HP-UX sono molto conformi e non causano problemi. bash è un piccolo mondo a sé stante.

Consiglierei la guida di Autoconf alla shell portatile , che è assolutamente geniale e fa risparmiare molto tempo. Grandi pezzi di esso sono obsoleti, ma va bene; salta TruUnix e Ultrix e così via se non ti interessa!


poshsuona davvero come quello che sto chiedendo. Farò dei test appena posso.
Rahmu,

1
Ho risposto prima di individuare la domanda correlata! posh è una cosa debian, quindi non verrà impacchettato su tutti i sistemi. Inoltre, la shell non è necessariamente la cosa di cui preoccuparsi di più; incompatibilità sed sono un grosso problema, per esempio.
Nicholas Wilson,

Non mi preoccuperei di eseguire il porting su Solaris / bin / sh aka Bourne shell (che non è POSIX). Solaris come tutti i moderni unice ha una shell POSIX, sembra che non sia nella solita posizione (/ usr / xpg4 / bin / sh)
Stéphane Chazelas,

Purtroppo, spediamo script che devono essere eseguiti su almeno / bin / sh. Non è poi così male ... Preferirei non doverlo fare però.
Nicholas Wilson,

2
Il motivo per cui tratto / bin / sh come importante è perché è invocato dallo shebang in così tanti script. "/ usr / bin / env sh" non è certo un miglioramento. Se hai intenzione di fare qualche sforzo per far funzionare qualcosa su shell non POSIX, penso che potrei anche dare la priorità a ogni sistema / bin / sh. Non passerà molto tempo prima che alcuni clienti eseguano lo script con la shell predefinita, che non è poi così irragionevole.
Nicholas Wilson,

28

È possibile utilizzare ShellCheck (GitHub) come linter per gli script della shell. C'è anche una versione online .

Per rilevare problemi di compatibilità POSIX (ad es. SC2039 ), dovrebbe essere la riga shebang dello script della shell #!/bin/sh. Puoi anche passare --shell=sha shellcheck.

Esempio ( test.sh):

#!/bin/sh
if [[ $HOSTNAME == test ]]; then
    echo fail &> foo
fi

Risultato ( shellcheck test.sh):

In test.sh line 2:
if [[ $HOSTNAME == test ]]; then
   ^-- SC2039: In POSIX sh, [[ ]] is undefined.
      ^-- SC2039: In POSIX sh, HOSTNAME is undefined.    

In test.sh line 3:
    echo fail &> foo
              ^-- SC2039: In POSIX sh, &> is undefined.

1
In tutti questi anni e non ho mai sentito parlare di ShellCheck ... grazie per il link!
Ton van den Heuvel,

Il miglior strumento di sempre! Soprattutto avere una versione online di esso è fantastico controllare rapidamente un pezzo di codice!
Mecki,

12

Bash verrà eseguito in modalità conforme a POSIX se la POSIXLY_CORRECTvariabile di ambiente è impostata. Dalla manpage:

   POSIXLY_CORRECT
          If  this  variable  is  in the environment when bash starts, the
          shell enters posix mode before reading the startup files, as  if
          the  --posix  invocation option had been supplied.  If it is set
          while the shell is running, bash enables posix mode, as  if  the
          command set -o posix had been executed.

Anche molte altre utility GNU onoreranno POSIXLY_CORRECT, quindi se sei su un sistema con strumenti prevalentemente GNU (ad esempio la maggior parte dei sistemi Linux), questo è un buon inizio se il tuo obiettivo è la conformità POSIX.


21
Anche in modalità POSIX, bash consentirà comunque alcune funzionalità non POSIX come [[.
Giordania,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.