menú - No se puede hacer un script de shell con una repetición con i de 1 a n loop
menu en bash shell (2)
Esto funciona (imprime, por ejemplo, "3 argumentos"):
to run argv
do shell script "echo " & (count argv) & " arguments"
end run
Esto no (solo imprime "Argumento 3: tres", 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 redireccionando la salida, así que sé que el script no está arrojando un error.
Si agrego una declaración de display dialog
sobre el do shell script
, arroja un error "interacción no permitida por el usuario", así que sé que está ejecutando el cuerpo del bucle.
¿Qué estoy haciendo mal? ¿Qué hay en este ciclo que hace que osascript no imprima nada?
Intente 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
Su problema parece no estar relacionado con el bucle, 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 cambio leve 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, como las siguientes:
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 generará resultados durante mucho tiempo. ¿Cómo leo los resultados a medida que entran?
A: De nuevo, la respuesta corta es que no lo haces: el script de shell no volverá hasta que el comando haya terminado. 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 (ver 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 AppleScript puede leer varias líneas, lo que sospecho que funcionaría.