Impossibile eseguire lo script di shell ripetendo con i da 1 a n loop
-
07-07-2019 - |
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?
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.