não pode fazer script shell com uma repetição com i de 1 a n circuito
-
07-07-2019 - |
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?
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.