Newsgroup: it.comp.os.linux.sys
Titolo: Problemi con DASH (non lava... :-)

Sto diventando matto: ho uno script che inizia con 
#!/bin/dash
che restituisce questo errore:
./nomeScript.sh: 139: Bad substitution
Se pero' elimino 
#!/bin/dash
funziona tutto.
La shell di default e' dash e
# ls -al /bin/
lrwxrwxrwx  1 root root      4 gen  1 18:50 sh -> dash
lrwxrwxrwx  1 root root      4 ott 30 13:57 sh.distrib -> dash
Qualcuno ha idea di come sia possibile e di come posso rimediare?
Grazie!
Jey
-- 
Non prendere la vita troppo sul serio... non ne uscirai mai vivo
http://www.joram.it/servizi/consulente.htm

 lrwxrwxrwx  1 root root      4 ott 30 13:57 sh.distrib -> dash
Evidentemente il tuo script ha dei "bashism" e non è POSIX standard.
Riscrivilo o invocalo con #!/bin/bash

 Riscrivilo o invocalo con #!/bin/bash
L'unica shell installata e' la dash, se avesse dei "bashismi" (cosa
possibile), perche' funzionerebbe se non antepongo #!/bin/dash ?


 possibile), perche' funzionerebbe se non antepongo #!/bin/dash ?
Ma /bin/sh punta a dash?

 wrote:

Si, l'avevo scritto:
# ls -al /bin/
lrwxrwxrwx  1 root root      4 gen  1 18:50 sh -> dash
lrwxrwxrwx  1 root root      4 ott 30 13:57 sh.distrib -> dash


 Qualcuno ha idea di come sia possibile e di come posso rimediare?
Potresti farci vedere la riga 139 dello script in questione?
Grazie
Dimitre

 Potresti farci vedere la riga 139 dello script in questione?
