2009-05-13 11 views
8

Często chcę przejść do katalogu, w którym znajduje się konkretny plik wykonywalny. Tak więc chciałbym, aby coś takiego jak zmienianie w katalogu, w którym zainstalowano polecenie Pythona, zmieniło się w coś podobnego do tego, co na przykład: 0123. Jest to oczywiście nielegalne, ponieważ cd pobiera katalog, a nie plik. Jest oczywiście kilka regexp-foo, które mogłem zrobić, aby usunąć nazwę pliku, ale to by złamało sens tego, że jest to prosta jedna linijka.Bash-one-liner, aby przejść do katalogu, w którym znajduje się jakiś plik

Odpowiedz

16

tutaj:

cd $(dirname `which python`) 

Edit:

Nawet łatwiej (właściwie testowany ten czas):

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

Wtedy "cdfoo python".

+0

+1 Nie jesteśmy godni. –

+0

Powinienem był przestać, kiedy byłem przed ... edytowany, aby usunąć fałszywą formę aliasu. –

+0

nice ... Zrób funkcję ... + 1 – ojblass

2

coś takiego powinno wystarczyć:

cd `dirname $(which python)` 
1

Można użyć coś takiego:

cd `which <file> | xargs dirname` 
2

Jedną z cech Użyłem przydzieleniu jest pushd/popd. Utrzymują one stos katalogów, dzięki czemu nie musisz zapisywać historii w miejscu, w którym byłeś, jeśli chcesz wrócić do bieżącego katalogu roboczego przed zmianą katalogów.

Na przykład:

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

Aby uniknąć tych wszystkich zewnętrznych programów ('DIRNAME' i znacznie gorsze, bezużyteczny, ale popularny 'który') może trochę skrótu:

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

to również naprawia nietypowe słowo kluczowe "funkcja" z góry i dodaje (bardzo proste) obsługę błędów.

Może być początkiem bardziej sphisticated rozwiązanie.

+0

+1, Co za ulga, w świecie UNIX pozostało zdrowie psychiczne. – lhunath

0

dodałam trochę prostą obsługę błędów sprawia, że ​​zachowanie cdfoo() wynika, że ​​z dirname dla nieistniejących argumentów/nonpath

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

Dla porównania:

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

= cmd rozszerza się ścieżka do cmd i (: h) jest modyfikatorem globu, który przyjmuje nagłówek zsh tylko w trybie write, ale jest potężny.

+0

Dziękuję za kod. Są znakomite! –

Powiązane problemy