Strano problema con script BASH

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven ago 10, 2007 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Strano problema con script BASH

Messaggioda anycolouryoulike » mer ott 15, 2008 16:49

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

Avatar utente
conraid
Staff
Staff
Messaggi: 12743
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: Strano problema con script BASH

Messaggioda conraid » mer ott 15, 2008 17:18

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

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3955
Iscritto il: lun apr 25, 2005 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: Strano problema con script BASH

Messaggioda Paoletta » mer ott 15, 2008 17:57

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)

sixjan
Linux 2.4
Linux 2.4
Messaggi: 413
Iscritto il: dom gen 06, 2008 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: Strano problema con script BASH

Messaggioda sixjan » mer ott 15, 2008 18:06

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? ;-)

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven ago 10, 2007 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Strano problema con script BASH

Messaggioda anycolouryoulike » mer ott 15, 2008 18:58

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/bashref.html#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?

Avatar utente
conraid
Staff
Staff
Messaggi: 12743
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: Strano problema con script BASH

Messaggioda conraid » mer ott 15, 2008 19:19

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?

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven ago 10, 2007 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Strano problema con script BASH

Messaggioda anycolouryoulike » mer ott 15, 2008 19:26

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/

Avatar utente
conraid
Staff
Staff
Messaggi: 12743
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: Strano problema con script BASH

Messaggioda conraid » mer ott 15, 2008 19:29

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 '

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven ago 10, 2007 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Strano problema con script BASH

Messaggioda anycolouryoulike » mer ott 15, 2008 19:33

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é?

Avatar utente
conraid
Staff
Staff
Messaggi: 12743
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: Strano problema con script BASH

Messaggioda conraid » mer ott 15, 2008 19:40

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 :-)

Avatar utente
conraid
Staff
Staff
Messaggi: 12743
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: Strano problema con script BASH

Messaggioda conraid » mer ott 15, 2008 19:43

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

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun set 03, 2007 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: Strano problema con script BASH

Messaggioda Mario Vanoni » mer ott 15, 2008 20:31

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.

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2893
Iscritto il: mer feb 13, 2008 16:19
Slackware: current
Kernel: 3.14.23
Desktop: KDE4
Località: Bulagna
Contatta:

Re: Strano problema con script BASH

Messaggioda 414N » mer ott 15, 2008 22:44

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" ;;
...

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven ago 10, 2007 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Strano problema con script BASH

Messaggioda anycolouryoulike » gio ott 16, 2008 14:39

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/bashref.html.gz#Word-Splitting

Avatar utente
conraid
Staff
Staff
Messaggi: 12743
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: Strano problema con script BASH

Messaggioda conraid » gio ott 16, 2008 14:42

Ma nello script che ti ho passato io cosa non funziona?


Torna a “Programmazione”

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti