web-dev-qa-db-fra.com

Restaurer la fonctionnalité 'cd ..' après avoir suivi un lien symbolique

Si je crée un lien symbolique dans le terminal avec une commande comme

ln -s /path/to/some/directory symbolicLink

puis suivez le lien avec

cd symbolicLink

le terminal semble penser que le cwd est ~/symbolicLink/ même s'il montre réellement ~/path/to/some/directory/ (en supposant que le lien a été établi dans ~, bien sûr). Cela signifie que si je tape ensuite cd .., je suis ramené à ~, car le terminal "pense" qu'il s'agit du parent du cwd.

Que devrais-je changer pour que cd .. m'emmène plutôt à ~/path/to/some/, c'est-à-dire le réel parent de ~/path/to/some/directory/?

13
Val

Voir https://stackoverflow.com/questions/10456784/behavior-of-cd-bash-on-symbolic-links .

Vous pouvez utiliser 'cd -P' pour accéder au "vrai" répertoire parent. Voir le premier commentaire sur la première réponse sur la façon de définir ce comportement par défaut.

15
Alexander

Il y a une mise en garde subtile dans le comportement cd -P (posté comme réponse en raison de la longueur):

$ dir1=$(mktemp --directory)
$ dir2=$(mktemp --directory)
$ ln -s -- "$dir1" /tmp/start
$ ln -s -- "$dir2" "$dir1"
$ cd "/tmp/start/"*
$ cd -P ..

Qu'est-ce que pwd devrait imprimer maintenant? Logiquement, cela pourrait être soit

  1. $dir1, si cd -P .. fait cd .. en premier et cd -- "$(readlink -f)" par la suite, ou
  2. /tmp, si cd -P .. exécute cd -- "$(readlink -f)" en premier et cd .. par la suite.

En fait, il s’agit de la dernière solution, ce qui signifie que pwd est intuitivement deux plus élevé que le répertoire "parent".

5
l0b0

Une autre façon consiste à exécuter:

cd $(/bin/pwd)/..
2
jlliagre

Je ressens votre douleur — je considère que bash est fondamentalement cassé pour une utilisation interactive à cause de ce comportement.

tcsh est un shell beaucoup plus convivial pour une utilisation interactive. Laissez bash pour la programmation (si vous insistez pour écrire des scripts Shell alors qu'il existe de bien meilleures alternatives parmi les nombreux langages de script).

Pour changer de shell pour tout utilisateur, tapez chsh sur la ligne de commande et suivez les instructions (encore une fois, je recommande /bin/tcsh et l'excellent livre O'Reilly Utilisation de csh et tcsh , disponible pour presque rien utilisé).

2
dodgethesteamroller