script menú hacer example con como shell for-loop applescript repeat osascript

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.