Repository 32bit  Forum
Repository 64bit  Wiki

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.

Strano problema con script BASH

Messaggioda anycolouryoulike » mer ott 15, 2008 15: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
anycolouryoulike
Packager
Packager
 
Messaggi: 1158
Iscritto il: gio ago 09, 2007 23:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Strano problema con script BASH

Messaggioda conraid » mer ott 15, 2008 16: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
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: Strano problema con script BASH

Messaggioda Paoletta » mer ott 15, 2008 16: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)
Avatar utente
Paoletta
Staff
Staff
 
Messaggi: 3907
Iscritto il: dom apr 24, 2005 23:00
Località: Varese
Slackware: 13.1
Desktop: fluxbox

Re: Strano problema con script BASH

Messaggioda sixjan » mer ott 15, 2008 17: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? ;-)
sixjan
Linux 2.4
Linux 2.4
 
Messaggi: 407
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 anycolouryoulike » mer ott 15, 2008 17: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
anycolouryoulike
Packager
Packager
 
Messaggi: 1158
Iscritto il: gio ago 09, 2007 23:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Strano problema con script BASH

Messaggioda conraid » mer ott 15, 2008 18: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
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: Strano problema con script BASH

Messaggioda anycolouryoulike » mer ott 15, 2008 18: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
anycolouryoulike
Packager
Packager
 
Messaggi: 1158
Iscritto il: gio ago 09, 2007 23:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Strano problema con script BASH

Messaggioda conraid » mer ott 15, 2008 18: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
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: Strano problema con script BASH

Messaggioda anycolouryoulike » mer ott 15, 2008 18: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
anycolouryoulike
Packager
Packager
 
Messaggi: 1158
Iscritto il: gio ago 09, 2007 23:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Strano problema con script BASH

Messaggioda conraid » mer ott 15, 2008 18: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: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: Strano problema con script BASH

Messaggioda conraid » mer ott 15, 2008 18: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
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: Strano problema con script BASH

Messaggioda Mario Vanoni » mer ott 15, 2008 19: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.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: Strano problema con script BASH

Messaggioda 414N » mer ott 15, 2008 21: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
414N
Iper Master
Iper Master
 
Messaggi: 2882
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: Strano problema con script BASH

Messaggioda anycolouryoulike » gio ott 16, 2008 13: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
anycolouryoulike
Packager
Packager
 
Messaggi: 1158
Iscritto il: gio ago 09, 2007 23:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Strano problema con script BASH

Messaggioda conraid » gio ott 16, 2008 13:42

Ma nello script che ti ho passato io cosa non funziona?
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Google [Bot] e 4 ospiti