2014-09-08 3 views
0

У меня возникла проблема с типами при получении возвращаемого значения из сценария оболочки do.Applescript возвращаемое значение do script

Я проверяю, если все еще работает UNIX процессы Rsync

repeat until (do shell script "/bin/ps -ef | /usr/bin/grep -c [r]sync") > 0 
     delay 120 
end repeat 
tell application "Terminal" to quit 

Ценностные то будет возвращаться правильно: -> «4», но сценарий двинется к бросить курить. я не знаю, как установить правильные типы, я уже пробовал:

repeat until (do shell script "/bin/ps -ef | /usr/bin/grep -c [r]sync") > "0" 

Но результат тот же.

+0

Что вы имеете в виду «скрипт идет прямо к выводу»? Что вы ожидаете и что происходит на самом деле? –

+0

Если все еще выполняются процессы rsync, сценарий может не выйти из приложения Terminal. Вот почему я использую> 0 –

+0

, я его получаю. См. Мой ответ. –

ответ

0

Вы неправильно истолковал поведение repeat until: Цикл повторяется до тех пор, пока условие является не правда. Поскольку у вас уже есть запущенные процессы, ваше условие будет выдавать true, и, таким образом, внутренняя часть (delay 120) не будет выполнена.

Вы хотите повторить цикл до тех пор, пока выполняются процессы. Поэтому вам нужно сравнить с = 0 вместо > 0.

Таким образом, вы можете написать:

repeat until (do shell script "/bin/ps -ef | /usr/bin/grep -c [r]sync") = "0" 

или вы можете придерживаться вашего состояния и использовать while цикл, который выражает «до тех пор, как» условие:

repeat while (do shell script "/bin/ps -ef | /usr/bin/grep -c [r]sync") > "0" 
0

У вас есть это условие, как вы этого хотите? Ваша логика заключается в повторении до, результат больше 0. Но если результат больше нуля, то все еще выполняются процессы синхронизации. Например, вы говорите, что результат иногда 4. Когда результат 4, это упрощает для:

repeat until 4 > 0 
    delay 120 
end repeat 
tell application "Terminal" to quit 

С 4 больше 0, то условие было выполнено: он больше не будет повторяться, так как оно повторяется только до тех пор, пока значение больше нуля, чем оно. Таким образом, он переходит к следующему шагу, который должен сказать терминалу прекратить работу.

Я думаю, что вы хотите, либо повторение в то время как значение> 0, или повторение до значения = 0.

+0

Для меня логика была: если 4> 0 (все еще выполняется прогон), сценарий не может выйти из терминала и должен задерживаться. Я попробую решение = 0 –

+0

Конечно. Разница между * до * и * while * заключается в том, что «повторяется до тех пор, пока» не повторит * до тех пор, пока это условие не будет выполнено; то есть, как только условие выполнено, оно перестает повторяться и продолжается после «завершения повтора». Принимая во внимание, что «repeat while» повторяет * while *, что условие выполнено; то есть цикл повторения выходит только после того, как условие будет * не * встречено. Поскольку у вас есть вариант до варианта, а 4 больше 0, условие выполняется, и цикл никогда не вводится. Обратите внимание: если скрипт когда-либо запускался, когда не было никакого процесса, он входил бы в бесконечный цикл: 0 не больше 0. –

Смежные вопросы