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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top