AppleScript - дождаться завершения сценария оболочки - PullRequest
0 голосов
/ 20 марта 2020

Я пишу инструмент командной строки для извлечения информации mov ie из IMDB. Это в JavaScript и называется movinfo. Я запускаю его в AppleScript:

tell application "System Events"
    set movT to "Back-to-the-future"
    set exportPath to "export PATH=$PATH:/usr/local/bin:;"
    set oriInfo to do shell script exportPath & "movinfo " & quoted form of movT
    return oriInfo
end tell

Отлично работает. Но иногда movinfo занимает много времени, чтобы получить информацию из Inte rnet. Поэтому я хочу добавить функцию, чтобы проверить, производится выборка или нет. Сначала я пытаюсь "игнорировать ... заканчивать игнорировать" структуру:

tell application "System Events"
    ignoring application responses
        set movT to "Back-to-the-future"
        set exportPath to "export PATH=$PATH:/usr/local/bin:;"
        set oriInfo to do shell script exportPath & "movinfo " & quoted form of movT
    end ignoring
end tell

tell application "System Events"
    repeat 30 times
        try
            return oriInfo
            exit repeat
        on error
            delay 1
        end try
    end repeat
    do shell script "killall System\\ Events"
end tell

Но это не работает. Может быть, я могу что-то сделать с помощью инструмента командной строки, чтобы сделать эту работу. Но я действительно не знаю слишком много о JavaScript и CLI. Я хочу сделать это в AppleScript. Надеюсь, кто-то может сказать мне, что не так с кодом, или как это сделать в AS?

1 Ответ

0 голосов
/ 20 марта 2020

Обратите внимание, что у меня нет утилиты movinfo (вы не указали ссылку), поэтому я не могу проверить это, но она должна работать с номинальной стоимостью.

Сначала (как указал Вадиан) в комментариях) вам не нужно, чтобы системные события сообщали блоки, как вы их использовали, поэтому я реструктурировал это. Хитрость заключается в том, чтобы отсоединить утилиту movinfo, чтобы она работала как независимый от скрипта процесс, записав информацию mov ie в файл на ~/movieInfo.txt. Затем сценарий восстанавливает pid процесса из do shell script и ожидает завершения работы утилиты, используя системные события, чтобы проверить, работает ли еще процесс с этим pid. Когда процесс заканчивается, скрипт считывает информацию из файла обратно в переменную oriInfo. С вопросами по поводу уловок unix обращайтесь: Technote 2065 .

-- set output file path
set movieInfoFile to POSIX path of (path to home folder from user domain) & "movieInfo.txt"

set movT to "Back-to-the-future"
set exportPath to "export PATH=$PATH:/usr/local/bin:;"
-- run and detach utility, returning its process id
set procID to do shell script exportPath & "movinfo " & quoted form of movT & " &> " & movieInfoFile & " & echo $!"

repeat 30 times
    tell application "System Events"
        -- test if pid is still active
        set isStillRunning to count of (every process whose unix id is procID)
    end tell
    if isStillRunning = 0 then
        --not active, so proceed
        exit repeat
    else
        delay 1
    end if
end repeat

-- pull info from file 
set fp to open for access movieInfoFile
set oriInfo to read fp
close access fp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...