Как заставить Mac Terminal восстанавливать рабочие каталоги при перезагрузке


16

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

Что я делаю неправильно? Может ли это быть вызвано некоторыми настройками в ~/.bash_profile?


Я думаю, что вы можете найти то, что вы ищете в этой теме. apple.stackexchange.com/questions/863/…
dhempler

1
Так я ошибаюсь, предполагая, что это должно быть поддержано из коробки?
Оливер Дротбом

Ответы:


15

(Для справки мы говорим о функции возобновления Mac OS X Lion 10.7 и более поздних версий.)

Терминал автоматически восстанавливает рабочий каталог, если вы используете оболочку по умолчанию, bash. Если вы используете какую-то другую оболочку, вам нужно будет адаптировать код /etc/bashrcдля отправки escape-последовательности для передачи рабочего каталога в терминал, чтобы он мог позже восстановить каталог для возобновления. Если вы используете zsh, посмотрите мой ответ на Resume Zsh-Terminal (OS X Lion) , в который я включил соответствующий код для zsh.

Если у вас есть пользовательские настройки ~/.bash_profileили ~/.bashrcвам может потребоваться убедиться, что вы не отменяете поведение по умолчанию, изменив /etc/bashrcнастройки. В частности, он устанавливает PROMPT_COMMANDпеременную среды для отправки escape-последовательности в каждом приглашении. Если вы настраиваете эту переменную, вам нужно добавить префикс или добавить код к текущему значению, например:

PROMPT_COMMAND="<your code here>;$PROMPT_COMMAND"

Также, как правило, ~/.bash_profileследует выполнить ~/.bashrc:

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

1
Спасибо за ответ, но я не могу заставить это работать. Я удалил свой .bashrc(хотя я не смог определить какую-либо настройку командной строки. Теперь я делаю следующее: 1. Откройте новое окно терминала (открывается в домашнем каталоге моего пользователя) 2. Документы CD 3. Закройте терминал 4. Откройте терминал 5 Окно снова открывается, отображая вывод об изменении каталога, но все еще находясь в домашнем каталоге пользователя
Оливер Дротбом,

@OliverGierke терминал создает регистрационные оболочки, так и проверить ~/.bash_profile, ~/.bash_loginи ~/.profile.
Крис Пейдж

У меня нет последних двух, первый теперь выполняется ~/.bashrcсогласно вашему предложению в вашем ответе.
Оливер Дротбом

2
Я понял это, Крис. /etc/bashrcПохоже, мой был подправлен установочным скриптом или чем-то еще. Был файл,/etc/bashrc.orig который содержал некоторые дополнительные настройки (я предполагаю, что это исходная настройка) gist.github.com/3273170 . Повторно добавив это к /etc/bashrcсделанным вещам, работающим как ожидалось снова. Большое спасибо за помощь и терпение!
Оливер Дротбом

Я не изменяю $ PROMPT_COMMAND в моем .bashrc, и у меня есть только системное значение по умолчанию / etc / bashrc. Есть еще предложения?
Ричард

3

Если вы используете Bash-It, вы можете столкнуться с проблемой $PROMPT_COMMANDперезаписи им.

Как уже упоминалось, он используется OS X для восстановления cwd в новых вкладках. Баш должен добавлять значения, а не переопределять их.

Но временным решением проблемы было бы добавить следующую строку к вашему ~/.bash_profile

source $BASH_IT/bash_it.sh
export PROMPT_COMMAND="$PROMPT_COMMAND;update_terminal_cwd;"

Для получения дополнительной информации о системе отслеживания проблем для обновлений: https://github.com/revans/bash-it/issues/240

И ссылка Apple для этого https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man1/sh.1.html


1

Я написал сообщение в блоге о том, как сделать это для csh / tcsh, прежде чем я нашел этот ответ; если кто-то приходит сюда в поисках решения для этих оболочек, вот оно:

if ("$?TERM_PROGRAM") then
  if ("$TERM_PROGRAM" == "Apple_Terminal") then
    alias precmd 'printf "\033]7;%s\a" "file://$host$cwd:ags/ /%20/"'
  endif
endif

Добавьте это к вашему .cshrcили .tcshrcпо необходимости. (Внешний оператор if необходим, чтобы избежать ошибки при удаленном входе в систему, как в случае с ssh. Это должен быть отдельный оператор из-за правил расширения переменных в tcsh.)

Как и встроенная поддержка Apple bash, в этом решении не используются никакие внешние программы, кроме printfкак за счет выхода из пробелов. Если вам нужно избежать других специальных символов, вам придется потрудиться, чтобы найти более полное решение.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.