Newsgroup: it.comp.os.linux.iniziare
Titolo: problema con shell script

 Perche' il seguente script funziona solo se lo lancio 'a mano'?
 Se provo a eseguirlo in cron mi da l'errore:
 /usr/local/bin/cdvrfy.sh: [: : integer expression expected
 /usr/local/bin/cdvrfy.sh: [: : integer expression expected
 
 Se lo lancio a mano funziona ...
 
#-----------------------
#!/bin/bash
OP=`du -c /scambio/Storage/|grep totale |cut -f 1 -d$'\t'`
LIMITP='614400'
LIMITS='716800'
DUO=`du -c -h /scambio/Storage/|grep totale |cut -f 1`
if [ $OP -le $LIMITP ]
then
echo  "La dimensione della directory Storage e' di $DUO ...bla bla | mail -s "Verifica CD"  mit00
elif [ $OP -ge $LIMITS ]
then
echo 'La dimensione della directory Storage eccede la capacità del CD'|mail -s 'Warning Verifica CD' mit00
else
echo "La dimensione della directory Storage e' di $DUO...bla bla" | mail -s "Verifica CD - OK" mit00
fi
#----------------------
 
ciao
-- 
The Moon is Waning Gibbous (98% of Full)

 #----------------------
L'ho provato è funziona perfettamente!
Mi sono ritrovato una mail (dead.letter a dir la verità)
che mi informa delle dimensioni dell'area di storage.
:^)
- --
Sergio Pedone
GNU/Linux Slackware
Java
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)
iD8DBQFBDWC8uH+De3vsiOcRAm8rAJ9Fl9hW+4sCrpS+8e9Ula6tInWcMACdHHhC
8y74JmABQa1PiUtgpxyraQ8=
=8naT
-----END PGP SIGNATURE-----

 
 A me funziona se lo eseguo come comando in console, ma se lo metto
 in esecuzione con cron mi restituisce un errore.
 E' quello che non comprendo.
-- 
The Moon is Waning Gibbous (97% of Full)

  E' quello che non comprendo.
Cron non imposta la PATH di ricerca dei comandi, la console 'si' (prova con 
' echo $PATH ' ).
P.S. è una FAQ

Writing on [ it.comp.os.linux.iniziare ] in reply to Giuseppe Della Bianca:

OK non hai letto il post ;)
Lo script viene eseguito da cron (ho indicato il percorso completo del
comando) ma l'errore che mi da e':
  /usr/local/bin/cdvrfy.sh: [: : unary expression expected
  /usr/local/bin/cdvrfy.sh: [: : unary expression expected
E' l'output all'esecuzione del comando interno 'test' per verificare 
le stringhe.
 
 if [ $OP -le $LIMITP ]
 if [ $OP -ge $LIMITS ] 
Dal man di test infatti leggo:
arg1 OP arg2
 OP puo' essere  -eq, -ne, -lt, -le, -gt, o -ge. Questi operatori numerici
 binari restituiscono vero se arg1 è uguale, diverso, minore, minore e uguale
 maggiore o maggiore e uguale di arg2, rispettivamente. 
 arg1 e arg2 possono essere interi positivi, interi negativi, o espressioni
 speciali -l stringa, che valutano la lunghezza di stringa.
 Infatti le stringhe in input $OP $LIMITP $LIMITS che do' a test, sono numeri
 interi quindi la stringa viene accettata, il problema e' che se viene eseguito 
 da cron lo script pero' mi esce con quell'errore mentre lanciato in
 shell funziona perfettamente. Per me e' un mistero ...
 
 
 
-- 
The Moon is Waning Gibbous (96% of Full)

 OK non hai letto il post ;)
OK non hai afferrato il punto.  ;-)
quando metti OP='du -c ... ' non metti il path assoluto del
comando "du".
In alternativa, metti un "export PATH=<percorsi vari>"
in testa allo script.
bye G.L.
-- 
« E' assolutamente evidente che l'arte del cinema
  si ispira alla vita, mentre la vita si ispira alla TV »
