Newsgroup: it.comp.os.linux.iniziare
Titolo: bash script, parametri

Salve,
ho un problema in apparenza banale con uno script di shell (bash) che 
proprio non riesco a risolvere:
lo script deve prendere una lista di file di un certo tipo (ad esempio 
*.pippo) e passarla come argomento da riga di comando ad un'altro 
programma. Ci sono diverse soluzioni tra cui una delle tante che ho 
provato č
#!/bin/bash
....
comando $( ls *.pippo )
....
Il problema sorge quando ci sono dei file *.pippo il cui nome contiene 
degli spazi, in questo caso "comando" interpreta quel nome di file come 
se fossero due parametri distinti e questo non va bene per i miei scopi.
Digitando a mano (direttamente sulla shell ossia , in maniera 
interattiva) il problema si risolve banalmente quotanto i parametri 
singolarmente ossia:
$ comando "param1" "param2 con spazio" "param3" ...
Tuttavia non sono riuscito a riprodurre da script questo comportamento. 
Ne ho provate molte, tra qui quella che mi sembra piu' logica č :
#!/bin/bash
....
comando $( ls -Q *.pippo )
....
l'opzione -Q di ls produce infatti un listato in cui ogni singolo 
filename č quotato con le virgolette doppie (ossia queste: ")
Cosě facendo pero' "comando" ugualmente interpreta erroneamente i 
parametri ossia il file "con spazio.pippo" viene considerato come due 
parametri distinti, il parametro
"con
e il parametro
spazio.pippo"
Credendo che dipendesse da uno strano modo di interpretare la riga di 
comando dell'eseguibile che voglio lanciare ho fatto dei test lanciando 
un semplice script che visualizza i parametri che riceve,ottenendo perň 
lo stesso comportamento. Da shell interattiva le virgolette si comortano 
come tali, mentre da script facendo una command substitution vengono 
interpretati letteralmente...
Come posso fare ? probabilmente la soluzione č banale ma mi sfugge, e le 
ho provate tutte! (tutti i tipi di quoting, creazione della lista con 
cicli for ecc...)
Marco
P.S. non sono proprio alle primissime armi, ho postato qui perche' il 
problema sembrerebbe abbastanza semplice...sembrerebbe...comunque sono 
gradite anche spiegazioni tecniche dettagliate o riferimenti!

 programma.
Provato ad usare xargs?
man xargs per ulteriori info.
Davide

 done
Primo
Primo
Secondo
Terzo
Cosi' lo spazio viene trattato come separatore di campi,
invece se faccio
bash-2.05a$ IFS=^M [1]
bash-2.05a$ for i in $(ls); do echo $i; done
Primo
Primo Secondo
Terzo
Cosi' invece no :)
[1] ^M viene ottenuto con Ctrl-V + invio
HTH
-- 
Sono un servitore del Fuoco Segreto, e reggo la fiamma di Anor.
A nulla ti servira' il fuoco oscuro, fiamma di Udun.
Torna nell'Ombra! Non puoi passare.

 
Ciao,
la tua idea mi sembrava ottima, ma ho cantato vittoria troppo presto...
infatti così è vero che la lista è corretta, ma poi il comando 
successivo la interpreta come un unico parametro!
Se invece utilizzo la variabile IFS modificata solo per generare la 
lista ho esattamente lo stesso problema...
posto lo script che sto usando per testare (si comporta esattamente come 
il comando vero per quel che riguarda i parametri), a questo script devo 
passare come parametri una lista di file:
#!/bin/bash
echo "Comando 1: $1"
echo "Comando 2: $2"
echo "Comando 3: $3"
Queste sono alcune delle prove che ho fatto, senza successo!
IFS=^M;./comm $(for i in $( ls *.pippo ); do echo $i; done)
oppure
FILE_LIST=""
for X in *.pippo
do
         echo "$X"
         FILE_LIST="$FILE_LIST \"$X\" "
done
./comando $FILE_LIST
Sto sfogliando inutilmente da ore la "Advanced Bash-Scripting Guide"...
Comunque grazie mille!
Marco

 Davide
I primi tentativi sono andati a vuoto,ma alla fine con
ls -Q *.pippo| xargs comando
ha funzionato! grazie mille della dritta!
Sarei poi veramente "felice" se riuscissi a capire la differenza tra 
usare xargs piuttosto che la normale command substitution...ossia tra 
questi due comandi quale è la differenza:
comando $( ls -Q *.pippo )
ls -Q *.pippo| xargs comando
cosa fa la command substitution in piu' o in meno rispetto ad xargs ???
Marco