Domanda

Funziona (stampa, ad esempio, "3 argomenti"):

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

Questo non funziona (stampa solo "Argomento 3: tre" e non i due argomenti precedenti):

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

In entrambi i casi, sto eseguendo lo script utilizzando osascript su Mac OS X 10.5.5. Esempio di invocazione:

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

Non sto reindirizzando l'output, quindi so che lo script non genera un errore.

Se aggiungo un'istruzione finestra di dialogo di visualizzazione sopra esegui script di shell , viene generato un errore "nessuna interazione utente consentita", quindi so che sta eseguendo il ciclo corpo.

Cosa sto facendo di sbagliato? Cosa c'è in questo loop che impedisce a JavaScript di stampare nulla?

È stato utile?

Soluzione

Prova questo per evitare di dover usare il file temporaneo.

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

Altri suggerimenti

Il tuo problema sembra non essere correlato al loop, o all'uso di argv, per quella materia. Ecco un test case molto più semplice in cui solo l'ultimo esegui script di shell restituisce effettivamente un risultato:

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

Inoltre, la seguente leggera modifica produrrà i risultati previsti:

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 conterrà quattro righe, in questo modo:

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

Questa soluzione alternativa non riesce:

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

Anche adesso, viene restituita solo l'ultima riga. Ciò può essere correlato alla seguente domanda di TN2065 :

  

D: Il mio script produrrà output per molto tempo. Come faccio a leggere i risultati quando arrivano?

     

A: Ancora una volta, la risposta breve è che non & # 8217; t & # 8212; lo script di shell non tornerà fino a quando non verrà eseguito il comando. In termini Unix, non può essere utilizzato per creare una pipe. Quello che puoi fare, tuttavia, è mettere il comando in background (vedi la domanda successiva), inviare il suo output a un file e quindi leggere il file mentre si riempie.

Ahimè, non ho abbastanza AppleScript-fu per sapere come fare in modo che AppleScript stesso legga più righe, che sospetto funzionerebbe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top