GNU/Linux >> Tutoriels Linux >  >> Linux

Zsh/bash :développer les chemins relatifs dans les arguments de commande à l'aide des règles de structure de répertoire logique avant l'exécution ?

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


Linux
  1. Passer les arguments de la ligne de commande au script Bash ?

  2. Pourquoi définir une variable avant une commande est-il légal dans Bash ?

  3. Utilisation de la commande Linux Basename dans les scripts Bash

  4. Diviser la sortie de la commande par colonnes à l'aide de Bash ?

  5. Définir l'heure relative à l'aide de la ligne de commande

Comment afficher l'arborescence des répertoires sous Linux

Comment basculer automatiquement vers un répertoire sans utiliser la commande cd sous Linux

Différentes façons de répertorier le contenu du répertoire sans utiliser la commande ls

Bash Scripting - Analyser les arguments dans les scripts Bash à l'aide de getopts

Comment imprimer le répertoire de travail à l'aide de la commande Linux pwd ?

Utilisation de la commande Linux Dirname dans les scripts Bash