Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/01/2011, à 16:18

darkeclypse

bash: erreur sortie de la commande mv avec exclusion

Bonjour,

tout d'abord, mes voeux pour cette nouvelle année 2011. Que cette année vous soit à tous douce et agréable...

J'aurai besoin d'aide pour un script en bash utilisé pour mettre à jour mon site. Je me retrouve à chaque fois avec une erreur lorsque j'utilise l'option "shopt -s extglob" avec une syntaxe "mv !($varSimple|$varComplexe) ./"
L'idée c'est de déplacer tous les dossiers du répertoire courant vers le répertoire de la variable $nomcourt à l'exception du répertoire "site" et de "$nomcourt"(lui-même).

Voici mon fichier "maj.bash":

#! /bin/bash

nomlong=${2/http:\/\/ftp.monsite.org\/files\/archives\//}
nomcourt=${nomlong/.tar.gz/}
wget $2
tar -xvzf $nomlong
rm -R $nomcourt/sites
mv --target-directory=$HOME/.trash sites/oldcore/*
mkdir -p sites/oldcore/$nomcourt
shopt -s extglob
[color=#F84506]mv !(sites|${nomcourt}) sites/oldcore/$nomcourt #ligne 11[/color]
mv $nomcourt/* ./
mv $nomcourt/.* ./
rm -R $nomcourt
exit

Et voici l'erreur:

./maj.bash: line 11: Erreur de syntaxe près du symbole inattendu « ( »
./maj.bash: line 11: `                mv !(sites|${nomcourt}) sites/oldcore/$nomcourt'

Mais si je remplace à ligne 11 (ou il y a la fameuse association "mv" et "!") la variable complexe $nomcourt par "drupal" par exemple, ca fonctionne.
Donc, le problème réside dans le fait qu'il y a dans la variable $nomcourt des caractères spéciaux!

Ma première question sous-jacente est : comment faire en sorte de faire accepter les variables nés d'une affectation complexe dans la commande mv avec exclusion?
Ma seconde question serait: ou bien si ce n'est pas possible comment transformer une variable à valeur complexe comprenant diverses commandes en une variable à valeur très simple comprenant la simple sortie des commandes internes.

Je ne sais pas si j'ai été clair.
En tout cas, merci à tout ceux et celles qui auront lu ma question jusque là et/ou qui voudraient bien m'aider.

Hors ligne

#2 Le 06/01/2011, à 16:22

wido

Re : bash: erreur sortie de la commande mv avec exclusion

Bonjour,
ajoute des guillemets à tes variables.

Hors ligne

#3 Le 11/01/2011, à 17:19

darkeclypse

Re : bash: erreur sortie de la commande mv avec exclusion

Non, les guillemets j'ai essayé, et ça ne marche pas non plus. Ca apparait que "mv" et "!" combinés ne fonctionnent pas avec des variables issues de commandes complexes.

Du coup, j'ai finalement remplacé par "mv !()" par "mv $(ls -A --ignore=sites --ignore=${nomcourt})"
Et ca fonctionne nickel. Même pas besoin d'activer extglob.

Hors ligne

#4 Le 11/01/2011, à 19:58

ehmicky

Re : bash: erreur sortie de la commande mv avec exclusion

Je crois qu'au départ, tu devais utiliser ${VAR//VAL/VAL2} ou sed pour rajouter des \ derrière les *, ., |, etc. contenus dans la variable $nomcourt pour que !( ) les interprète de manière littéral et non comme des wildcards ?
Sinon, dans ta dernière solution, tu oublies à nouveau les double guillemets, si tu tombes sur des chemins contenant des espaces, ça va faire buguer ton script.


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne