[RISOLTO] Nota su shell dash

Bash, Perl, Python, Ruby, ...
Rispondi
sirio81
Hero Member
Hero Member
Messaggi: 1104
Iscritto il: 13/02/2006, 5:04
Contatta:

[RISOLTO] Nota su shell dash

Messaggio 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.
Ultima modifica di sirio81 il 03/11/2017, 8:10, modificato 1 volta in totale.
gajm

Re: Nota su shell dash

Messaggio 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).
sirio81
Hero Member
Hero Member
Messaggi: 1104
Iscritto il: 13/02/2006, 5:04
Contatta:

Re: Nota su shell dash

Messaggio da sirio81 »

Grazie della dritta Gajm!
gajm

Re: [RISOLTO] Nota su shell dash

Messaggio 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
sirio81
Hero Member
Hero Member
Messaggi: 1104
Iscritto il: 13/02/2006, 5:04
Contatta:

Re: [RISOLTO] Nota su shell dash

Messaggio da sirio81 »

Grazie!
Rispondi