Pagina 1 di 2

Strano problema con script BASH

Inviato: mer 15 ott 2008, 16:49
da anycolouryoulike
Lo script in questione è questo (copiato da conraid):

Codice: Seleziona tutto

#!/bin/sh
OPTIONS="-avz --delete-after --delete-excluded"
INCLUDE="--include='*/' --include='*.tgz'"
EXCLUDE="--exclude='kdei/' --exclude='*'"
SOURCE="slackware.mirrors.tds.net::slackware/slackware-current/slackware/"
DEST="./current/"
case $1 in
    -c ) echo "/usr/bin/rsync $OPTIONS --dry-run $INCLUDE $EXCLUDE $SOURCE $DEST" ;;
    -d ) echo "/usr/bin/rsync $OPTIONS $INCLUDE $EXCLUDE $SOURCE $DEST" ;;
    * )
        echo "Usage: $(basename $0) [OPTION]..."
        echo -e "  -c\t check for updates"
        echo -e "  -d\t download updates"
        exit ;;
esac
L'echo nel case naturalmente è per il debug, infatti ecco cosa ottengo:

Codice: Seleziona tutto

$ ./current.sh -c
/usr/bin/rsync -avz --delete-after --delete-excluded --dry-run --include='/*/' --include='*.tgz' --exclude='kdei/' --exclude='*' slackware.mirrors.tds.net::slackware/slackware-current/slackware/ ./current/
Se incollo il comando nel terminale ottengo quello che voglio, cioè includo nel trasferimento solo le directory del primo livello, tranne kdei/, e i tgz in esse contenuti.
Invece se lancio il comando tramite lo script togliendo gli echo mi include tutti i file.

Codice: Seleziona tutto

#!/bin/sh
OPTIONS="-avz --delete-after --delete-excluded"
INCLUDE="--include='*/' --include='*.tgz'"
EXCLUDE="--exclude='kdei/' --exclude='*'"
SOURCE="slackware.mirrors.tds.net::slackware/slackware-current/slackware/"
DEST="./current/"
case $1 in
    -c ) /usr/bin/rsync $OPTIONS --dry-run $INCLUDE $EXCLUDE $SOURCE $DEST ;;
    -d ) /usr/bin/rsync $OPTIONS $INCLUDE $EXCLUDE $SOURCE $DEST ;;
    * )
        echo "Usage: $(basename $0) [OPTION]..."
        echo -e "  -c\t check for updates"
        echo -e "  -d\t download updates"
        exit ;;
esac
Davvero strano, e le wildcards hanno il quoting forte e non possono essere espanse.
Ho provato a incollare il comando sia in zsh, sia in bash, sia in sh, e funziona sempre.
Ma non lanciando lo script.
Qualcuno mi sa dare una spiegazione?
Grazie

Re: Strano problema con script BASH

Inviato: mer 15 ott 2008, 17:18
da conraid
penso che sia per il fatto che è dentro una variabile
Io comunque uso i file
EXCLUDE="--exclude-from=exclude-slackware"
INCLUDE="--include-from=include-slackware

Re: Strano problema con script BASH

Inviato: mer 15 ott 2008, 17:57
da Paoletta
se ho capito bene quel che ti succede credo dipenda da questo:

Codice: Seleziona tutto

paoletta@slack ~ $ var='*'
paoletta@slack ~ $ echo $var
Altova Desktop Guida intergalattica per autostoppisti.pdf Mail Regolamento_dei_Dottorati_di_ricerca.pdf ciao eclipse ocaml ocaml-ora-book.pdf workspace
paoletta@slack ~ $ var=\'\*\'
paoletta@slack ~ $ echo $var
'*'
un doppio quoting dovrebbe bastare (se ho capito bene quel che intendi)

Re: Strano problema con script BASH

Inviato: mer 15 ott 2008, 18:06
da sixjan
Paoletta ha scritto:se ho capito bene quel che ti succede credo dipenda da questo:

Codice: Seleziona tutto

