Pagina 1 di 1

[RISOLTO] Nota su shell dash

MessaggioInviato: 02/11/2017, 9:51
da sirio81
Ciao a tutti, scrivo solo per condividere una curiosità.
Non mi sono mai messo a studiare le differenze tra la shell bash a la dash.

Oggi ho preparato un piccolo script per controllare con quale ip sto uscendo (ho 2 linee in ufficio).
Se non esco dalla linea "giusta", faccio stampare un avviso:

Codice: Seleziona tutto
#!/bin/dash
ip_current="$(dig +short @resolver1.opendns.com myip.opendns.com)"
ip_provider_x="1.2.3.4"

[ "$ip_current" == "$ip_provider_x" ] || wall "Provider X is down!"


Con mia sorpresa, viene stampato un messaggio di errore:
Codice: Seleziona tutto
/usr/local/bin/check_active_network.sh: 6: [: 62.94.229.113: unexpected operator

Le possibilità sono 2: l'operatore == non è usato in dash, oppure gli ip vengono interpretati come numeri anziché come stringhe.

Cerco un po' di documentazione.
Faccio il giro da wikipedia per trovare il sito ufficiale che è composto da una singola pagina, modifica l'ultima volta nel 2011, con zero documentazione.
Correggetemi se sbaglio, ma il man sembra essere l'unica fonte ufficiale di informazioni.

Nel man leggo
Enclosing characters within double quotes preserves the literal meaning of all characters except dollarsign ($), backquote (`), and backslash (\).


Quindi propendo a pensare che '==' non sia usato in dash come operatore di confronto.
Continuo la lettura del man...

Nella sezione "Flow-Control Constructs -- if, while, for, case" non parlano di operatori di confronto.
Finalmente trovo la risposta nella sezione
Codice: Seleziona tutto
[ expression ]
            s1 = s2       True if the strings s1 and s2 are identical.
            s1 != s2      True if the strings s1 and s2 are not identical.

Re: Nota su shell dash

MessaggioInviato: 02/11/2017, 18:29
da gajm
@sirio81, nel caso non li conoscessi, ti segnalo un paio di strumenti molto utili che puoi trovare nei repo.
Il primo è "checkbashisms", che fa parte del pacchetto "devscripts", sviluppato proprio per controllare gli script d'avvio quando si è passati da bash a dash.
Output dello script che hai postato:
Codice: Seleziona tutto
$ checkbashisms aaa.sh
possible bashism in aaa.sh line 5 (should be 'b = a'):
[ "$ip_current" == "$ip_provider_x" ] || wall "Provider X is down!"

In alternativa c'è anche "shellcheck", ha propositi più ampi, ma può essere usato anche per controllare eventuali bashismi.
Output dello script che hai postato:
Codice: Seleziona tutto
$ shellcheck aaa.sh

In aaa.sh line 5:
[ "$ip_current" == "$ip_provider_x" ] || wall "Provider X is down!"
                ^-- SC2169: In dash, == in place of = is not supported.

N.B. Entrambi gli strumenti si basano sullo shabang per fornire l'output (un '#!/bin/bash' nel tuo script non restituirebbe nulla).

Re: Nota su shell dash

MessaggioInviato: 03/11/2017, 8:10
da sirio81
Grazie della dritta Gajm!

Re: [RISOLTO] Nota su shell dash

MessaggioInviato: 04/11/2017, 17:11
da gajm
Anche se nel frattempo hai aggiunto il [RISOLTO], visto che dash ha alcune peculiarità rispetto allo standard POSIX, aggiungo un link interessante per i "naviganti" interessati all'argomento. :)
http://mywiki.wooledge.org/Bashism

Re: [RISOLTO] Nota su shell dash

MessaggioInviato: 06/11/2017, 8:44
da sirio81
Grazie!