[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RiminiLUG-General] bash redirezione I/O PIPE e filtri
On Tue, May 03, 2011 at 07:31:31PM +0200, Giovanni Pasini wrote:
> > Visto che hai iniziato le danze:
> >
> > for i in *.c.txt; do echo mv "'$i'" "'$(basename "$i" .c.txt).c'";
> > done |bash -x
> >
> > Leggermente diversa ma, mi pare, con gli stessi risultati.
> > Anch'io mi aspettavo di dover ridefinire IFS, ma ho visto che non è
> > servito, e mi pare che sia settato some spazio. Quindi il ciclo
> > for...in cicla correttamente anche sui files con spazi ?!? mi sarei
> > aspettato di no!
il for cicla correttamente perche' l'espansione dei nomi dei file la fa la
shell e non il tuo $(ls)! (in pratica la shell "conosce" quali sono nomi di
file nel primo caso, mentre nel secondo e' semplicemente l'output di un
comando e non sa come splittarlo)
godog@clamp:~/tmp/t$ ls *.c
+ ls 'foo bar.c' nospazi.c
+ /bin/ls --color=auto 'foo bar.c' nospazi.c
foo bar.c nospazi.c
godog@clamp:~/tmp/t$ ls $(ls *.c)
++ ls 'foo bar.c' nospazi.c
++ /bin/ls --color=auto 'foo bar.c' nospazi.c
+ ls foo bar.c nospazi.c
+ /bin/ls --color=auto foo bar.c nospazi.c
/bin/ls: cannot access foo: No such file or directory
/bin/ls: cannot access bar.c: No such file or directory
nospazi.c
> giusto Ivan!, in effetti scomodare la modifica di IFS può non servire...
>
> Ecco una versione funzionante, forse più leggibile (per
> me) dell'esempio di Ivan, ma è la stessa minestra direi.
>
> touch 'foo bar2.c.txt' 'foo bar.c.txt' 'foo_bar.c.txt' 'foo_bar2.c.txt'
> for i in *.c.txt; do echo mv \'$i\' \'$(basename "$i" .c.txt).c\'; done
> | bash -x
esatto! (seguita da spiegazione impeccabile del perche' e percome)
> La versione precedentemente proposta:
> touch 'foo bar2.c.txt' 'foo bar.c.txt' 'foo_bar.c.txt' 'foo_bar2.c.txt'
> IFS=$(echo -en "\n\b") #The Bash for loop splits using a whitespace
> (space, tab or newline)
> for i in *.c.txt; do echo mv \'$i\' \'$(basename $i .c.txt).c\'; done
> | bash
> unset IFS
>
> ---e alcune note---
> Se pongo IFS=$(echo -en "\n")
> var="ciao come va.txt"
> basename $var .txt #la variabile non viene spezzata in
> corrispondenza degli spazi e quindi funziona senza apici e si ottiene
> ciao come va
>
> questo spiega perché funziona anche questa versione.
esattamente! non sono personalmente un fan di IFS, se si puo' evitare di
cambiare tanto meglio. (a voler essere pignoli un nome di un file puo'
contenere anche \n, gli unici byte che non puo' contenere sono (in decimale) 0
e 47)
non mi piace troppo l'approccio "| bash" perche' introduce i problemi di cui
vi siete accorti ossia bisogna prestare molta attenzione a fare escaping del
quoting (!)
Giovanni si e' anche accorto un altro problema ossia quello delle espasioni di
file che falliscono e viene passata la stringa letterale:
godog@clamp:~/tmp/t$ for i in *.d ; do ls "$i" ; done
+ for i in '*.d'
+ ls '*.d'
+ /bin/ls --color=auto '*.d'
/bin/ls: cannot access *.d: No such file or directory
godog@clamp:~/tmp/t$ shopt -s failglob
+ shopt -s failglob
godog@clamp:~/tmp/t$ for i in *.d ; do ls "$i" ; done
-bash: no match: *.d
(le cose dette valgono (almeno) per bash)
purtroppo non ho trovato una soluzione soddisfacente, a parte forse cose tipo
find -print0 -type f | xargs -0 ls -la
ma anche qui poi farci cose piu' complicate diventa molto faticoso anche se
find e' piuttosto potente
> NOTA: credo che sia importante rimettere a posto IFS con:
> unset IFS
>
> In linea di massima credo che questa analisi sia corretta, ma anche
> io non sono particolarmente ferrato (del resto è un bel casino 'sta
> roba...), spero che serva a qualcuno.
> Vi prego di evidenziare le inesattezze, grazie.
>
> > C'è da dire anche questo:
> > # ls -l `which sh`
> > lrwxrwxrwx 1 root root 4 31 gen 11.54 /bin/sh -> dash
eheh anche questa e' un'altra cosa antipatica come faceva notare Daniele,
l'errore piu' comune che ho trovato nei miei script e' questo:
godog@clamp:~/tmp/t$ dash
$ echo -e 'foo\n'
-e foo
$
godog@clamp:~/tmp/t$ echo -e 'foo\n'
foo
(a questo proposito c'e' il programma "checkbashisms" nel pacchetto
devscripts, che non e' perfetto ma aiuta)
filippo
--
Filippo Giunchedi - http://esaurito.net - 0x6B79D401 - ⠠⠵
Everyone is entitled to his own opinion, but not his own facts.
-- Daniel Patrick Moynihan