Donc je sais que pwd
et cd
dans le shell ont un mode "logique" et "physique" (voir cette question SO et les questions liées à partir de là).
Maintenant, supposons que j'ai ce lien symbolique :
/home/<username>/foo -> /tmp/bar
Pour suivre localement, procédez comme suit :
mkdir /tmp/bar
ln -s /tmp/bar ~/foo
Maintenant, quand je démarre dans mon $HOME
et cd
dans foo
, j'obtiens le chemin "logique" (avec les paramètres par défaut) avec pwd
, et peut obtenir le chemin "physique" avec -P
:
$ cd ~/foo
$ pwd
/home/<username>/foo
$ pwd -P
/tmp/bar
Bien sûr, "..
" fait toujours référence au parent du chemin "physique" (ma compréhension est qu'il n'est même pas interprété par le shell, juste passé à la commande telle quelle, et certaines commandes intégrées spéciales comme cd
interprétez-le spécialement pour obtenir le comportement "logique") :
$ pwd
/home/<username>/foo
$ realpath ..
/tmp
Ce que je veux, c'est quand je suis dans $HOME/foo
(ou l'un de ses sous-répertoires) que tous les chemins relatifs que j'utilise (par exemple, ls -l ../..
) à interpréter/étendre par rapport au chemin "logique" (c'est bien si je dois préfixer ma commande avec quelque chose).
Par exemple :
$ pwd
/home/<username>/foo
$ vi ../something.txt
Je veux que cela se résolve en vi /home/<username>/something.txt
.
Y a-t-il quelque chose de plus simple/plus court que de faire ce qui suit (ou d'écrire une fonction shell avec laquelle je peux préfixer ma commande qui passe par-dessus tous les arguments et - s'ils font référence à des chemins - les développe avant de les passer à la commande) ?
$ pwd
/home/<username>/foo
$ realpath -L $PWD/../something.txt
/home/<username>/something.txt
$ vi $(realpath -L $PWD/../something.txt)
Existe-t-il quelque chose comme une "extension de chemin logique pour les paramètres de ligne de commande qui sont des chemins de fichier relatifs en cours avant que le shell n'exécute la commande" ? J'utilise zsh
, mais toutes les solutions pour bash
ou zsh
serait bien.
Réponse acceptée :
Je vais répondre à cela pour Zsh, puisque c'est ce que j'utilise.
Pour obtenir l'effet souhaité avec ..
lors de l'utilisation de cd
, ajoutez simplement ce qui suit à votre ~/.zshrc
fichier :
setopt NO_chase_dots NO_chase_links
Documentation ici :http://zsh.sourceforge.net/Doc/Release/Options.html#index-CHASEDOTS
Pour tous les autres cas, au lieu de ..
, vous devrez utiliser le :h
("tête") modificateur d'expansion :
$ pwd
/home/<username>/foo
$ vi $PWD:h/something.txt
Si vous avez besoin d'atteindre plus d'un niveau, vous pouvez y ajouter un nombre (à condition d'entourer l'expression d'accolades) ou simplement répéter le :h
:
# These two are equivalent:
$ vi ${PWD:h2}/foo
$ vi $PWD:h:h/foo
Documentation ici :http://zsh.sourceforge.net/Doc/Release/Expansion.html#Modifiers