2009-05-13 17 views
8

Spesso desidero passare alla directory in cui si trova un determinato eseguibile. Quindi mi piacerebbe qualcosa comeUn one-liner bash da modificare nella directory in cui si trova un file

cd `which python` 

per cambiare nella directory in cui è installato il comando python. Tuttavia, questo è ovviamente illegale, dal momento che cd prende una directory, non un file. Esiste ovviamente qualche regexp-foo che potrei fare per rimuovere il nome del file, ma ciò annullerebbe il fatto che si tratta di una semplice copertina.

risposta

16

Qui:

cd $(dirname `which python`) 

Edit:

Ancora più facile (in realtà testato questa volta):

function cdfoo() { cd $(dirname `which [email protected]`); } 

Poi "cdfoo pitone".

+0

+1 Non siamo degni. –

+0

Avrei dovuto fermarmi quando ero in anticipo ... modificato per eliminare il modulo alias fasullo. –

+0

nice ... make a function ... + 1 – ojblass

2

una cosa del genere dovrebbe fare il trucco:

cd `dirname $(which python)` 
1

si potrebbe usare qualcosa di simile: assegnare

cd `which <file> | xargs dirname` 
2

Una caratteristica che ho usato è pushd/popd. Mantengono uno stack di directory in modo da non dover cercare di conservare la cronologia di dove si trovava se si desidera tornare alla directory di lavoro corrente prima di cambiare directory.

Ad esempio:

pushd $(dirname `which [email protected]`) 
... 
popd 
8

di 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 anche corregge la parola chiave "funzione" non comune dall'alto e aggiunge (molto semplice) la gestione degli errori.

Può essere un inizio per una soluzione più sphisticata.

+0

+1, che sollievo, c'è ancora sanità mentale nel mondo UNIX. – lhunath

0

ho aggiunto un po 'di semplice gestione degli errori che rende il comportamento di cdfoo() segue quella della nomedir per/argomenti nonpath inesistenti

function cdfoo() { cd $(dirname $(which $1 || (echo . && echo "Error: '$1' not found" >&2)));} 
3

Per confronto:

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

= cmd espande il percorso per cmd e (: h) è un modificatore globale per prendere la testa

zsh è di sola scrittura ma potente.

+0

Grazie per il codice. Sono eccezionali! –

Problemi correlati