Не могу сделать сценарий оболочки с повторением с циклом от 1 до n - PullRequest
3 голосов
/ 08 ноября 2008

Это работает (печатает, например, «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

В обоих случаях я запускаю скрипт, используя osascript в Mac OS X 10.5.5. Пример вызова:

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

Я не перенаправляю вывод, поэтому я знаю, что скрипт не выдает ошибку.

Если я добавлю оператор display dialog над do shell script, он выдаст ошибку «нет взаимодействия с пользователем», поэтому я знаю, что выполняется тело цикла.

Что я делаю не так? Что в этом цикле заставляет osascript ничего не печатать?

Ответы [ 2 ]

2 голосов
/ 08 ноября 2008

Попробуйте, чтобы избежать использования временного файла.

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 голосов
/ 08 ноября 2008

Ваша проблема, по-видимому, не связана с циклом или использованием argv. Вот гораздо более простой тестовый случай, когда только последний do shell script фактически возвращает результат:

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 будет содержать четыре строки, например:

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 :

В: Мой скрипт будет производить вывод в течение длительного времени. Как прочитать результаты по мере их поступления?

A: Опять же, краткий ответ: вы не выполняете сценарий оболочки, который не будет выполнен, пока команда не будет выполнена. В терминах Unix его нельзя использовать для создания канала. Однако вы можете поместить команду в фоновый режим (см. Следующий вопрос), отправить ее выходные данные в файл, а затем прочитать файл по мере его заполнения.

Увы, у меня недостаточно AppleScript-fu, чтобы знать, как заставить сам AppleScript читать несколько строк, что, я подозреваю, сработает.

...