2008-11-08 1 views
3

n 번째 루프 1 ~ 내가있는 반복과 쉘 스크립트를 수행 할 수 없습니다는 ("3 인자", 예를 들어, 인쇄)이 작동

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

이하지 않습니다 (인쇄 전용 "인수 3 세 ", 그리고 앞의 두 인자) : 두 경우 모두

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 

, 나는 맥 OS X 10.5.5에 osascript를 사용하여 스크립트를 실행하고 있습니다. 예제 호출 :

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

출력이 리디렉션되지 않으므로 스크립트에서 오류가 발생하지 않습니다.

do shell script 위의 display dialog 문을 추가하면 "사용자 상호 작용 허용 안 함"오류가 발생하므로 루프 본문을 실행 중임을 알 수 있습니다.

내가 뭘 잘못하고 있니? osascript가 아무것도 인쇄하지 못하게하는이 루프는 무엇입니까?

답변

2

임시 파일을 사용하지 않아도되도록하십시오.

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 
+0

내 질문에 'Do shell script'는 '시스템'이 아니라 'popen'입니다. 마지막 줄은 osascript가 스크립트의 반환 값을 인쇄하기 때문에 터미널로갔습니다. 감사합니다. –

0

문제는 루프 또는 argv 사용과 관련이없는 것으로 보입니다.

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

또한, 다음과 같은 약간의 변화가 예상 생성합니다 결과 :

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 지금처럼 네 줄이 포함됩니다 여기에 실제로 결과를 반환 마지막 do shell script 훨씬 간단한 테스트 케이스이다 :

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

이 해결 방법은 실패

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 

지금도 마지막 줄만 반환됩니다. 이것은 TN2065의 다음 질문과 관련 될 수 있습니다.

Q : 내 스크립트는 오랜 시간 동안 출력을 생성합니다. 그들이 들어올 때 결과를 어떻게 읽습니까?

대답 : 짧은 대답은 명령을 완료 할 때까지 셸 스크립트가 반환되지 않는다는 것입니다. Unix 용어로는 파이프를 만드는 데 사용할 수 없습니다. 그러나 명령을 백그라운드에 놓고 (다음 질문 참조) 출력을 파일로 보낸 다음 파일이 가득 차면 파일을 읽는 것입니다.

아아, AppleScript-fu가 여러 줄을 읽는 방법을 알기에는 충분하지 않습니다.