Un coup d'une doublure pour changer dans le répertoire où se trouve un certain fichier
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.
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 ) ));}