Como fazer com que o Mac Terminal restaure os diretórios de trabalho ao reiniciar


16

Eu uso o Mac Terminal com uma mão cheia de guias, cada uma atribuída a um diretório de trabalho diferente. Eu o configurei para abrir novas janelas com o mesmo diretório de trabalho. No entanto, ao sair do Terminal e reiniciá-lo, ele recria todas as guias e seus nomes, até me mostra a última saída na janela, mas permanece no diretório inicial do usuário e não restaura o diretório de trabalho mais recente de cada guia.

O que estou fazendo de errado? Isso pode ser causado por alguma configuração no ~/.bash_profile?


Eu acho que você pode encontrar o que está procurando neste tópico. apple.stackexchange.com/questions/863/...
dhempler

1
Então, eu estou errado ao supor que isso deve ser suportado imediatamente?
Oliver Drotbohm

Respostas:


15

(Para referência, estamos falando sobre o recurso Continuar do Mac OS X Lion 10.7 e posterior.)

O Terminal restaura automaticamente o diretório de trabalho se você estiver usando o shell padrão, bash. Se você estiver usando outro shell, será necessário adaptar o código /etc/bashrcpara enviar uma sequência de escape para comunicar o diretório de trabalho ao Terminal, para que ele possa restaurar o diretório posteriormente para Reiniciar. Se você estiver usando o zsh, consulte minha resposta para Reiniciar o Terminal Zsh (OS X Lion) , no qual incluo o código apropriado para o zsh.

Se você tem um costume ~/.bash_profileou ~/.bashrcpode precisar garantir que não está desfazendo o comportamento padrão, modificando /etc/bashrcas personalizações. Em particular, ele define a PROMPT_COMMANDvariável de ambiente para enviar a sequência de escape a cada prompt. Se você personalizar essa variável, precisará prefixar ou acrescentar seu código ao valor atual, por exemplo:

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

Além disso, em geral, ~/.bash_profiledeve ser executado ~/.bashrc:

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

1
Obrigado pela resposta, mas parece que não consigo fazer isso funcionar. Eu removi meu .bashrc(embora não conseguisse identificar nenhuma customização imediata do comando. Agora, faço o seguinte: 1. Abra uma nova janela do Terminal (abre no diretório pessoal do meu usuário) 2. Documentos em CD 3. Saia do Terminal 4. Abra o Terminal 5 . Janela reabre exibir a saída mudança diretório, mas ainda está localizado no diretório home do usuário.
Oliver Drotbohm

@OliverGierke Terminal cria shells de login, assim também verificar se há ~/.bash_profile, ~/.bash_logine ~/.profile.
Chris Page

Eu não tenho os dois últimos, o primeiro agora é executado ~/.bashrcconforme sua sugestão na sua resposta.
Oliver Drotbohm

2
Eu descobri isso, Chris. Meu /etc/bashrcparece ter sido ajustado por um script de instalação ou o que quer. Havia um /etc/bashrc.origque continha alguma configuração adicional (que eu assumo ser a configuração original) gist.github.com/3273170 . Re-adicionando isso às /etc/bashrccoisas feitas funcionando como esperado novamente. Muito obrigado pela ajuda e paciência!
Oliver Drotbohm

Não altero o $ PROMPT_COMMAND no meu .bashrc e só tenho o sistema padrão / etc / bashrc. Mais alguma sugestão?
Richard

3

Se você estiver usando o Bash-It, poderá ter o problema de $PROMPT_COMMANDser substituído por ele.

Como mencionado, ele é usado pelo OS X para restaurar o cwd em novas guias. Bash deve anexar valores, não substituí-los.

Mas uma solução alternativa por enquanto seria adicionar a seguinte linha ao seu ~/.bash_profile

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

Para obter mais informações, consulte o rastreador de problemas para atualizações: https://github.com/revans/bash-it/issues/240

E a referência da Apple para ele https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man1/sh.1.html


1

Eu escrevi uma postagem no blog sobre como fazer isso para o csh / tcsh antes de descobrir esta resposta; se alguém vier aqui procurando uma solução para essas conchas, aqui está:

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

Adicione isso ao seu .cshrcou .tcshrcconforme apropriado. (A instrução if externa é necessária para evitar um erro ao efetuar logon remotamente, como no ssh. Ela deve ser uma instrução separada devido às regras de expansão variável no tcsh.)

Como o suporte básico da Apple, esta solução não usa programas externos além printfdo custo de apenas espaços vazios. Se você precisar escapar de outros caracteres especiais, precisará trabalhar um pouco mais para encontrar uma solução mais abrangente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.