Un bash one-liner per cambiare la directory in cui alcuni file si trova
Domanda
Mi capita spesso di voler cambiare la directory in cui un determinato eseguibile si trova.Quindi vorrei qualcosa di simile
cd `which python`
per passare alla directory in cui il comando python è installato.Tuttavia, questo non è ovviamente illegale, dal momento che il cd prende una directory, non un file.C'è, ovviamente, alcune regexp-pippo ho potuto fare a togliere il nome del file, ma che avrebbe sconfitto il punto di essere un semplice one-liner.
Soluzione
Qui:
cd $(dirname `which python`)
Modifica:
Ancora più facile (in realtà testato questa volta):
function cdfoo() { cd $(dirname `which $@`); }
Poi "cdfoo python".
Altri suggerimenti
Per evitare tutti quei programmi esterni ( 'dirname' e di gran lunga peggiore, l'inutile ma popolare 'che') forse un po 'riscritto:
cdfoo() {
tgtbin=$(type -P "$1")
[[ $? != 0 ]] && {
echo "Error: '$1' not found in PATH" >&2
return 1
}
cd "${tgtbin%/*}"
}
Questo risolve anche la parola 'funzione' raro dall'alto e aggiunge (molto semplice) la gestione degli errori.
Può essere un inizio per una soluzione più sphisticated.
Per il confronto:
zsh:~% cd =vi(:h) zsh:/usr/bin%
=cmd restituisce il percorso e cmd (h) è un glob modificatore a prendere la testa
zsh è di sola scrittura, ma potente.
una cosa del genere dovrebbe fare il trucco:
cd `dirname $(which python)`
Una caratteristica che ho usato è assegnare pushd / popd. Questi mantenere uno stack di directory in modo che non c'è bisogno di cercare di mantenere la storia di dove eravate, se si desidera tornare alla directory di lavoro corrente prima di modificare le directory.
Ad esempio:
pushd $(dirname `which $@`)
...
popd
Si potrebbe usare qualcosa di simile a questo:
cd `which <file> | xargs dirname`
Ho aggiunto un po 'di semplice gestione degli errori che rende il comportamento di cdfoo () segue quella di nomedir per gli argomenti inesistente / nonpath
function cdfoo() { cd $(dirname $(which $1 || ( echo . && echo "Error: '$1' not found" >&2 ) ));}