IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration système Discussion :

drag/drop de fichier dans un script bash


Sujet :

Administration système

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 47
    Points
    47
    Par défaut drag/drop de fichier dans un script bash
    Bonjour à tous,

    voici mon problème : j'ai écrit un script qui me permet de reconstruire un fichier (rar, xtm ou découpé simplement) donné. L'utilisateur n'a qu'a glisser/déposer le fichier sur le terminal et il verra s'afficher le chemin du fichier. Le problème est que je ne parviens pas à utiliser ce chemin! Il m'indique des erreurs incompréhensibles... exemple :

    Sortie du script :
    ----------------
    Fichier à reconstruire : '/home/salon/Bureau/liens textes.txt'
    if [[ ! -e '/home/jon/Bureau/liens av.txt' ]]
    Erreur : fichier inexistant
    basename '/home/jon/Bureau/liens av.txt'
    dirname: opérande surnuméraire `av.txt\''

    Voici une partie du code qui pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    read leFichier
    ...
    echo "if [[ ! -e $leFichier ]]" #Debugging
    if [[ ! -e $leFichier ]]; then
    	echo "Erreur : fichier inexistant"
    	#exit 2
    fi
    echo "basename $leFichier" #Debugging
    fichierSource=$(basename $leFichier)
    Pourtant quand j'exécute le if "à la main", ça fonctionne!
    Ou est ce que ça ne va pas? Je ne comprends pas!

  2. #2
    Membre expérimenté

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2004
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 060
    Points : 1 609
    Points
    1 609
    Par défaut
    bonjour,

    C'est sans doute les espaces dans ton nom de fichier qui posent problème.
    As-tu essayé des les échapper avec un backslash ?
    Chaval
    __________________
    "Monsieur le chat voudriez-vous, s'il vous plait, demanda Alice, me dire de quel côté dois-je aller ?
    Ca dépend de l'endroit où vous voulez vous rendre, répondit le chat"
    Lewis Carrol

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour mrttlemonde


    Pour moi, la condition fonctionne correctement également dans un script.

    Cependant, avant tout, pour debugguer un script, utilise set -x :
    tu peux le placer au tout début de ton script, ou juste au-dessus de la partie que tu souhaites debugguer, et que tu "fermeras" par set +x
    ...

    Ensuite, à quoi sert ta condition si de toute façon le script poursuit son exécution alors qu'il n'y a pas de fichier valide ?


    Et, utilise davantage de guillemets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #!/bin/bash
     
    #
    set -x
     
    read -p 'Entrez un nom de fichier : ' fic
    if [[ ! -e $fic ]]
    # ou if [ ! -e "$fic" ]
     then
       echo "$fic KO"
    else
       echo "$fic OK"
       basename "$fic"
       dirname "$fic"
    fi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $ ./testSpacefile.sh
    + read -p 'Entrez un nom de fichier : ' fic
    Entrez un nom de fichier : space file
    + [[ ! -e space file ]]
    + echo 'space file OK'
    space file OK
    + basename 'space file'
    space file
    + dirname 'space file'
    .
    PS: ce n'est sans doute pas la meilleure rubrique de développez.net pour obtenir une réponse concernant un shell script
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 47
    Points
    47
    Par défaut
    Merci pour vos réponses!

    @ chaval,
    Je pense aussi que ça doit être du aux espaces qui se trouvent dans le chemin du fichier... mais après, quand j'arrive à la commande basename, voici ce que ça donne au debugging :

    ++ basename ''\''/home/salon/Bureau/liens' 'texte.txt'\'''
    + fichierSource=liens

    On aurait dit que les apostrophes font partie de la chaine de caractères. Il faudrait donc
    - supprimer les deux apostrophes
    - ajouter un backslash avant le/les espaces qui pourraient se trouver dans le chemin/nom du fichier...
    ____________

    @ N_BaH,
    Tu as essayé la condition dans un script en glissant le fichier sur le terminal? Parce que la condition fonctionne également chez moi si j'écris le chemin du fichier à la main c-a-d avec les backslash si il y a des espaces et sans apostrophe au début et à la fin.

    Merci pour l'astuce du debugging! C'est beaucoup plus facile comme ca.
    C'est vrai que cette condition ne sert à rien pour le moment mais j'ai commenté la commande exit pour voir la suite (notamment le résultat de basename).

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Je ne comprend pas bien le coup du drag'n'drop...

    - je lance le script dans un terminal (j'atteint le read)
    - j'ouvre un post-it, ou un quelconque éditeur de texte fenêtré (mousepad, gedit...)
    - j'écris le chemin et le nom du fichier (/home/monuser/space file)
    - je surligne (<ctrl-a>)
    - je glisse ce que j'ai surligné (ou même une icône de mon bureau pointant vers un fichier texte) dans le terminal ouvert
    et le script se déroule de la même manière que précédemment...
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 47
    Points
    47
    Par défaut
    En fait, le drag/drop c'est une facilité pour les futurs utilisateurs de mon script (ceux qui ont du mal avec l'informatique... tu vois ce que je veux dire?) et donc je leur expliquerai qu'il faudra simplement glisser le fichier sur la console (une fois qu'ils auront cliqué sur l'icone du script).

    Mais apparement tu as aussi fait ça? Il paraitrait que les test tel que -e, -f etc. ne s'utilisent que pour les fichiers dans le dossier courant? Si c'est le cas, ça change tout!

    Je comprends pas comment ça peut fonctionner chez toi... tu utilises aussi bash? Quelle version? enfin je ne pense pas que le problème vienne de là...

    c'est vraiment frustrant!

  7. #7
    Membre averti Avatar de exodev
    Inscrit en
    Septembre 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2009
    Messages : 201
    Points : 359
    Points
    359
    Par défaut
    Hello,

    Il paraitrait que les test tel que -e, -f etc. ne s'utilisent que pour les fichiers dans le dossier courant? Si c'est le cas, ça change tout!
    non

    Dans ton rapport d'erreur du 1er post:
    dirname: opérande surnuméraire `av.txt\''
    Ce serait possible de voir ce dirname ?

  8. #8
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 47
    Points
    47
    Par défaut
    Salut,

    voici le résultat du script :

    '/home/salon/Bureau/liens av.txt'
    + '[' '!' -f ''\''/home/salon/Bureau/liens av.txt'\''' ']'
    + echo 'Erreur : fichier inexistant'
    Erreur : fichier inexistant
    ++ basename ''\''/home/salon/Bureau/liens' 'av.txt'\'''
    + fichierSource=liens
    ++ dirname ''\''/home/salon/Bureau/liens' 'av.txt'\'''
    dirname: opérande surnuméraire `av.txt\''
    Pour en savoir davantage, faites: « dirname --help ».

    Alors je ne comprends plus...

    AH ! Il y a une amélioration :
    Si je supprime les apostrophes, le fichier est reconnu (il passe le test if [ ! -f ... ]) PAR CONTRE, le probleme de basename persiste... à cause de l'espace.

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu) sur Debian GNU/Linux Stable

    si e n''est pas le shell, ce serait le terminal ? l'environnement graphique ? Quel terminal, et quel GUI utilises-tu ?

    J'ai fait un essai en tirant un fichier depuis Thunar, et j'ai obtenu, dans la console, le chemin et le nom du fichier entre guillemets simples ('/chemin/fichier'), et évidemment le script ne fonctionne plus. J'ai dû ajouter une ligne après le read :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fic=$(sed "/^'.*'$/s/^'\(.*\)'$/\1/g" <<<"$fic")
    pour le faire fonctionner à nouveau.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 47
    Points
    47
    Par défaut
    Oui c'est bien ça! Je suis arrivé à la même chose...
    C'est déjà une bonne chose!
    Par contre pour les espaces, il faudra sans doute renommer le fichier non? Dans ce cas là je risque de rencontrer pas mal de problèmes puisque je devrais aussi renommer les autres parties nécessaires à la reconstruction du fichier. Vous me suivez? Ca risque d'être compliqué...

  11. #11
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 47
    Points
    47
    Par défaut
    Voila, le problème est finalement résolu...
    j'avais oublié d'ajouter des guillements (comme tu me l'avais conseillé N_BaH)
    basename "$fichier"

    Merci beaucoup pour votre aide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] drag & drop de fichiers dans un site web.
    Par bennyben77 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 20/06/2008, 17h55
  2. drag & drop de fichiers dans une application java
    Par devmat dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 13/12/2007, 00h41
  3. Requête POST dans un script bash
    Par desperado dans le forum Linux
    Réponses: 4
    Dernier message: 11/12/2007, 22h38
  4. Liste de fichier dans un script shell
    Par mirlidas dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 21/11/2006, 17h54
  5. Drag&Drop de fichiers
    Par RXN dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 20/09/2005, 11h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo