Pergunta

Isso funciona (impressões, por exemplo, “3 argumentos”):

to run argv
    do shell script "echo " & (count argv) & " arguments"
end run

Isto não faz (imprime apenas “Argumento 3: três”, e não os anteriores dois argumentos):

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

Em ambos os casos, eu estou correndo o script usando osascript no Mac OS X 10.5.5. Exemplo invocação:

osascript 'Script that takes arguments.applescript' Test argument three

Eu não estou redirecionando a saída, então eu sei que o script não está jogando um erro.

Se eu adicionar uma declaração display dialog acima do do shell script, ele lança um erro “sem interação do usuário permitido”, então eu sei que ele está executando o corpo do laço.

O que estou fazendo de errado? O que é sobre este laço que causas osascript para não imprimir qualquer coisa?

Foi útil?

Solução

Tente isto para evitar ter que usar o arquivo temporário.

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

Outras dicas

Seu problema parece estar relacionado com o loop, ou o uso de argv, para essa matéria. Aqui está um caso de teste muito mais simples, onde apenas o último do shell script realmente retorna um resultado:

do shell script "echo foo"
delay 2
do shell script "echo bar"

Além disso, a seguinte ligeira mudança irá produzir 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 conterá quatro linhas, como assim:

3 arguments
Argument 1: foo
Argument 2: bar
Argument 3: baz

Esta solução alternativa falha:

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

Mesmo agora, apenas a última linha é retornada. Isso pode estar relacionado à seguinte pergunta de TN2065 :

Q: Meu script irá produzir uma saída durante um longo tempo. Como faço para ler os resultados como eles vêm?

A: Novamente, a resposta curta é que você não - fazer script shell não retornará até que o comando é feito. Em termos Unix, ele não pode ser usado para criar um tubo. O que você pode fazer, no entanto, é colocar o comando em segundo plano (veja a próxima pergunta), enviar sua saída para um arquivo e, em seguida, ler o arquivo que enche-se.

Infelizmente, eu não tenho o suficiente AppleScript-fu para saber como ter-se AppleScript ler várias linhas, que eu suspeito que iria funcionar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top