No se puede hacer el script de shell con una repetición con i de 1 a n loop
-
07-07-2019 - |
Pregunta
Esto funciona (imprime, por ejemplo, & # 8220; 3 argumentos & # 8221;):
to run argv
do shell script "echo " & (count argv) & " arguments"
end run
Esto no lo hace (solo imprime & # 8220; Argumento 3: tres & # 8221 ;, y no los dos argumentos anteriores):
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
En ambos casos, estoy ejecutando el script usando osascript
en Mac OS X 10.5.5. Ejemplo de invocación:
osascript 'Script that takes arguments.applescript' Test argument three
No estoy redirigiendo la salida, así que sé que el script no arroja un error.
Si agrego una instrucción display dialog
sobre el do shell script
, arroja un & # 8220; no se permite la interacción del usuario & # 8221; error, así que sé que está ejecutando el cuerpo del bucle.
¿Qué estoy haciendo mal? ¿Qué tiene este bucle que hace que el osascript no imprima nada?
Solución
Pruebe esto para evitar tener que usar el archivo temporal.
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
Otros consejos
Su problema parece no estar relacionado con el ciclo, o el uso de argv, para el caso. Aquí hay un caso de prueba mucho más simple donde solo el último do shell script
realmente devuelve un resultado:
do shell script "echo foo"
delay 2
do shell script "echo bar"
Además, el siguiente ligero cambio producirá los resultados esperados:
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
contendrá cuatro líneas, así:
3 arguments
Argument 1: foo
Argument 2: bar
Argument 3: baz
Esta solución alternativa falla:
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
Incluso ahora, solo se devuelve la última línea. Esto puede estar relacionado con la siguiente pregunta de TN2065 :
P: Mi script producirá resultados durante mucho tiempo. ¿Cómo leo los resultados a medida que aparecen?
R: Una vez más, la respuesta corta es que no debe hacer - el script de shell no volverá hasta que se complete el comando. En términos de Unix, no se puede usar para crear una tubería. Sin embargo, lo que puede hacer es poner el comando en segundo plano (consulte la siguiente pregunta), enviar su salida a un archivo y luego leer el archivo a medida que se llena.
Por desgracia, no tengo suficiente AppleScript-fu para saber cómo hacer que AppleScript lea varias líneas, lo que sospecho que funcionaría.