[RISOLTO] Nota su shell dash

Bash, Perl, Python, Ruby, ...

[RISOLTO] Nota su shell dash

Messaggioda sirio81 » 02/11/2017, 9:51

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

Re: Nota su shell dash

Messaggioda gajm » 02/11/2017, 18:29

@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).
gajm
Jr. Member
Jr. Member
 
Messaggi: 60
Iscritto il: 23/08/2016, 13:20

Re: Nota su shell dash

Messaggioda sirio81 » 03/11/2017, 8:10

Grazie della dritta Gajm!
sirio81
Hero Member
Hero Member
 
Messaggi: 1005
Iscritto il: 13/02/2006, 5:04

Re: [RISOLTO] Nota su shell dash

Messaggioda gajm » 04/11/2017, 17:11

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
gajm
Jr. Member
Jr. Member
 
Messaggi: 60
Iscritto il: 23/08/2016, 13:20

Re: [RISOLTO] Nota su shell dash

Messaggioda sirio81 » 06/11/2017, 8:44

Grazie!
sirio81
Hero Member
Hero Member
 
Messaggi: 1005
Iscritto il: 13/02/2006, 5:04


Torna a Scripting

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite