2009-05-13 10 views
8

Ich möchte oft in das Verzeichnis wechseln, in dem sich eine bestimmte ausführbare Datei befindet. Also möchte ich etwas wieEin Bash-One-Liner zum Wechseln in das Verzeichnis, in dem sich eine Datei befindet

cd `which python` 

in das Verzeichnis ändern, in dem der Python-Befehl installiert ist. Dies ist jedoch offensichtlich illegal, da cd ein Verzeichnis und keine Datei verwendet. Es gibt offensichtlich einige regexp-foo, die ich tun könnte, um den Dateinamen zu streichen, aber das würde den Punkt davon überwinden, ein einfacher Einliner zu sein.

Antwort

16

hier:

cd $(dirname `which python`) 

Edit:

Noch einfacher (eigentlich dieses Mal getestet):

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

Then "cdfoo Python".

+0

+1 Wir sind nicht würdig. –

+0

Ich hätte aufhören sollen, als ich voraus war ... bearbeitet, um gefälschte Alias-Form zu löschen. –

+0

nice ... machen Sie eine Funktion ... + 1 – ojblass

2

so etwas sollte es tun:

cd `dirname $(which python)` 
1

Sie so etwas wie dies nutzen könnten:

cd `which <file> | xargs dirname` 
2

Eine Funktion, die ich verwendet habe, zuzuteilen pushd/popd ist. Diese verwalten einen Verzeichnisstapel, so dass Sie nicht versuchen müssen, den Verlauf Ihrer Position zu behalten, wenn Sie vor dem Wechseln der Verzeichnisse zum aktuellen Arbeitsverzeichnis zurückkehren möchten.

Zum Beispiel:

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

Um all diese externen Programme zu vermeiden ('dirname' und viel schlimmer, die nutzlos, aber beliebtes 'die') vielleicht ein bisschen neu geschrieben:

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

Dies auch behebt das unübliche Schlüsselwort 'function' von oben und fügt (sehr einfache) Fehlerbehandlung hinzu.

Kann ein Anfang für eine sphistizierte Lösung sein.

+0

+1, Was für eine Erleichterung, es gibt in der UNIX-Welt noch Vernunft. – lhunath

0

Ich habe ein bisschen einfache Fehlerbehandlung, die das Verhalten von cdfoo() folgt, dass der dirname macht für nicht existierende/nonpath Argumente

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

Zum Vergleich:

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

= cmd erweitert zu Der Pfad zu cmd und (: h) ist ein glob Modifizierer, um den Kopf zu nehmen

zsh ist schreibgeschützt aber leistungsstark.

+0

Vielen Dank für den Code. Sie sind hervorragend! –