Come fare in modo che Mac Terminal ripristini le directory di lavoro al riavvio


16

Uso il terminale Mac con una mano piena di schede assegnate a ciascuna directory di lavoro diversa. L'ho configurato per aprire nuove finestre con la stessa directory di lavoro. Tuttavia, quando esco da Terminal e lo riavvio ricostruisce tutte le schede, i loro nomi, mi mostra persino l'ultimo output nella finestra ma rimane nella home directory dell'utente e non ripristina l'ultima directory di lavoro di ciascuna scheda.

Che cosa sto facendo di sbagliato? Questo può essere causato da alcune impostazioni in ~/.bash_profile?


Penso che tu possa trovare quello che stai cercando in questo thread. apple.stackexchange.com/questions/863/…
dhempler

1
Quindi ho torto nel ritenere che questo dovrebbe essere supportato immediatamente?
Oliver Drotbohm,

Risposte:


15

(Per riferimento, stiamo parlando della funzionalità Riprendi di Mac OS X Lion 10.7 e versioni successive.)

Il terminale ripristina automaticamente la directory di lavoro se si utilizza la shell predefinita, bash. Se stai usando qualche altra shell, dovrai adattare il codice /etc/bashrcper inviare una sequenza di escape per comunicare la directory di lavoro al Terminale in modo che possa ripristinare la directory in seguito per Riprendi. Se stai usando zsh, vedi la mia risposta a Riprendi Zsh-Terminal (OS X Lion) , in cui includo il codice appropriato per zsh.

Se hai una personalizzazione ~/.bash_profileo ~/.bashrcpotresti aver bisogno di assicurarti di non annullare il comportamento predefinito modificando /etc/bashrcle personalizzazioni. In particolare, imposta la PROMPT_COMMANDvariabile d'ambiente per inviare la sequenza di escape ad ogni prompt. Se personalizzi quella variabile, dovrai aggiungere il prefisso o aggiungere il codice al valore corrente, ad esempio:

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

Inoltre, in generale, ~/.bash_profiledovrebbe eseguire ~/.bashrc:

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

1
Grazie per la risposta, ma non riesco a farlo funzionare. Ho rimosso il mio .bashrc(sebbene non sia stato possibile individuare alcuna personalizzazione del comando rapido. Ora eseguo le seguenti operazioni: 1. Apri una nuova finestra Terminale (si apre nella home directory del mio utente) 2. Documenti cd 3. Esci dal Terminale 4. Apri Terminale 5 La finestra si riapre mostrando l'output del cambio di directory ma si trova ancora nella home directory dell'utente
Oliver Drotbohm

@OliverGierke Terminal crea shell di login, in modo da controllare anche per ~/.bash_profile, ~/.bash_logine ~/.profile.
Chris Pagina

Non ho le ultime due, la prima ora viene eseguita ~/.bashrcsecondo il tuo suggerimento nella tua risposta.
Oliver Drotbohm,

2
L'ho capito, Chris. Il mio /etc/bashrcsembra essere stato ottimizzato da uno script di installazione o altro. C'è stato un file /etc/bashrc.origcontenente alcune configurazioni aggiuntive (che presumo siano le impostazioni originali) gist.github.com/3273170 . Ri-aggiungendo che le /etc/bashrccose fatte funzionano di nuovo come previsto. Grazie mille per l'aiuto e la pazienza!
Oliver Drotbohm,

Non cambio $ PROMPT_COMMAND nel mio .bashrc e ho solo il sistema predefinito / etc / bashrc. Ulteriori suggerimenti?
Richard,

3

Se stai usando Bash-It, potresti avere il problema di $PROMPT_COMMANDessere sovrascritto da esso.

Come accennato, viene utilizzato da OS X per ripristinare CWD in nuove schede. Bash dovrebbe aggiungere valori, non sovrascriverli.

Ma una soluzione alternativa per ora sarebbe aggiungere la seguente riga alla tua ~/.bash_profile

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

Per maggiori informazioni, controlla il tracker dei problemi per gli aggiornamenti: https://github.com/revans/bash-it/issues/240

E il riferimento Apple per questo https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man1/sh.1.html


1

Ho scritto un post sul blog su come farlo per csh / tcsh prima di scoprire questa risposta; se qualcun altro viene qui alla ricerca di una soluzione per quelle conchiglie, eccolo qui:

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

Aggiungilo al tuo .cshrco .tcshrccome appropriato. (L'istruzione if esterna è necessaria per evitare un errore durante l'accesso remoto, come con ssh. Deve essere un'istruzione separata a causa delle regole di espansione variabili in tcsh.)

Come il supporto integrato di Bash di Apple, questa soluzione non utilizza altri programmi esterni se non printfa scapito di spazi di fuga. Se devi fuggire da altri personaggi speciali, dovrai lavorare un po 'di più per trovare una soluzione più completa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.