Jak zmusić terminal Mac do przywracania katalogów roboczych podczas ponownego uruchamiania

16

Używam terminala Mac z ręką pełną kart, z których każda jest przypisana do innego katalogu roboczego. Skonfigurowałem go tak, aby otwierał nowe okna z tym samym katalogiem roboczym. Niemniej jednak, kiedy wychodzę z terminalu i uruchamiam go ponownie, odbudowuje wszystkie zakładki, ich nazwy, pokazuje mi nawet ostatnie wyjście w oknie, ale pozostaje w katalogu osobistym użytkownika i nie przywraca najnowszego katalogu roboczego każdej zakładki.

Co ja robię źle? Czy może to być spowodowane niektórymi ustawieniami w ~/.bash_profile?

Oliver Drotbohm
źródło
Myślę, że możesz znaleźć to, czego szukasz w tym wątku. apple.stackexchange.com/questions/863/…
dhempler
1
Czy mam więc rację, zakładając, że powinno to być obsługiwane od razu po wyjęciu z pudełka?
Oliver Drotbohm

Odpowiedzi:

15

(Dla porównania mówimy o funkcji Resume w Mac OS X Lion 10.7 i nowszych).

Terminal automatycznie przywraca katalog roboczy, jeśli używasz domyślnej powłoki, bash. Jeśli używasz innej powłoki, musisz dostosować kod, /etc/bashrcaby wysłać sekwencję zmiany znaczenia w celu przekazania katalogu roboczego do Terminala, aby mógł później przywrócić katalog do Wznowienia. Jeśli używasz zsh, zobacz moją odpowiedź na Resume Zsh-Terminal (OS X Lion) , w której dołączam odpowiedni kod dla zsh.

Jeśli masz niestandardowy ~/.bash_profilelub ~/.bashrcbyć może będziesz musiał upewnić się, że nie cofniesz domyślnego zachowania, modyfikując /etc/bashrcdostosowania. W szczególności ustawia PROMPT_COMMANDzmienną środowiskową, aby wysyłała sekwencję zmiany znaczenia przy każdym pytaniu. Jeśli dostosujesz tę zmienną, musisz poprzedzić kod lub dołączyć go do bieżącej wartości, np .:

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

Ogólnie rzecz biorąc, ~/.bash_profilepowinien również wykonać ~/.bashrc:

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
Chris Page
źródło
1
Dzięki za odpowiedź, ale wydaje mi się, że nie mogę tego zrobić. Usunąłem swoje .bashrc(chociaż nie zauważyłem możliwości dostosowania poleceń. Teraz wykonuję następujące czynności: 1. Otwórz nowe okno Terminalu (otwiera się w katalogu osobistym mojego użytkownika) 2. Dokumenty cd 3. Zamknij Terminal 4. Otwórz Terminal 5 Okno ponownie się wyświetla, wyświetlając wynik zmiany katalogu, ale nadal znajduje się w katalogu domowym użytkownika
Oliver Drotbohm
@OliverGierke Terminal tworzy logowania muszle, więc również sprawdzić ~/.bash_profile, ~/.bash_logini ~/.profile.
Chris Page
Nie mam dwóch ostatnich, pierwszy wykonuje teraz ~/.bashrczgodnie z twoją sugestią w odpowiedzi.
Oliver Drotbohm
2
Zrozumiałem, Chris. /etc/bashrcWygląda na to, że mój kod został poprawiony przez skrypt instalacyjny lub cokolwiek innego. Była taka, /etc/bashrc.origktóra zawierała dodatkową konfigurację (którą zakładam, że jest oryginalną konfiguracją) gist.github.com/3273170 . Ponowne dodanie tego do /etc/bashrcsprawionych rzeczy działało zgodnie z oczekiwaniami. Wielkie dzięki za pomoc i cierpliwość!
Oliver Drotbohm,
Nie zmieniam $ PROMPT_COMMAND w moim pliku .bashrc i mam tylko domyślny system / etc / bashrc. Jakieś dalsze sugestie?
Richard
3

Jeśli używasz Bash-It, możesz napotkać problem z $PROMPT_COMMANDnadpisaniem go.

Jak wspomniano, jest używany przez OS X do przywracania cwd w nowych kartach. Bash powinien dodawać wartości, a nie nadpisywać je.

Ale obejściem na razie byłoby dodanie następującego wiersza do twojego ~/.bash_profile

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

Aby uzyskać więcej informacji, sprawdź narzędzie do śledzenia problemów dla aktualizacji: https://github.com/revans/bash-it/issues/240

I referencje Apple na ten temat https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man1/sh.1.html

Michael Yagudaev
źródło
1

Napisałem wpis na blogu, jak to zrobić dla csh / tcsh, zanim odkryłem tę odpowiedź; jeśli ktoś tu przyjdzie i szuka rozwiązania dla tych powłok, oto:

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

Dodaj to do swojego .cshrclub .tcshrcodpowiednio. (Zewnętrzna instrukcja if jest niezbędna, aby uniknąć błędu podczas zdalnego logowania, tak jak w przypadku ssh. Musi to być osobna instrukcja ze względu na reguły rozszerzania zmiennych w tcsh.)

Podobnie jak wbudowana obsługa Apple bash, to rozwiązanie nie korzysta z żadnych zewnętrznych programów printf, kosztem jedynie ucieczki. Jeśli musisz uciec przed innymi postaciami specjalnymi, będziesz musiał trochę ciężko pracować, aby znaleźć bardziej kompleksowe rozwiązanie.

rsfinn
źródło