Newsgroup: it.comp.os.linux.development
Titolo: Problemi con variabili che contengono asterischi

La variabile
FILES="immagini/1/*.gif immagini/2/*.gif 1/*.class 2/*.class"
deve essere definita all'inizio di uno script; successivamente viene
compilato un file java che crea i files class necessari; per finire
creo il jar con la seguente istruzione:
jar cmf META-INF/MANIFEST.MF ../nomeclasse.jar $FILES
Per quanto, con il comando
echo "$FILES"
io visualizzi il comando corretto, ottengo in esecuzione il seguente
messaggio di errore:
: impossibile trovare il file o la directory
[la cosa strana è che non viene visualizzato, come dovrebbe, il nome
del file non trovato, e apparentemente i files necessari vengono
inseriti nel jar, come se il tentativo fosse stato quello di inserire
anche un file con un nome nullo o formato da caratteri speciali]
Questo messaggio non compare se eseguo
jar cmf META-INF/MANIFEST.MF ../nomeclasse.jar immagini/1/*.gif
immagini/2/*.gif 1/*.class 2/*.class
..., nè se definisco la variabille FILES dopo aver creato i files
*.class.
Ma io ho necessità di definire la variabile prima della creazione,
perchè devo compilare più files, creando altrettanti jar, e non vedo
perchè dovrei ripetere due volte tutta la parte che definisce, a
seconda dei parametri digitati, i valori che devono assumere le
variabili (FILES compreso).
Come posso fare?
Come posso fare?

 jar cmf META-INF/MANIFEST.MF ../nomeclasse.jar $FILES
Tiro ad indovinare...
jar cmf META-INF/MANIFEST.MF ../nomeclasse.jar "${FILES}"
Al limite, metti un bel "set -x" prima del jar (e "set +x" dopo)
e guarda quale e` il comando che cerca di fare...
Facci sapere...
-- 
        Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch

 Al limite, metti un bel "set -x" prima del jar (e "set +x" dopo)
Ho provato, sembra tutto corretto (a parte il fatto che il comando
occupa ben 32 righe e 1/2 a schermo pieno, in risoluzione 1280x1024), a
parte l'ultima riga dove trovo sempre un apice al posto sbagliato
(cambiando la disposizione delle cartelle nella definizione di COMUNI,
sempre al penultimo-ultimo file), ma sembra più un problema di
visualizzazione che effettivo (e, di solito, sembra così anche quando
eseguo il comando, anche se non mi sono messo a controllare uno per uno
se i files sono tutti presenti).
Una cosa non capisco, in particolare: perchè se faccio
COMUNI="1/*.class 2/*.class 3/*.class immagini/*.class immagini/1/*.gif
immagini/2/*.gif immagini/3/*.gif"
la fine del comando diventa:
[omissis] immagini/2/y.gif immagini/2/z.gif 'i'magini/3/*.gif
la posizione degli asterischi mi sembra più che altro un bug; non
capisco perchè immagini/2/*.gif debba essere espanso, mentre
immagini/3/*.gif no...

> la posizione degli asterischi mi sembra più che altro un bug;
volevo dire degli apici, ovviamente...

> Al limite, metti un bel "set -x" prima del jar (e "set +x" dopo)
Dunque, l'espressione più vicina a quanto mi serve la ottengo
effettivamente con:
jar cmf META-INF/MANIFEST.MF ../test.jar "$COMUNI"
Il problema, verificando con set -x, è che anzichè diventare:
jar cmf META-INF/MANIFEST.MF ../test.jar immagini/1/*.gif
immagini/2/*.gif immagini/3/*.gif
diventa invece:
jar cmf META-INF/MANIFEST.MF ../test.jar 'immagini/1/*.gif
immagini/2/*.gif immagini/3/*.gif'
Come posso ottenere il contenuto non espanso di $COMUNI, senza gli
apici anche se sono presenti spazi intermedi?
P.S. Il valore espanso di $COMUNI, invece, sembra generare problemi in
funzione dell'eccessiva lunghezza (più di 80 righe per un comando
sembrano eccessive...).

 immagini/2/*.gif immagini/3/*.gif'
Insomma, bash pensa che "$COMUNI" debba rappresentare necessariamente
UN parametro; quindi, trovando degli spazi intermedi, per evitare che
"$COMUNI" venga 'erroneamente' (?!?) interpretato come successione di
più parametri, inserisce tra apici l'espressione corrispondente.
Il problema è che, invece, "$COMUNI" rappresenta proprio UNA
SUCCESSIONE DI DIVERSI PARAMETRI, con la consegnuenza che il vero
errore è proprio l'inserimento, in sede di esecuzione del comando,
degli apici (con echo, invece, questo non succede).
Si possono evitare questi benedetti apici in quanche maniera? Qualcosa
che significhi "Cara bash,  anche se trovi spazi nel parametro non
metterlo tra apici, riporta semplicemente la stringa così come mamma
l'ha fatta..."

Mi hanno segnalato in un altro newsgroup la soluzione, che posto anche
qui, nel caso possa servire ad altri:
shopt -s nullglob
jar cmf META-INF/MANIFEST.MF classname.jar $COMMON
Grazie a tutti.

 immagini/2/*.gif immagini/3/*.gif"
Aha. Vedo, vedo. Prova con:
COMUNI="1/*.class 2/*.class 3/*.class immagini/*.class immagini/1/*.gif \
immagini/2/*.gif immagini/3/*.gif"
Con la definizione di cui sopra hai inserito un bel CR nel bel mezzo
del valore della variabile. Lo "\" alla fine della prima linea dovrebbe
evitarlo.
Ciao,


 del valore della variabile.
No, nell'originale non c'era. Succede quando si manda un'e-mail che
venga automaticamente mandata a capo una riga troppo lunga.
In ogni caso, la soluzione (anche se non ho capito proprio al 100%
perchè) è quella che ho riportato sopra.
Ciao, e grazie.

Marco ha scritto:

E invece no, la soluzione era molto più banale di quanto pensassi:
avevo modificato un file scritto in Windows, ed era rimasto qualche a
capo stile Windows dopo la fine della dichiarazione di alcune
variabili.
Tolti quelli, senza nessuna opzione funziona tutto perfettamete.