Question

Cela fonctionne (imprime, par exemple, & # 8220; 3 arguments & # 8221;):

to run argv
    do shell script "echo " & (count argv) & " arguments"
end run

Cela ne fonctionne pas (affiche uniquement & # 8220; Argument 3: trois & # 8221 ;, et non les deux arguments précédents):

to run argv
    do shell script "echo " & (count argv) & " arguments"

    repeat with i from 1 to (count argv)
        do shell script "echo 'Argument " & i & ": " & (item i of argv) & "'"
    end repeat
end run

Dans les deux cas, j'exécute le script à l'aide de osascript sous Mac OS X 10.5.5. Exemple d'appel:

osascript 'Script that takes arguments.applescript' Test argument three

Je ne redirige pas la sortie, je sais donc que le script ne génère pas d'erreur.

Si j'ajoute une instruction display dialog au-dessus du script do shell , une interaction sans utilisateur est autorisée & # 8221; erreur, donc je sais qu'il exécute le corps de la boucle.

Qu'est-ce que je fais mal? En quoi cette boucle empêche-t-elle osprint d’imprimer?

Était-ce utile?

La solution

Essayez ceci pour éviter d'avoir à utiliser le fichier temporaire.

to run argv
        set accumulator to do shell script "echo " & (count argv) & " arguments" altering line endings false
        repeat with i from 1 to (count argv)
                set ln to do shell script "echo 'Argument " & i & ": " & (item i of argv) & "'" altering line endings false
                set accumulator to accumulator & ln
        end repeat
        return accumulator
end run

Autres conseils

Votre problème ne semble pas être lié à la boucle ni à l'utilisation de argv. Voici un cas de test beaucoup plus simple où seul le dernier script shell renvoie un résultat:

do shell script "echo foo"
delay 2
do shell script "echo bar"

De plus, le léger changement suivant produira les résultats attendus:

to run argv
    do shell script "echo " & (count argv) & " arguments > /test.txt"

    repeat with i from 1 to (count argv)
        do shell script "echo 'Argument " & i & ": " & (item i of argv) & "' >> /test.txt"
    end repeat
end run

test.txt contiendra quatre lignes, comme suit:

3 arguments
Argument 1: foo
Argument 2: bar
Argument 3: baz

Cette solution de contournement échoue:

to run argv
    do shell script "echo " & (count argv) & " arguments > /tmp/foo.txt"

    repeat with i from 1 to (count argv)
        do shell script "echo 'Argument " & i & ": " & (item i of argv) & "' >> /tmp/foo.txt"
    end repeat

    do shell script "cat /tmp/foo.txt"
    do shell script "rm /tmp/foo.txt"
end run

Même à présent, seule la dernière ligne est renvoyée. Cela peut être lié à la question suivante de TN2065 :

  

Q: Mon script produira une sortie sur une longue période. Comment lire les résultats au fur et à mesure qu'ils arrivent?

     

R: Encore une fois, la réponse courte est que vous ne le faites pas - un script shell ne sera renvoyé que lorsque la commande sera terminée. En termes Unix, il ne peut pas être utilisé pour créer un tuyau. Ce que vous pouvez faire, cependant, est de mettre la commande en arrière-plan (voir la question suivante), d’envoyer sa sortie dans un fichier, puis de lire le fichier à mesure qu’il se remplit.

Hélas, je n'ai pas assez de AppleScript-fu pour savoir comment faire lire plusieurs lignes à AppleScript, ce qui, je suppose, fonctionnerait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top