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 :

do shell script unique pour plusieurs commandes


Sujet :

AppleScript

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2013
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 13
    Points : 6
    Points
    6
    Par défaut do shell script unique pour plusieurs commandes
    Je souhaite uploader des fichiers avec CURL depuis un Applescript, de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set commandeShell to "curl -T /Users/.../fichier.zip -u compte:pass ftp://ftpperso.free.fr"
    do shell script commandeShell
    Jusque là, j'y arrive. Mais pour ne pas attendre que la commande soit entièrement exécutée (un fichier lourd peut être long à uploader), j'ajoute des indications supplémentaires à la fin. De cette façon, Applescript est à nouveau disponible (et FileMaker aussi, c'est de là que j'envoie l'applescript). Et là aussi ça marche :

    J'ajoute à la fin : > /dev/null 2>&1 & echo $!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set commandeShell to "curl -T /Users/.../fichier.zip -u compte:pass ftp://ftpperso.free.fr > /dev/null 2>&1 & echo $!"
    (merci de me dire au passage s'il peut y avoir une meilleure syntaxe, le echo je ne sais pas à quoi il sert ?)

    Ensuite je veux arriver à uploader plusieurs fichiers les uns après les autres, mais en une seule commande.
    Il est possible d'associer les commandes en les séparant par ";" voir : http://www.linuxandlife.com/2012/07/...-terminal.html
    Mais je n'y arrive pas (problème de syntaxe)

    Et pour finir, je voudrais ajouter un témoin de fin d'upload (l'idéal serait même de voir apparaître un curseur…, mais compliqué je pense).
    J'ai trouvé ça sur le net, un shell qui envoie un Applescript dans l'autre sens (ici un simple affichage dialogue avec boutons) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    do shell script "osascript -e 'tell application \"Finder\"' -e \"activate\" -e 'display dialog \"Shell Script running\"' -e 'end tell' > /dev/null 2>&1 &"
    En final donc, comment enchainer toutes les lignes depuis un seul do shell script


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    set commandeShell to 
    " fichier 1…" 
    ;
    " fichier 2…" 
    ;
    " fichier 3…" 
    ;
    "osascript affichage dialogue…"
     
    + /dev/null 2>&1 &… pour rendre la main à Applescript à placer en une fois je suppose, à la fin ?
     
    do shell script commandeShell
    Merci

  2. #2
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 17
    Points
    17
    Par défaut
    Bonjour

    Et si a la place du point virgule tu m'étais "&&".

    Pour afficher du texte rien de plus simple qu'un display dialog .
    A l place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    do shell script "osascript -e 'tell application \"Finder\"' -e \"activate\" -e 'display dialog \"Shell Script running\"' -e 'end tell' > /dev/null 2>&1 &"
    Tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    display dialog "mon texte"

  3. #3
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    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 : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour Thy06,
    Ta commande unix set termine par > /dev/null ... qui indique d'envoyer le résultat sur un autre output (une sorte de background, pour ne pas attendre la fin).
    La commande echo permet d'afficher le résultat. Dans ton cas, d'afficher la variable $! qui est une variable Unix spéciale contenant la valeur de l'ID du process.

    Comme tu indiques que cette commande fonctionne, il reste la question de savoir quand le fichier est téléchargé. Comme tu as exécuté la commande précédente sans attendre le résultat, il ne te reste qu'une solution : observer le fichier pour voir quand il est complètement téléchargé... c'est à dire quand sa taille ne change plus !

    Ceci peut être fait par une boucle qui compare la taille du fichier avec celle qu'elle avait une demi seconde avant.
    Ce script suppose que la variable Mon_Fichier est un alias vers le fichier que tu télécharges (tu connais son nom et son dossier).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try                
      set OldSize to -1
      repeat until (size of Mon_Fichier) = OldSize
          set OldSize to (size of Mon_Fichier)
          delay 0.5
      end repeat
    end try
    Lorsque la taille OldSize devient égale à "Size of Mon_Fichier" c'est en général que le téléchargement est complet.
    Dans certains cas, il se peut qu'il soit interrompu (ou très lent). Si ton réseau comporte ce risque, tu peux augmenter le délai entre chaque boucle. Par exemple "delay 1" attendra une seconde.
    Cordialement

  4. #4
    Futur Membre du Club
    Inscrit en
    Octobre 2013
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Merci pour vos réponses.

    à julesmikael :
    J'ai réussi à enchainer mes commandes (fichier1 & fichier2…) avec &&, ça marche.
    Le "display dialog" direct n'a aucun intérêt, puisque je cherche à libérer Applescript sans attendre la fin de l'upload. Si j'ajoute cette ligne applescript, je suis certain qu'applescript restera bloqué durant tout l'upload (et donc dans mon cas Filemaker aussi, avec une roue qui tourne). C'est pour ça, que je crée indirectement un applescript en retour par une ligne shell avec osascript.

    à PBELL :
    ok pour echo
    par contre pour le reste, je comprends ton raisonnement, mais il ne s'agit pas d'un download mais d'un upload. Donc s'il doit y avoir contrôle sur la taille du fichier, ça ne peut être fait que sur le serveur distant et donc pas en applescript mais par shell.
    Je n'arrive pas à placer la commande > /dev/null ...
    Ça fonctionne s'il n'y a qu'un fichier à uploader.
    Mais s'il y a plusieurs fichiers en plaçant cette commande à la fin, ça ne marche pas (les fichiers sont uploadés, mais Applescript n'est pas libéré)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set commandeShell to "curl -T /Users/.../fichier1.zip -u compte:pass ftp://ftpperso.free.fr && curl -T /Users/.../fichier2.zip -u compte:pass ftp://ftpperso.free.fr && > /dev/null 2>&1 &"
    do shell script ligne_curl
    Si je la répète pour chaque fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set commandeShell to "curl -T  /Users/.../fichier1.zip -u compte:pass ftp://ftpperso.free.fr > /dev/null 2>&1 & && curl -T  /Users/.../fichier1.zip -u compte:pass ftp://ftpperso.free.fr > /dev/null 2>&1 &"
    do shell script ligne_curl
    j'obtiens cette erreur :
    error "Erreur dans Finder*: sh: -c: line 0: syntax error near unexpected token `&&'

  5. #5
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    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 : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,
    Pour mettre plusieurs commandes shell à la suite dans un même do shell script, il faut séparer ces commandes Unix avec un ";"
    je te suggère de voir la page Apple technical note à propos du do shell script : https://developer.apple.com/library/...65/_index.html

    Voici l'exemple donné par Apple dans cette page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    do shell script "cd ~/Documents; ls" -- result: "Welcome.txt"
    Si tu n'est pas familier de la langue de Shakespeare voici un résumé :
    La première commande "cd" permet de changer de répertoire. la seconde commande ls, située après le ; donne la liste des fichiers du répertoire en cours (celui de la commande cd)
    Comme indiqué par Apple, si tu utilises 2 fois la commande "do shell script", chacune sera exécutée dans 2 process shell différents. avec le ; ils sont dans le même contexte.

    Enfin, excuse moi, je n'avais pas vu que c'était un upload et non un download.
    Si il n'est pas possible de lire la taille sur le serveur distant, alors je ne connais pas de commande Unix autres. Peut être peux tu poster ta question sur l'autre partie de ce forum, plus spécialisée dans les commandes Unix.

    Cordialement

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2013
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    PBELL
    Page Apple intéressante. Les signes ";" "&&" et "||" fonctionnent tous les 3 (http://www.linuxandlife.com/2012/07/...-terminal.html) même si c'est pour Linux. Les différences entre les 3 sont plutôt intéressantes.

    Pour le retour "fichier uploadé", je vais utiliser osascript, ça fonctionne. En fait je ne vais pas afficher une fenêtre dialogue en d'upload, mais agir directement sur ma base de données Filemaker et c'est Filemaker qui lancera une alerte.

    Mais je n'arrive toujours pas à placer " > /dev/null 2>&1 &".
    Si tu as une piste, je suis toujours preneur. Sinon j'irai voir du côté forum "Shell et commande POSIX". Mais à mon retour en août.
    Dans tous les cas merci.

Discussions similaires

  1. script qui lance plusieurs commandes dos ?
    Par casier dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 13/08/2007, 07h47
  2. Macro unique pour plusieurs fichiers excel
    Par jackbauer972 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 09/07/2007, 13h41
  3. utiliser un menu unique pour plusieurs pages...
    Par brouette dans le forum ActionScript 1 & ActionScript 2
    Réponses: 8
    Dernier message: 17/12/2006, 01h29
  4. Manager unique pour plusieurs instances ?
    Par siddh dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 18/09/2006, 09h47
  5. [VBA-E]une macro unique pour plusieurs fichiers excel
    Par fanchic29 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/04/2006, 16h20

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