Ein heftiger Schlag Einzeiler in das Verzeichnis zu ändern, in dem einige Datei befindet

StackOverflow https://stackoverflow.com/questions/855616

  •  21-08-2019
  •  | 
  •  

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.

War es hilfreich?

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

macht
function cdfoo() { cd $(dirname $(which $1 || ( echo . && echo "Error: '$1' not found" >&2 ) ));}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top