MacCentre
Форум: Mac и Mac OS X
Тема: Вопрос по Терминалу
Страницы: [1] 2 3

[Ответить]
Eggorka [18.11.2009 19:17] Вопрос по Терминалу:
Возможно ли в Терминале сделать следующее: если в нём открыто одно окно (один Shell), то выйти из Терминала, а если открыто несколько -- то закрыть только активное и не выходить из Терминала?
HFS+ [18.11.2009 19:22] :
Вы сами поняли, что написали? Вы можете закрыть окно, не закрывая программы(процесса)! Попробуйте сами - вам понравится! Если конечно, я понял, что вы от нас хотите услышать...
Eggorka [18.11.2009 19:25] :
Да, я хочу именно этого, но сделать это надо при помощи терминальных команд, а не через меню/горячие клавиши, чтобы использовать в скрипте.
Daniel [19.11.2009 02:50] :
Если я правильно вас понял, то вот это может помочь:
http://developer.apple.com/mac/library/documentation/Cocoa/Reference/NSApplicationDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/NSApplicationDelegate/applicationShouldTerminateAfterLastWindowClosed:
Eggorka [19.11.2009 11:14] :
Daniel
Спасибо, посмотрю, но, по-моему, не то. Не понял, что и как вводить в виде команды в терминале...

Ещё раз, дубль третий (когда же я научусь сразу писать кратко и понятно всем?). Есть скрипт, выполняемый в терминале, скажем, резервное копирование каких-либо файлов. Скрипт выполняется одним кликом на его иконке: автоматически открывается терминал, происходит копирование файлов и в конце происходит выход из терминала. Раньше выход я прописал, не мудрствуя лукаво, при помощи killall Terminal, но у такого решения есть косяк -- если в терминале открыто ещё одно окно, то оно тоже закрывается вместе с терминалом. Вот и думаю, возможно ли найти решение, чтобы в скрипте прописать не однозначный выход из терминала, а выход по условию, что это единственное открытое окно терминала, в противном же случае лишь закрыть окно выполняемого скрипта.

Надеюсь, теперь понятнее?
Eggorka [19.11.2009 21:43] :
Ну вот, почти победил, правда, при помощи AppleScript. Создал в нём такой скрипт:
tell application "Terminal"
if (count of (every window whose visible is true)) ≤ 1 then
quit
else
close window 1
end if
end tell
Сохранил его как приложение, убрав галку Startup Screen и назвав MyExitTerminal, а в конце своего терминального скрипта дописал:
open /Users/user/MyExitTerminal.app

Попутно обнаружил, что терминальный скрипт почему-то не выполняется, если до его запуска уже запущен терминал или открыто окно терминала, в котором ничего не происходит. Мистика какая-то.
zztatarin [20.11.2009 08:04] :
Никакой мистики.Пытаемся закрыть окно с индексом ОДИН, а его не существует.
Вот правильный код:
tell application "Terminal"
if (count of every window) ≤ 1 then
quit
else
close (every window whose contents contains "[ИМЯ ТЕРМИНАЛЬНОГО СКРИПТА] или [ДРУГОЙ ОТЛИЧИТЕЛЬНЫЙ ПРИЗНАК ОКНА, КОТОРОЕ НАДО ЗАКРЫТЬ]")
end if
end tell
Этот код работает так же со свернутыми в Док окнами.
Eggorka [20.11.2009 09:45] :
Спасибо, так действительно лучше. Но проблема была не в этом. У меня почему-то любой shell-скрипт в терминале не выполняется, если до его запуска уже запущен терминал или открыто окно терминала, в котором ничего не происходит. Вот пример. Пишем простенький скрипт:
#!/bin/tsch
cp -R /Users/user/1 /Users/user/Desktop/1
Запускаем его, выбрав приложение Terminal. Скрипт отрабатывает, копируя файл "1" на десктоп из указанной папки. Далее. Запускаем Терминал. И снова пытаемся выполнить этот скрипт -- не работает! Усложняем задачу, пишем ещё один скрипт:
#!/bin/tsch
sleep 10
Запускаем его (он просто ждёт 10 секунд), и пока он выполяется запускаем первый скрипт -- тот работает...
zztatarin [20.11.2009 13:14] :
Так. С самого начала.
1.
Это чё...?
Под tcsh, bash и sh все работает без бубнов.
2.
Права на исполнение стоЯт?

Кстати ещё более правильный код:tell application "Terminal"
close (every window whose contents contains "[Process completed]")
if (count of every window) = 0 then
quit
end if
end tell

Eggorka [20.11.2009 18:12] :
Это чё...?
Под tcsh, bash и sh все работает без бубнов.

Сорри, опечатался, конечно. По памяти набирал. А по сути -- пробовал и в tcsh, и в bash, и в sh -- везде одно и то же.
Ну дык выполняется же скрипт, если терминал не был запущен до этого, значит, НЯМС, с правами всё в порядке.
Ну а это прям вообще идеал. Спасибо ещё раз.
[Ответить]
[Вперед >]