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 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Strano problema con script BASH

Messaggio 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

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

Re: Strano problema con script BASH

Messaggio 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

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

Re: Strano problema con script BASH

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

sixjan
Linux 2.x
Linux 2.x
Messaggi: 413
Iscritto il: dom 6 gen 2008, 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: Strano problema con script BASH

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

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

Re: Strano problema con script BASH

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

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

Re: Strano problema con script BASH

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

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

Re: Strano problema con script BASH

Messaggio 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/

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

Re: Strano problema con script BASH

Messaggio 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 '

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

Re: Strano problema con script BASH

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

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

Re: Strano problema con script BASH

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

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

Re: Strano problema con script BASH

Messaggio 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

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 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

Messaggio 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.

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2924
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: Strano problema con script BASH

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

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

Re: Strano problema con script BASH

Messaggio 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

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

Re: Strano problema con script BASH

Messaggio da conraid »

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

Rispondi