paoletta@slack ~ $ var='*'
paoletta@slack ~ $ echo $var
Altova Desktop Guida intergalattica per autostoppisti.pdf Mail Regolamento_dei_Dottorati_di_ricerca.pdf ciao eclipse ocaml ocaml-ora-book.pdf workspace
paoletta@slack ~ $ var=\'\*\'
paoletta@slack ~ $ echo $var
'*'
un doppio quoting dovrebbe bastare (se ho capito bene quel che intendi)
Asciugamano sempre appresso? ;-)

Re: Strano problema con script BASH

Inviato: mer 15 ott 2008, 18:58
da anycolouryoulike
Paoletta ha scritto:se ho capito bene quel che ti succede credo dipenda da questo:

Codice: Seleziona tutto

paoletta@slack ~ $ var='*'
paoletta@slack ~ $ echo $var
Altova Desktop Guida intergalattica per autostoppisti.pdf Mail Regolamento_dei_Dottorati_di_ricerca.pdf ciao eclipse ocaml ocaml-ora-book.pdf workspace
paoletta@slack ~ $ var=\'\*\'
paoletta@slack ~ $ echo $var
'*'
un doppio quoting dovrebbe bastare (se ho capito bene quel che intendi)
No, non cambia niente...

Codice: Seleziona tutto

#!/bin/sh
OPTIONS="-avz --delete-after --delete-excluded"
INCLUDE="--include=\'/\*/\' --include=\'\*.tgz\'"
EXCLUDE="--exclude=\'kdei/\' --exclude=\'\*\'"
SOURCE="slackware.mirrors.tds.net::slackware/slackware-current/slackware/"
DEST="$HOME/current/"
case $1 in
    -c ) /usr/bin/rsync $OPTIONS --dry-run $INCLUDE $EXCLUDE $SOURCE $DEST ;;
    -d ) /usr/bin/rsync $OPTIONS $INCLUDE $EXCLUDE $SOURCE $DEST ;;
    * )
        echo "Usage: $(basename $0) [OPTION]..."
        echo -e "  -c\t check for updates"
        echo -e "  -d\t download updates"
        exit ;;
esac
E poi le cose non mi tornano:
Single Quotes

Enclosing characters in single quotes (‘'’) preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.
http://www.gnu.org/software/bash/manual ... ml#Quoting
Perché quindi la espande?
Non dovrebbe fare come ZSH?

Codice: Seleziona tutto

$ echo $SHELL
/bin/zsh
$ PROVA='*'
$ echo $PROVA
*
Cioé io con la BASH come la faccio una variabile contenente un asterisco?
E poi perché il problema si presenta solo nello script e non dalla linea di comando?

Re: Strano problema con script BASH

Inviato: mer 15 ott 2008, 19:19
da conraid
Secondo me è un problema di rsync.
Dici che da linea di comando ti funziona, ma sinceramente a me da lo stesso risultato.
Il problema è che lui prima guarda l'include, e tu includi tutti le dir, se infatti togli
--include='*/'
dopo esclude kdei

Credo che quello che vuoi fare tu sia

Codice: Seleziona tutto

#!/bin/sh
OPTIONS="-avz --delete-after --delete-excluded"
INCLUDE="--include=*.tgz"
EXCLUDE="--exclude=/kdei --exclude=*/*"
SOURCE="slackware.mirrors.tds.net::slackware/slackware-current/slackware/"
DEST="./current/"
case $1 in
    -c ) /usr/bin/rsync $OPTIONS --dry-run $INCLUDE $EXCLUDE $SOURCE $DEST ;;
    -d ) /usr/bin/rsync $OPTIONS $INCLUDE $EXCLUDE $SOURCE $DEST ;;
     * )
         echo "Usage: $(basename $0) [OPTION]..."
         echo -e "  -c\t check for updates"
         echo -e "  -d\t download updates"
         exit ;;
esac

E poi dipende anche da cosa metti prima, se per esempio metti prima EXCLUDE di INCLUDE ti cambia il comportamento

Non quotare le variabili

Quale riga di comando ti funziona come vorresti che non ho capito?

Re: Strano problema con script BASH

Inviato: mer 15 ott 2008, 19:26
da anycolouryoulike
Se incolli questo nella BASH non ti funziona?
anycolouryoulike ha scritto:

Codice: Seleziona tutto

/usr/bin/rsync -avz --delete-after --delete-excluded --dry-run --include='/*/' --include='*.tgz' --exclude='kdei/' --exclude='*' slackware.mirrors.tds.net::slackware/slackware-current/slackware/ ./current/

Re: Strano problema con script BASH

Inviato: mer 15 ott 2008, 19:29
da conraid
anycolouryoulike ha scritto:Se incolli questo nella BASH non ti funziona?
anycolouryoulike ha scritto:

Codice: Seleziona tutto

/usr/bin/rsync -avz --delete-after --delete-excluded --dry-run --include='/*/' --include='*.tgz' --exclude='kdei/' --exclude='*' slackware.mirrors.tds.net::slackware/slackware-current/slackware/ ./current/
Mi prende anche kdei, mentre nello script che ti ho postato prima no, solo i tgz tranne quelli in kdei

lo script in pratica diventa così

Codice: Seleziona tutto

/usr/bin/rsync -avz --delete-after --delete-excluded --dry-run --include=*.tgz --exclude=kdei/ --exclude=*/* slackware.mirrors.tds.net::slackware/slackware-current/slackware/ ./current/  
non mettere '

Re: Strano problema con script BASH

Inviato: mer 15 ott 2008, 19:33
da anycolouryoulike
conraid ha scritto:
anycolouryoulike ha scritto:Se incolli questo nella BASH non ti funziona?
anycolouryoulike ha scritto:

Codice: Seleziona tutto

/usr/bin/rsync -avz --delete-after --delete-excluded --dry-run --include='/*/' --include='*.tgz' --exclude='kdei/' --exclude='*' slackware.mirrors.tds.net::slackware/slackware-current/slackware/ ./current/
Mi prende anche kdei, mentre nello script che ti ho postato prima no, solo i tgz tranne quelli in kdei
Già, è vero.
Si può risolvere anche mettendo per primo --exclude='kdei/'.
E comunque se lanci lo script ti prende anche tutti gli altri file.
lo script in pratica diventa così

Codice: Seleziona tutto

/usr/bin/rsync -avz --delete-after --delete-excluded --dry-run --include=*.tgz --exclude=kdei/ --exclude=*/* slackware.mirrors.tds.net::slackware/slackware-current/slackware/ ./current/  
Funziona solo con la BASH però:

Codice: Seleziona tutto

$ /usr/bin/rsync -avz --delete-after --delete-excluded --dry-run --include=*.tgz --exclude=kdei/ --exclude=*/* slackware.mirrors.tds.net::slackware/slackware-current/slackware/ ./current/
zsh: no matches found: --include=*.tgz
conraid ha scritto:non mettere '
Perché?

Re: Strano problema con script BASH

Inviato: mer 15 ott 2008, 19:40
da conraid
anycolouryoulike ha scritto: E comunque se lanci lo script ti prende anche tutti gli altri file.
Non ho capito cosa vuoi fare.
Se vuoi solamente i tgz tranne quelli in kdei, prova lo script che ti ho postato prima

Codice: Seleziona tutto

#!/bin/sh
OPTIONS="-avz --delete-after --delete-excluded"
INCLUDE="--include=*.tgz"
EXCLUDE="--exclude=/kdei --exclude=*/*"
SOURCE="slackware.mirrors.tds.net::slackware/slackware-current/slackware/"
DEST="./current/"
case $1 in
    -c ) /usr/bin/rsync $OPTIONS --dry-run $INCLUDE $EXCLUDE $SOURCE $DEST ;;
    -d ) /usr/bin/rsync $OPTIONS $INCLUDE $EXCLUDE $SOURCE $DEST ;;
     * )
         echo "Usage: $(basename $0) [OPTION]..."
         echo -e "  -c\t check for updates"
         echo -e "  -d\t download updates"
         exit ;;
esac
anycolouryoulike ha scritto:
conraid ha scritto:non mettere '
Perché?
Perché non cambia niente :-)

Re: Strano problema con script BASH

Inviato: mer 15 ott 2008, 19:43
da conraid
Comunque guarda il man alle sezioni
FILTER RULES
INCLUDE/EXCLUDE PATTERN RULES
e tutte le sezioni seguenti.
Io non ho mai approfondito, ma si possono fare cose interessanti