La riga 139 contiene solo un "fi", il problema per dash e' la riga 94:
listaSuCuiOperare=${listaSuCuiOperareORIGINALE//_/.}
che dovrebbe sostituire nella variabile listaSuCuiOperareORIGINALE tutti
gli _ con i . e salvare il risultato nella variabile listaSuCuiOperare
Grazie a te


 gli _ con i . e salvare il risultato nella variabile listaSuCuiOperare
Grazie!
dash non supporta quella sintassi.
Hai provato per caso a lanciarlo con -xv e vedere come cambia l'output
quando lo esegui con e senza shebang?
Potresti inserire i seguenti comandi all'inizio dello scipt ed eseguirlo 
senza il shebang (#! ...):
ps -p$$ -oargs= | {
   read x; x=${x#-} x=${x% *}
   type "$x"
   }
Sono curioso di vedere l'output di type.
Dimitre

 dash non supporta quella sintassi.
Si, lo so, me l'ha fatto notare il mitico checkbashisms, infatti ora la
riga e':
listaSuCuiOperare=`echo $listaSuCuiOperareORIGINALE | tr '[_]' '[.]'`
cmq non era questo il problema.
Forse non hai seguito il thread dall'inizio, ti faccio un copia-incolla
ho uno script che inizia con 
#!/bin/dash
che restituisce questo errore:
./nomeScript.sh: 139: Bad substitution
Se pero' elimino 
#!/bin/dash
funziona tutto.
La shell di default e' dash e
# ls -al /bin/
lrwxrwxrwx  1 root root      4 gen  1 18:50 sh -> dash
lrwxrwxrwx  1 root root      4 ott 30 13:57 sh.distrib -> dash
e poi, piu' in la' nel thread, ho scritto anche
L'unica shell installata e' la dash, se avesse dei "bashismi" (cosa
possibile), perche' funzionerebbe se non antepongo #!/bin/dash ?
Il mio problema e' che senza #!/bin/dash funziona e non capisco perche'.


 Il mio problema e' che senza #!/bin/dash funziona e non capisco perche'.
Ed č per questo che ho chiesto:
1. Le eventuali differenze nell'output di trace - se veramente lo script 
eseguito senza shebang č sempre interpretato dallla dash,
una possibile spiegazione potrebbe essere che per un qualche motivo,
invocato in questo modo, lo script non esegua il codice in questione
(la riga specifica).
2. L'aggiunta di una pipeline all'inizio dello script, per identificare
il programma che lo esegue (che sia effettivamente la dash, per ora č 
solo un'ipotesi).
Riporto ancora una volta la pipeline da aggiungere:
ps -p$$ -oargs= | {
   read x; x=${x#-} x=${x% *}
   type "$x"
   }
Grazie
Dimitre

 solo un'ipotesi).
/bin/dash /usr/local/bin/aggiornamentoListe_old.sh: not found
Grazie a te
Joram


 /bin/dash /usr/local/bin/aggiornamentoListe_old.sh: not found
Questa esecuzione è con o senza shebang?
Questa è la verifica che vorrei fare:
$ cat aggiornamentoListe_old.sh
#!/bin/dash
ps -p$$ -oargs= | {
   read x; x=${x#-} x=${x% *}
   type "$x"
   }
$
$
$ ./aggiornamentoListe_old.sh
/bin/dash is /bin/dash
$ sed -i 1d aggiornamentoListe_old.sh
$ ./aggiornamentoListe_old.sh
/bin/sh is /bin/sh
Grazie
Dimitre

> svolgere le rimanenti (tipo) 250 righe di script.
Per farla breve - avrei bisogno di vedere l'output dei seguenti commandi:
cat <<\! > /tmp/check_shell.sh
#!/bin/dash
set -xv
ps -p$$ -oargs= | {
   read x; x=${x#-} x=${x% *}
   type "$x"
   }
!
chmod u+x /tmp/check_shell.sh
/tmp/check_shell.sh
sed -i 1d /tmp/check_shell.sh
/tmp/check_shell.sh
Grazie
Dimitre

Per farla breve - avrei bisogno di vedere l'output dei seguenti commandi:
[...........]
Bellissimo tutto quello che si scopre seguendo i NG!
Da me la seconda volta lo esegue ovviamente bash,
ma Jey c'ha Linux senza bash.. vedremo cosa fa.
[~]dalet_$: /tmp/check_shell.sh
ps -p$$ -oargs= | {
   read x; x=${x#-} x=${x% *}
   type "$x"
   }
+ + ps -p2954 -oargs=
read x
+ x=/bin/dash /tmp/check_shell.sh x=/bin/dash
+ type /bin/dash
/bin/dash is /bin/dash
[~]dalet_$: sed -i 1d /tmp/check_shell.sh; /tmp/check_shell.sh
ps -p$$ -oargs= | {
   read x; x=${x#-} x=${x% *}
   type "$x"
   }
++ ps -p2959 -oargs=
++ read x
++ x='/bin/bash -c sed -i 1d /tmp/check_shell.sh; /tmp/check_shell.sh'
++ x='/bin/bash -c sed -i 1d /tmp/check_shell.sh;'
++ type '/bin/bash -c sed -i 1d /tmp/check_shell.sh;'
/tmp/check_shell.sh: line 6: type: /bin/bash -c sed -i
1d /tmp/check_shell.sh;: not found
Che casino! non avrei dovuto darle insieme, adesso lo
rifaccio da solo:
[~]dalet_$: /tmp/check_shell.sh
ps -p$$ -oargs= | {
   read x; x=${x#-} x=${x% *}
   type "$x"
   }
++ ps -p2964 -oargs=
++ read x
++ x='/bin/bash -c /tmp/check_shell.sh'
++ x='/bin/bash -c'
++ type '/bin/bash -c'
/tmp/check_shell.sh: line 6: type: /bin/bash -c: not found
Boh.. non lo capisco "bash -c", ci studiero' sopra, io
non gliel'ho di certo dato!
-- 
Saluti, Dalet


Sě,
questo non l'avevo previsto. Modificando:
x=${x% *}
in
x=${x%% *}
dovrebbe risolvere il "not found".
Potrei sapere che distribuzione (e che versione) di Linux usi?
Grazie
Dimitre

Potrei sapere che distribuzione (e che versione) di Linux usi?
Ho la Debian testing, perfettamente aggiornata ogni
giorno (o quasi), ecco l'uname:
[~]dalet_$: uname -a
Linux e8400 2.6.38-2-686-bigmem #1 SMP Thu Apr 7 06:05:53 UTC 2011
i686 GNU/Linux
-- 
Saluti, Dalet

 Ho la Debian testing, perfettamente aggiornata ogni
[...]
Grazie!
Dimitre

Il 21-04-2011, Radoulov, Dimitre dice:
sed -i 1d /tmp/check_shell.sh
Scusa (scusate) una cosa a proposito: questo comando di sed
che dici, non puo' mai essere pericoloso come questo:
grep -v minnie /tmp/pippo > /tmp/pippo 
in cui posso trovarmi /tmp/pippo di zero byte? cioe'
dovrei dare piu' correttamente:
grep -v minnie /tmp/pippo > /tmp/pippo2
e poi eventualmente: cat /tmp/pippo2 > /tmp/pippo.
-- 
Saluti, Dalet

 e poi eventualmente: cat /tmp/pippo2>  /tmp/pippo.
Sě,
la seconda versione č piů "robusta".
Dimitre

 $ ./aggiornamentoListe_old.sh
bash is /bin/tcsh
{: Command not found.
Missing }.
Ok, ora procedo con 
apt-get remove tcsh bash bash-completion --purge
avviso che sto per distruggere il mondo, confermo, rilancio lo script...
Finalmente! Da lo stesso errore sia con #!/bin/dash che senza.
Non so come ringraziarti!


 Bellissimo tutto quello che si scopre seguendo i NG!
Io ho imparato gran parte di quello che so sui NG: davvero non si
finisce mai :-)


 ./script_name > out_no_shebang.txt # script con shebang commentato
[...]
Ovviamente intendevo:
  ./script_name > out_shebang.txt 2>&1
                                  ^^^^
  ./script_name > out_no_shebang.txt 2>&1
                                     ^^^^
Dimitre

                                      ^^^^
In questo caso non cambia granche' perche' lo stdout e lo stderr vanno
rediretti su un file per quasi tutti i comandi e poi vengono inviati per
email come report delle operazioni effettuate e segnalazione degli
errori.


 errori.
OK,
volevo solo correggere quello che avevo scritto :)
Ciao
Dimitre