Мне любопытно, нашел ли кто-нибудь хороший способ открыть приложение Terminal на Mac без открытия окна. Предпочтение при запуске имеет параметры «Новое окно с настройками:» или открыть определенную группу окон, но я бы предпочел, чтобы она просто ничего не открывала для начала. Я попытался сохранить группу окон без окон в ней, но она возвращается к открытию окна по умолчанию снова.
1 ответ
Я не мог найти какой - либо параметр , чтобы окно от открытия при запуске терминала, но вы можете проверить , был ли запущен текущий сеанс bash
точно в том же время был запущен терминал. Если это так, сеанс bash
должен завершиться.
Вы увидите, что окно появляется и исчезает на долю секунды, хотя.
Добавьте следующий код (проверено на Mac OS X 10.5.8 (Leopard) [ см. Мою заметку ниже ] и OS X 10.8.2 (Mountain Lion)) в начале вашего ~/.bash_profile
:
shell_started=$(ps -A -o lstart $$ | grep -v STARTED)
terminal_started=$(ps -A -o lstart $(ps -A -o pid -o command | grep '/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal -psn' | grep -v grep | cut -d '/' -f 1) | grep -v STARTED)
if [ "X$shell_started" == "X$terminal_started" ]; then exit; fi
Объяснение кода:
shell_started=$(ps -A -o lstart $$ | grep -v STARTED
): выполнитьps
для печати при запуске процесса, идентифицируемого переменной$$
($$
расширяется до PID в этом сеансеbash
). Затем отфильтруйте заголовок (который содержит словоSTARTED
). Присвойте полученное значение переменнойshell_started
.
ps -A -o pid -o command | grep '/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal -psn' | grep -v grep | cut -d '/' -f 1
: выполнитьps
чтобы напечатать все имена команд процесса, выбрать тот, который соответствует полному пути к Терминалу, отфильтровать любые побочные процессыgrep
и извлечь идентификатор процесса с помощьюcut
.
terminal_started=$(ps -A -o lstart $(...) | grep -v STARTED)
: выполнитьps
для печати при запуске процесса Terminal и отфильтровать заголовок (который содержит словоSTARTED
).(Я должен был составить
terminal_started
в два этапа , чтобы избавиться от ТКСps
добавленными к выходу.)
if [ "X$shell_started" == "X$terminal_started" ]; then exit; fi
: Сравните обе даты и, если они равны, выйдите из оболочки, то есть закройте окно терминала.
Если это не работает для вас (как это было в случае с OP, который использует Mac OS X 10.6.8 (Snow Leopard)), попробуйте:
shell_started=$(ps -A -o lstart $$ | grep -v STARTED)
terminal_started=$(ps -A -o lstart $(ps -A -o pid -o command | grep '/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal -psn' | grep -v grep | tail -n 1| cut -d '/' -f 1) | grep -v STARTED)
if [ "X$shell_started" == "X$terminal_started" ]; then exit; fi
(Единственное отличие здесь - это tail
в terminal_started
который выбирает последнюю запись, напечатанную ps
, если их больше одного.)
Примечание для Mac OS X 10.5.8 (Leopard): на моем старом PowerBook G4 я заметил, что иногда между разом запуска терминала и текущим сеансом bash
была разница в одну секунду. Если вы сталкиваетесь с подобными проблемами на медленном компьютере, добавьте эти три строки в конец кода выше:
one_second_before=$(expr "$shell_started" : '.*:\([0-9][0-9]\) .*' - 1)
shell_started_one_second_before=$(echo $shell_started | sed 's/\(.*:\)\([0-9][0-9]\)\( .*\)/\1'$one_second_before'\3/')
if [ "X$shell_started_one_second_before" == "X$terminal_started" ]; then exit; fi
Есть граничное условие, которое этот код плохо обрабатывает, а именно, когда оболочка была запущена во втором 0, но я не хотел добавлять дополнительную сложность.