2

Мне любопытно, нашел ли кто-нибудь хороший способ открыть приложение Terminal на Mac без открытия окна. Предпочтение при запуске имеет параметры «Новое окно с настройками:» или открыть определенную группу окон, но я бы предпочел, чтобы она просто ничего не открывала для начала. Я попытался сохранить группу окон без окон в ней, но она возвращается к открытию окна по умолчанию снова.

1 ответ1

2

Я не мог найти какой - либо параметр , чтобы окно от открытия при запуске терминала, но вы можете проверить , был ли запущен текущий сеанс 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, но я не хотел добавлять дополнительную сложность.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .