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

AppleScript Discussion :

Encapsuler un shell script avec AS


Sujet :

AppleScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut Encapsuler un shell script avec AS
    Bonjour,

    je suis tout débutant en applescript (mais à l'aise en shell).
    Je peux m'adapter à applescript (à partir de mon expérience dans d'autres langages).
    Aussi, si vous connaissez des exemples de code applescript proches de ce dont j'ai besoin, plutôt que de vous embêter à corriger ce que j'ai fait, n'hésitez à m'indiquer des références!

    Voilà le problème: ma copine voudrait avoir une copie de l'un de ses répertoires sur sa clé USB.
    Je me suis dit que c'était facile à faire en shell script avec la commande rsync, mais il ne faudrait pas qu'elle ait à lancer un Terminal pour taper des commandes à la main (faut pas exagérer quand même (on est sur un mac!))!

    Question 1: est-ce que applescript est le plus adapté pour "encapsuler" du shell dans une application cliquable?

    J'ai commencé par faire une petite appli qui est censée, dans un premier temps, montrer les fichiers qui vont être copiés vers la clé (car nouveaux ou modifiés) ou supprimés de la clé (car supprimés du répertoire original):

    (Attention les yeux! c'est mon premier script! merci d'être indulgents! (mais néanmoins de me corriger si nécessaire ))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    set from_dir to quoted form of "/Users/Stef/Desktop/Documents Stef/école"
    set to_dir to quoted form of "/Volumes/KINGSTON/Stef/RSYNC"
    set cmd to "/usr/bin/rsync -nrv --delete " & from_dir & " " & to_dir
     
    display dialog (do shell script cmd)
    ça marche presque! à quelques détails près!

    Il affiche une boite de dialogue qui est trop étroite (comme la fameuse marge) pour contenir les lignes qui sont malencontreusement repliées (à environ 45 caractères)!

    Question 2: peut-on spécifier la largeur de la boite de dialogue? Faut-il utiliser autre chose que "dialog"?

    Et surtout le codage des caractères est pas top (je lui avais pourtant dit de ne pas mettre d'accents dans ses noms de fichiers et répertoires!). En gros, voilà ce que ça affiche (je l'ai copié de la partie "Réponses" de l'éditeur Applescript, mais c'est la même chose qui est affichée dans la boite de dialogue):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    \\#303\\#251cole/
    \\#303\\#251cole/.DS_Store
    \\#303\\#251cole/Calendriers Excel
    \\#303\\#251cole/Programmation HistGeoC3.pdf
    \\#303\\#251cole/Affichages ecole/
    \\#303\\#251cole/Affichages ecole/.DS_Store
    \\#303\\#251cole/Affichages ecole/Affiches-francais/
    etc.


    (quand ça marchera, je grep'erai -v les .DS_Store)

    J'ai bien essayé de piper la sortie du shell script à travers toutes sortes de 'iconv' (de/vers utf8, de/vers iso8859-1, de/vers macRoman), mais cela ne change rien à l'affichage (ce que je trouve pour le moins bizarre, car ça change tout lorsque exécuté depuis le Terminal)! Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set cmd to "/usr/bin/rsync -nrv --delete " & from_dir & " " & to_dir & " | iconv -f ISO-8859-1 -t UTF-8"
    Question 3: comment peut-on gérer les accents des noms de fichiers retournés par un shell script?

    Et, enfin, le nombre de lignes affichées est limité par la hauteur du dialog.

    Question 4: peut-on afficher une liste de lignes de texte avec une scrollbar? Faut-il utiliser autre chose que "dialog"?

    Pour l'instant, je n'ai pas d'autre problème (j'ai bien dit "pour l'instant"! ).

    Merci d'avance pour toute aide, pointeur, etc.!

    )jack(

  2. #2
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut Encapsuler un shell script avec AS
    Bonsoir Jack-ft,
    Que de questions...!

    1) le dialog : L'interface utilisateur est une des limitations de AppleScript. Le "Display Dialog" est en effet assez limité. Pour passer outre cette limite, il faut en général passer par un autre mode de programmation (Xcode par exemple).
    Ceci étant, il y a plus pratique pour gérer une liste, tout en gardant Applescript:
    l'instruction Choose from list dont voici un exemple ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set Mylist to choose from list {"item1", "item2, "item3"} with title "Liste des items" with prompt "Sélectionner les items" default items {"item2"} OK button name "Sélectionner" cancel button name "Abandonner" with multiple selections allowed and empty selection allowed
    Imagine que dans ton cas, les noms des fichiers soient repris dans une liste. Tu affiches cette liste (pré-sélectionnée avec default items).
    Malheureusement, si cela permettra à l'utilisateur de changer sa sélection, cela est limité par la largeur de la fenêtre. AppleScript essaie de tenir compte des largeurs des lignes, mais ce n'est pas toujours parfait.
    Reste à pouvoir récupérer tes lignes de terminal sous forme de liste.
    Note que cela réponds aussi à ta question 4 : le choose list intègre une gestion du scrollbar.


    2) Gestion du retour du Terminal
    le retour du terminal se fait en général par un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set Mon_Texte to do shell script "xxxx"
    Tu récupères dans Mon_Texte une variable de type texte qui peut être manipulée (par exemple : "set T to paragraph 1 of Mon_texte" te donne la première ligne. Dans une boucle, tu peux traiter chaque ligne.

    3) le problème des accents
    il peut y avoir des accents et d'autres caractères spéciaux. Le Shell et l'interface Mac font automatiquement une traduction, transparente à l'utilisateur. En script, il faut le faire soit même !
    Pour cela 2 instructions peuvent être utiles (à utiliser dans ta boucle par ligne) :
    1) POSIX file qui transforme un chemin/fichier d'Unix en AppleScript
    2) quoted form qui permet de gérer les caractères spéciaux
    Exemple :
    Set A to quoted form of POSIX file of (Mon_Fichier) as string
    assigne à A, la valeur unix (dossier/sous dossier///Mon_Fichier) à partir de Mon_Fichier (avec la valeur Finder/script dossier:dossier:::Mon_Fichier)
    Dans cet exemple, les accents, les \, etc... seront aussi transcodés.
    A essayer lors de la récupération du résultat de ton instruction shell pour présenter seulement les fichiers à l'utilisateur (en retirant le path tu réduis le problème de largeur du dialogue

    En espérant t'avoir aidé

    Cordialement

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par PBELL Voir le message
    Bonsoir Jack-ft,
    Que de questions...!
    Bonsoir PBELL,
    Que de réponses...!

    Merci beaucoup!!!
    Je les garde sous le coude car ça pourrait me servir...
    En fait, n'ayant pas eu de réponses pendant 2 jours, je me suis débrouillé autrement.
    Mais, en gros, dans mon script, j'ai utilisé une partie de ce que tu préconises:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    -- [jack] 121216
     
    set from_dir to quoted form of "/Users/Stef/Desktop/Documents Stef/école/Affichages ecole"
    set to_dir to quoted form of "/Volumes/KINGSTON/Stef/RSYNC"
    set rsync to "/Users/Stef/Scripts/shell/rsync-cmd.ksh"
     
    -- Declare the operation names
    set op_diff to "diff"
    set op_cp to "cp"
    set op_cpdel to "cpdel"
     
    -- Declare the operation labels
    set l_diff to "diff"
    set l_cp to "cp"
    set l_cpdel to "cpdel"
     
    -- Choose the operation
     
    set cmdr to choose from list {l_diff, l_cp, l_cpdel} cancel button name "Quitter"
     
    if (cmdr is not false) then
    	set cmd to item 1 of cmdr
     
    	if cmd is l_diff then
    		-- Run the rsync script with 'diff' option and get the name of the temp result file
    		set outFile to (do shell script rsync & " " & op_diff & " " & from_dir & " " & to_dir)
     
    		-- Display the contents of outFile
    		tell application "TextEdit"
    			open outFile
    			activate
    		end tell
    	else if cmd is l_cp then
    		-- Run the rsync script with 'cp' option
    		set outFile to (do shell script rsync & " " & op_cp & " " & from_dir & " " & to_dir)
    	else if cmd is l_cpdel then
    		-- Run the rsync script with 'cpdel' option
    		set outFile to (do shell script rsync & " " & op_cpdel & " " & from_dir & " " & to_dir)
    	else
    		display alert "Ouate de phoque '" & cmd & "'???"
    	end if
    end if
    En mode 'diff', le script génère un fichier temporaire dont il retourne le nom par un simple 'echo $file'.
    Ce nom de fichier est récupéré par AS qui demande à TextEdit d'en afficher le contenu.

    J'ai du mal à comprendre pourquoi la sortie de mon script est encodée de manière différente lorsqu'il est appelé à la main depuis un Terminal ou appelé depuis AS???
    Est-ce que AS changerait le locale (ou quelque chose du genre) lors d'un "do shell script"? Si j'en trouve le temps, j'essaierai d'investiguer.

    Anyway, comme, en gros, un e-grave apparaît comme "e" suivi des 10 caractères "\#314\#200", il suffit, pour gérer les accents, de supprimer ces paquets de 10 caractères avec un simple sed -e 's/\\#314\\#200//g' pour les différents accents (grave acute circum umlaut) et la cédille.

    En fait, je bute sur un autre problème beaucoup plus gênant pour lequel je vais ouvrir un nouveau post si je ne trouve rien dans le man de rsync ou sur internet.

    Encore merci pour les réponses!

Discussions similaires

  1. script shell: problème avec le caractère espace
    Par Le fut dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 04/05/2017, 11h49
  2. Probleme avec un shell script
    Par philippe57460 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 07/07/2008, 11h38
  3. [SHELL] Problème d'exécution script avec Crontab
    Par Leeloo_Multiboot dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 05/06/2008, 16h59
  4. script shell : probleme avec sed et awk
    Par salseropom dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 05/06/2007, 11h57
  5. Script SHELL/UNIX avec mysql
    Par HacHHacH dans le forum Linux
    Réponses: 6
    Dernier message: 06/04/2006, 23h48

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