(Woody Allen)

 
 Grazie per la risposta, purtroppo non cambia niente, se lo esegue in cron
 (sebbene lo script venga indicato con il path completo) mi restituisce
 l'errore tutto bene invece se lo lancio io:
 /usr/local/bin/cdvrfy.sh: [: -le: unary operator expected
 /usr/local/bin/cdvrfy.sh: [: -ge: unary operator expected
 
 :(
 
 abbiate pazienza riposto lo script
#--------------------------------------------------
#!/bin/sh
OP=`/usr/bin/du -c /scambio/Storage/|grep totale |cut -f 1 -d$'\t'`
LIMITP='614400'
LIMITS='716800'
DUO=`/usr/bin/du -c -h /scambio/Storage/|grep totale |cut -f 1`
 if [ $OP -le $LIMITP ]
 then
 echo  "La dimensione della directory Storage e' di $DUO Dimensione insufficiente..." | mail -s "Verifica CD"  user@mail
 elif [ $OP -ge $LIMITS ]
 then
 echo 'La dimensione della directory Storage eccede la capacità del CD'|mail -s 'Warning Verifica CD' user@mail
 else
 echo "La dimensione della directory Storage e' di $DUO. Si puo' procedere..." | mail -s "Verifica CD - OK" user@mail
 fi
#----------------------------------------------------
Mistero sempre piu' fitto, altri spunti? :(
 
-- 
The Moon is Waning Gibbous (95% of Full)

 Mistero sempre piu' fitto, altri spunti? :(
"#!/bin/sh" deve essere la _prima linea_, senza quel
commento che la precede, altrimenti chissa' quale interprete
si va a scegliere. Se qualcosa non dovesse ugualmente funzionare,
prova a cambiarlo in /bin/bash.


 
 Il commento l'ho messo solo nel post per segnare l'inizio dello script
 Gia' provato anche /bin/bash.
-- 
The Moon is Waning Gibbous (92% of Full)

 Gia' provato anche /bin/bash.
mboh, ci vorra' una macumba...
Provato a lanciarlo come "/bin/bash -c <shell_script>" ?


 
 
 Se lancio io funziona, e' quando parte in cron che
 fa cilecca. 
-- 
The Moon is Waning Gibbous (91% of Full)

  fa cilecca. 
Quello mi ero chiaro, infatti intendevo mettere quella linea
di comando in cui viene chiamata esplictamente la shell
in cron.


 
 Cron lo trova e lo esegue, in tutti i modi, ho provato a mettere 
 il comando /usr/bin/test al posto del comando /usr/bin/[
 ma non cambia niente.
 Ho settato PATH="/usr/local/bin:/sbin:/usr/bin:/usr/sbin:/bin"
 Non mi riconosce l'espansione di $OP come una 'integer expression'.
 Ma perche' se lo lancio io funziona ?
 grazie 


  Ma perche' se lo lancio io funziona ?
Si puo' guardare come e' stato inserito nel crontab?


 
# crontab -l | grep cdvrfy
 28 20 1 * *     /usr/local/bin/cdvrfy.sh
 ma ho provato anche con :
 28 20 1 * *     /bin/bash -c /usr/local/bin/cdvrfy.sh
 grazie per la pazienza
 
 
 
-- 
The Moon is Waning Gibbous (90% of Full)

  if [ $OP -ge $LIMITS ] 
Perchè non provi a mettere nello script una riga con
echo $OP, $LIMITP, $LIMITS > /tmp/controllo
in modo da vedere poi nel file /tmp/controllo che valori hanno quelle 
variabili quando usi lo script con cron?
Si potrebbe capire ad esempio se il problema è in una o in tutte.
Ciao, Paolo

 OK non hai letto il post ;)
]zac[
Faccio finta di non aver letto QUESTO post.
- Devi settare la PATH in modo da trovare tutti i comandi che usi
all'interno dello script.
- Non mi sembra saggio dare per scontato che la lingua utilizzata da cron
sia l'italiano (>>>du<<<grep>>>totale<<<); ribadisco che cron non setta
molte cose che invece nella console trovi impostati.
- E fare un po' di debug? se testi un comando alla volta e ne visualizzi il
risultato scommettiamo che risolvi in 10'? e mettere degli echo $xxxx per
vedere se c'è qualche variabile con valori errati?

 Ciao, Paolo
 EUREKA, la variabile $OP e' vuota!
 
-- 
The Moon is Waning Gibbous (89% of Full)

 
E chi va a pensare che grep parla in inglese a cron e con me parla
italiano!
Per evitare di tradurre in inglese i termini si potrebbe  mettere 
export LANG=it_IT@euro 
nello script?
Grazie a tutti per la pazienza.
-- 
The Moon is Waning Gibbous (89% of Full)

 export LANG=it_IT@euro
]zac[
Non è una buona idea, uno script non dovrebbe dipendere dal tipo di lingua
disponibile ma usare la sua lingua 'interna' (LANG ' C ' o qualcosa di
simile), il che vuol dire di usare i messaggi cosi come sono scritti (in C
o C++) all'interno del programma dal programmatore, senza nessuna
traduzione.
In sintesi le scritte interne al programma ci sono sempre e non cambiano, le
traduzioni .... dipende.
Comunque ribadisco che è fortemente consigliato leggere le FAQ e applicare
un po' di sano debug.