Ein heftiger Schlag Einzeiler in das Verzeichnis zu ändern, in dem einige Datei befindet
Frage
Ich möchte oft in das Verzeichnis ändern, in dem eine bestimmte ausführbare Datei befindet. So würde Ich mag so etwas wie
cd `which python`
, um in das Verzeichnis zu wechseln, in dem der Python-Befehl installiert ist. Dies ist jedoch offensichtlich illegal, da cd ein Verzeichnis nimmt, keine Datei. Es gibt offensichtlich einige regexp-foo ich die Dateinamen abzuzustreifen tun könnte, aber das würde den Punkt davon besiegen ein einfacher Einzeiler zu sein.
Lösung
Hier:
cd $(dirname `which python`)
Edit:
Noch einfacher (eigentlich dieses Mal getestet):
function cdfoo() { cd $(dirname `which $@`); }
Dann "cdfoo python".
Andere Tipps
Um alle diese externen Programme zu vermeiden ( ‚dirname‘ und viel schlimmer, die nutzlos, aber beliebte ‚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 behebt auch die ungewöhnliche Stichwort ‚Funktion‘ von oben und fügt (sehr einfach) Fehlerbehandlung.
Auch ein Start für eine sphisticated Lösung sein.
Zum Vergleich:
zsh:~% cd =vi(:h) zsh:/usr/bin%
= cmd erweitert, um den Pfad zu cmd und (: h) ist ein glob Modifikator, den Kopf zu nehmen
zsh ist schreibgeschützt, aber mächtig.
so etwas sollte es tun:
cd `dirname $(which python)`
Eine Funktion, die ich verwendet habe zuzuteilen ist pushd / popd. Diese halten ein Verzeichnis-Stack, so dass Sie nicht versuchen müssen, halten Geschichte, wo Sie waren, wenn Sie das aktuelle Arbeitsverzeichnis zurückkehren möchten, bevor Verzeichnisse zu ändern.
Zum Beispiel:
pushd $(dirname `which $@`)
...
popd
Sie so etwas wie diese verwenden:
cd `which <file> | xargs dirname`
Ich habe ein bisschen einfache Fehlerbehandlung, die das Verhalten von cdfoo () folgt, dass der dirname für nicht existierende / nonpath Argumente
machtfunction cdfoo() { cd $(dirname $(which $1 || ( echo . && echo "Error: '$1' not found" >&2 ) ));}