Comment faire Mac Terminal restaurer les répertoires de travail lors du redémarrage

16

J'utilise le terminal Mac avec une main pleine d'onglets affectés chacun à un répertoire de travail différent. Je l'ai configuré pour ouvrir de nouvelles fenêtres avec le même répertoire de travail. Néanmoins, lorsque je quitte le terminal et le redémarre, il reconstruit tous les onglets, leurs noms, me montre même la dernière sortie dans la fenêtre mais reste dans le répertoire de base de l'utilisateur et ne restaure pas le dernier répertoire de travail de chaque onglet.

Qu'est-ce que je fais mal? Cela peut-il être causé par un paramètre dans le ~/.bash_profile?

Oliver Drotbohm
la source
Je pense que vous pouvez trouver ce que vous cherchez dans ce fil. apple.stackexchange.com/questions/863/…
dhempler
1
Alors ai-je tort de supposer que cela devrait être pris en charge dès le départ?
Oliver Drotbohm

Réponses:

15

(Pour référence, nous parlons de la fonction de reprise de Mac OS X Lion 10.7 et versions ultérieures.)

Terminal restaure automatiquement le répertoire de travail si vous utilisez le shell par défaut, bash. Si vous utilisez un autre shell, vous devrez adapter le code /etc/bashrcpour envoyer une séquence d'échappement pour communiquer le répertoire de travail à Terminal afin qu'il puisse restaurer le répertoire plus tard pour reprendre. Si vous utilisez zsh, consultez ma réponse à Resume Zsh-Terminal (OS X Lion) , dans laquelle j'inclus le code approprié pour zsh.

Si vous avez une personnalisation ~/.bash_profileou ~/.bashrcvous devrez peut-être vous assurer que vous n'annulez pas le comportement par défaut en modifiant /etc/bashrcles personnalisations de. En particulier, il définit la PROMPT_COMMANDvariable d'environnement pour envoyer la séquence d'échappement à chaque invite. Si vous personnalisez cette variable, vous devrez préfixer ou ajouter votre code à la valeur actuelle, par exemple:

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

De plus, ~/.bash_profiledevrait généralement exécuter ~/.bashrc:

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
Chris Page
la source
1
Merci pour la réponse, mais je ne semble pas être en mesure de le faire fonctionner. J'ai supprimé mon .bashrc(bien que je n'aie pas repéré de personnalisation de commande d'invite. Maintenant, je fais ce qui suit: 1. Ouvrez une nouvelle fenêtre de terminal (s'ouvre dans le répertoire personnel de mon utilisateur) 2. Documents cd 3. Quittez le terminal 4. Ouvrez le terminal 5 Une fenêtre rouvre affichant la sortie du changement de répertoire mais toujours située dans le répertoire personnel de l'utilisateur
Oliver Drotbohm
@OliverGierke Terminal crée des coquilles connexion, afin de vérifier aussi ~/.bash_profile, ~/.bash_loginet ~/.profile.
Chris Page
Je n'ai pas les deux derniers, l'ancien exécute maintenant ~/.bashrcselon votre suggestion dans votre réponse.
Oliver Drotbohm
2
J'ai compris, Chris. Mon /etc/bashrcsemble avoir été modifié par un script d'installation ou autre. Il y en avait un /etc/bashrc.origqui contenait une configuration supplémentaire (que je suppose être la configuration d'origine) gist.github.com/3273170 . Réajouter cela aux /etc/bashrcchoses qui fonctionnaient comme prévu à nouveau. Merci beaucoup pour votre aide et votre patience!
Oliver Drotbohm
Je ne change pas $ PROMPT_COMMAND dans mon .bashrc et je n'ai que le système par défaut / etc / bashrc. Avez-vous d'autres suggestions?
Richard
3

Si vous utilisez Bash-It, vous pouvez rencontrer le problème d' $PROMPT_COMMANDêtre écrasé par celui-ci.

Comme mentionné, il est utilisé par OS X pour restaurer cwd dans de nouveaux onglets. Bash it devrait ajouter des valeurs, pas les remplacer.

Mais une solution de contournement pour l'instant serait d'ajouter la ligne suivante à votre ~/.bash_profile

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

Pour plus d' informations Commander le tracker d'émission pour les mises à jour: https://github.com/revans/bash-it/issues/240

Et la référence Apple pour cela https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man1/sh.1.html

Michael Yagudaev
la source
1

J'ai rédigé un article de blog sur la façon de procéder pour csh / tcsh avant de découvrir cette réponse; si quelqu'un d'autre vient ici à la recherche d'une solution pour ces obus, le voici:

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

Ajoutez cela à votre .cshrcou .tcshrcselon le cas. (L'instruction if externe est nécessaire pour éviter une erreur lors de la connexion à distance, comme avec ssh. Elle doit être une instruction distincte en raison des règles d'expansion des variables dans tcsh.)

Comme le support bash intégré d'Apple, cette solution n'utilise aucun programme externe autre que printf, au prix de seulement des espaces qui s'échappent. Si vous devez échapper à d'autres caractères spéciaux, vous devrez travailler un peu plus pour trouver une solution plus complète.

rsfinn
la source