Un coup d'une doublure pour changer dans le répertoire où se trouve un certain fichier

StackOverflow https://stackoverflow.com/questions/855616

  •  21-08-2019
  •  | 
  •  

Question

Je veux changer souvent dans le répertoire où se trouve un fichier exécutable particulier. Je voudrais donc quelque chose comme

cd `which python` 

pour changer dans le répertoire où la commande python est installé. Cependant, ce qui est évidemment illégal, puisque cd prend un répertoire, pas un fichier. Il y a évidemment une regexp-foo je pouvais faire pour dépouiller le nom du fichier, mais cela irait à l'encontre du point de celui-ci étant un one-liner facile.

Était-ce utile?

La solution

Ici:

cd $(dirname `which python`)

Edit:

Encore plus facile (en fait testé cette fois):

function cdfoo() { cd $(dirname `which $@`); }

Ensuite, "python cdfoo".

Autres conseils

Pour éviter tous ces programmes externes ( « dirname » et bien pire, l'inutile mais populaire « qui ») peut-être un réécrite bits:

cdfoo() {
  tgtbin=$(type -P "$1")
  [[ $? != 0 ]] && {
    echo "Error: '$1' not found in PATH" >&2
    return 1
  }
  cd "${tgtbin%/*}"
}

Cette version corrige également le mot-clé hors du commun « fonction » d'en haut et ajoute (très simple) la gestion des erreurs.

Peut-être un départ pour une solution plus sphisticated.

A titre de comparaison:

zsh:~% cd =vi(:h)
zsh:/usr/bin%

= cmd se développe pour le chemin d'accès cmd et (H) est un modificateur de glob pour prendre la tête

zsh est en écriture seule mais puissant.

quelque chose comme ça devrait faire l'affaire:

cd `dirname $(which python)`

Une caractéristique que je l'ai utilisé est allot pushd / popd. Ces maintenir une pile d'annuaire afin que vous ne devez pas essayer de garder l'histoire de l'endroit où vous étiez si vous souhaitez revenir au répertoire de travail courant avant de changer les répertoires.

Par exemple:

pushd $(dirname `which $@`)
...
popd

Vous pouvez utiliser quelque chose comme ceci:

cd `which <file> | xargs dirname`

J'ai ajouté un peu de manipulation d'erreur simple qui rend le comportement des cdfoo () suivre celle de dirname pour les arguments inexistants / nonpath

function cdfoo() { cd $(dirname $(which $1 || ( echo . && echo "Error: '$1' not found" >&2 ) ));}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top