Re: Strano problema con script BASH

Inviato: mer 15 ott 2008, 20:31
da Mario Vanoni
Scusate l'intromissione del vecchio UNIXiano.

- non capisco che significhi "incollare" (dove?)

- mi meraviglio che una sh da X/DE
> si comporti in modo diverso che da tty,
> errore intrinseco di X/DE?

- le notazioni XYZ="'abc'", giusto -> XYZ='abc'
> o XYZ="'${ABC'}", giusto -> XYZ="${ABC}"
> sono errate,
> ecceto in awk dove "'abc'"
> e "'"$ABC"'" sono obbligo
> usandole in uno shell script.

Re: Strano problema con script BASH

Inviato: mer 15 ott 2008, 22:44
da 414N
anycolouryoulike ha scritto:Lo script in questione è questo (copiato da conraid):

Codice: Seleziona tutto

...
case $1 in
    -c ) echo "/usr/bin/rsync $OPTIONS --dry-run $INCLUDE $EXCLUDE $SOURCE $DEST" ;;
    -d ) echo "/usr/bin/rsync $OPTIONS $INCLUDE $EXCLUDE $SOURCE $DEST" ;;
...
Invece se lancio il comando tramite lo script togliendo gli echo mi include tutti i file.

Codice: Seleziona tutto

...
    -c ) /usr/bin/rsync $OPTIONS --dry-run $INCLUDE $EXCLUDE $SOURCE $DEST ;;
    -d ) /usr/bin/rsync $OPTIONS $INCLUDE $EXCLUDE $SOURCE $DEST ;;
...
Davvero strano, e le wildcards hanno il quoting forte e non possono essere espanse.
Non hai tolto solo gli echo, ma anche le " " che proteggevano le variabili OPTIONS INCLUDE EXCLUDE SOURCE DEST.
Riprova con:

Codice: Seleziona tutto

...
    -c ) /usr/bin/rsync "$OPTIONS" --dry-run "$INCLUDE" "$EXCLUDE" "$SOURCE" "$DEST" ;;
    -d ) /usr/bin/rsync "$OPTIONS" "$INCLUDE" "$EXCLUDE" "$SOURCE" "$DEST" ;;
...

Re: Strano problema con script BASH

Inviato: gio 16 ott 2008, 14:39
da anycolouryoulike
414N ha scritto:
anycolouryoulike ha scritto:Lo script in questione è questo (copiato da conraid):

Codice: Seleziona tutto

...
case $1 in
    -c ) echo "/usr/bin/rsync $OPTIONS --dry-run $INCLUDE $EXCLUDE $SOURCE $DEST" ;;
    -d ) echo "/usr/bin/rsync $OPTIONS $INCLUDE $EXCLUDE $SOURCE $DEST" ;;
...
Invece se lancio il comando tramite lo script togliendo gli echo mi include tutti i file.

Codice: Seleziona tutto

...
    -c ) /usr/bin/rsync $OPTIONS --dry-run $INCLUDE $EXCLUDE $SOURCE $DEST ;;
    -d ) /usr/bin/rsync $OPTIONS $INCLUDE $EXCLUDE $SOURCE $DEST ;;
...
Davvero strano, e le wildcards hanno il quoting forte e non possono essere espanse.
Non hai tolto solo gli echo, ma anche le " " che proteggevano le variabili OPTIONS INCLUDE EXCLUDE SOURCE DEST.
Riprova con:

Codice: Seleziona tutto

...
    -c ) /usr/bin/rsync "$OPTIONS" --dry-run "$INCLUDE" "$EXCLUDE" "$SOURCE" "$DEST" ;;
    -d ) /usr/bin/rsync "$OPTIONS" "$INCLUDE" "$EXCLUDE" "$SOURCE" "$DEST" ;;
...
No, perché in quel caso con i doppi apici non viene eseguito il word splitting, e ad esempio -avz --delete-after --delete-excluded viene passato come un unico argomento, non come tre argomenti distinti.
http://www.gnu.org/software/bash/manual ... -Splitting

Re: Strano problema con script BASH

Inviato: gio 16 ott 2008, 14:42
da conraid
Ma nello script che ti ho passato io cosa non funziona?