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
tutaj:
cd $(dirname `which python`)
Edit:
Nawet łatwiej (właściwie testowany ten czas):
function cdfoo() { cd $(dirname `which [email protected]`); }
Wtedy "cdfoo python".
coś takiego powinno wystarczyć:
cd `dirname $(which python)`
Można użyć coś takiego:
cd `which <file> | xargs dirname`
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
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.
+1, Co za ulga, w świecie UNIX pozostało zdrowie psychiczne. – lhunath
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)));}
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.
Dziękuję za kod. Są znakomite! –
+1 Nie jesteśmy godni. –
Powinienem był przestać, kiedy byłem przed ... edytowany, aby usunąć fałszywą formę aliasu. –
nice ... Zrób funkcję ... + 1 – ojblass