So stellen Sie mit Mac Terminal die Arbeitsverzeichnisse beim Neustart wieder her

16

Ich benutze das Mac-Terminal mit einer Hand voll Registerkarten, die jeweils einem anderen Arbeitsverzeichnis zugeordnet sind. Ich habe es so konfiguriert, dass neue Fenster mit demselben Arbeitsverzeichnis geöffnet werden. Wenn ich Terminal beende und neu starte, werden alle Registerkarten neu erstellt, ihre Namen, und es wird mir sogar die letzte Ausgabe im Fenster angezeigt, aber das Benutzerverzeichnis wird beibehalten und das neueste Arbeitsverzeichnis der einzelnen Registerkarten wird nicht wiederhergestellt.

Was mache ich falsch? Kann dies durch eine Einstellung in der verursacht werden ~/.bash_profile?

Oliver Drotbohm
quelle
Ich denke, Sie können in diesem Thread finden, wonach Sie suchen. apple.stackexchange.com/questions/863/…
dhempler
1
Liege ich also falsch, wenn ich annehme, dass dies sofort unterstützt werden sollte?
Oliver Drotbohm

Antworten:

15

(Als Referenz sprechen wir über die Resume-Funktion von Mac OS X Lion 10.7 und höher.)

Terminal stellt das Arbeitsverzeichnis automatisch wieder her, wenn Sie die Standardshell bash verwenden. Wenn Sie eine andere Shell verwenden, müssen Sie den Code anpassen /etc/bashrc, um eine Escape-Sequenz für die Übermittlung des Arbeitsverzeichnisses an Terminal zu senden, damit das Verzeichnis später für Resume wiederhergestellt werden kann. Wenn Sie zsh verwenden, lesen Sie meine Antwort auf Resume Zsh-Terminal (OS X Lion) , in der ich den entsprechenden Code für zsh einfüge.

Wenn Sie eine benutzerdefinierte Einstellung haben ~/.bash_profileoder ~/.bashrcsicherstellen müssen, dass Sie das Standardverhalten nicht durch Ändern /etc/bashrcder Anpassungen rückgängig machen . Insbesondere wird die PROMPT_COMMANDUmgebungsvariable so festgelegt, dass die Escape-Sequenz bei jeder Eingabeaufforderung gesendet wird. Wenn Sie diese Variable anpassen, müssen Sie dem aktuellen Wert ein Präfix voranstellen oder den Code anhängen, z.

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

Außerdem sollte im Allgemeinen ~/.bash_profileFolgendes ausgeführt werden ~/.bashrc:

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
Chris Page
quelle
1
Danke für die Antwort, aber ich scheine nicht in der Lage zu sein, das zum Laufen zu bringen. Ich habe meine entfernt .bashrc(obwohl ich keine Anpassung der Eingabeaufforderung feststellen konnte. Jetzt gehe ich wie folgt vor: 1. Öffnen Sie ein neues Terminalfenster (wird im Ausgangsverzeichnis meines Benutzers geöffnet) 2. CD-Dokumente 3. Beenden Sie Terminal 4. Öffnen Sie Terminal 5 Das Fenster wird erneut geöffnet und zeigt die Ausgabe des Verzeichniswechsels an, befindet sich jedoch immer noch im Ausgangsverzeichnis des Benutzers.
Oliver Drotbohm
@OliverGierke - Terminal erstellt Login - Shells, so überprüfen Sie auch ~/.bash_profile, ~/.bash_loginund ~/.profile.
Chris Seite
Die beiden letzteren habe ich nicht, der erstere wird jetzt ~/.bashrcgemäß Ihrem Vorschlag in Ihrer Antwort ausgeführt.
Oliver Drotbohm
2
Ich habe es herausgefunden, Chris. Meine /etc/bashrcscheint durch ein Installationsskript oder was auch immer optimiert worden zu sein. Es gab eine /etc/bashrc.orig, die eine zusätzliche Konfiguration enthielt (von der ich annehme , dass sie das ursprüngliche Setup ist) gist.github.com/3273170 . Füge das wieder zu den /etc/bashrcSachen hinzu, die wieder wie erwartet funktionieren. Vielen Dank für Hilfe und Geduld!
Oliver Drotbohm
Ich ändere das $ PROMPT_COMMAND in meinem .bashrc nicht und ich habe nur den Systemstandard / etc / bashrc. Irgendwelche weiteren Vorschläge?
Richard
3

Wenn Sie Bash-It verwenden, besteht möglicherweise das Problem, $PROMPT_COMMANDdass Sie von Bash-It überschrieben werden.

Wie bereits erwähnt, wird es von OS X verwendet, um cwd in neuen Registerkarten wiederherzustellen. Bash sollte es Werte anhängen, nicht überschreiben.

Ein Workaround für den Moment wäre es jedoch, die folgende Zeile zu Ihrer hinzuzufügen ~/.bash_profile

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

Weitere Informationen finden Sie im Issue Tracker unter https://github.com/revans/bash-it/issues/240

Und die Apple-Referenz dafür https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man1/sh.1.html

Michael Yagudaev
quelle
1

Ich habe einen Blog-Beitrag darüber verfasst, wie das mit csh / tcsh gemacht werden kann, bevor ich diese Antwort gefunden habe. Wenn jemand hierher kommt und nach einer Lösung für diese Muscheln sucht, dann ist es hier:

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

Fügen Sie das Ihrem .cshrcoder .tcshrcentsprechend hinzu. (Die äußere if-Anweisung ist erforderlich, um einen Fehler bei der Remote-Anmeldung wie bei ssh zu vermeiden. Sie muss aufgrund der Variablenerweiterungsregeln in tcsh eine separate Anweisung sein.)

Wie die integrierte Bash-Unterstützung von Apple verwendet diese Lösung keine anderen externen Programme als printfauf Kosten von nur entweichenden Speicherplätzen. Wenn Sie anderen Sonderzeichen entkommen müssen, müssen Sie etwas härter arbeiten, um eine umfassendere Lösung zu finden.

rsfinn
quelle