Ausgabe des Befehls, der für die Eingabe in CD verwendet wird

7

Ich möchte die Ausgabe eines which-Befehls und eine CD in das übergeordnete Verzeichnis übernehmen. Angenommen, ich habe Folgendes:

which someprogram

Mit Ausgabe:

/home/me/somedirectory/someprogram

Und ich möchte in das Verzeichnis cd, in dem ein Programm lebt:

cd /home/me/somedirectory

Ich möchte dies in einer Zeile erreichen. Was ist der eleganteste, kniffligste und kurzeste Weg, dies zu tun?

Naja eigentlich
quelle

Antworten:

13

Verwendung dirname:

cd "`dirname $(which program)`"
Kevin
quelle
8
+1 aber $()anstelle von Backticks verwenden:cd $(dirname $(which program))
Glenn Jackman
1
@glennjackman Es funktioniert gut mit einem Paar Backticks (wie in der Antwort gezeigt, oder umgekehrt mit dem $ () außen und den Backticks innen). Es würde einfach nicht mit einem inneren Paar von Backticks funktionieren, die in einem separaten äußeren Paar von Backticks verschachtelt sind.
Eliah Kagan
3
@EliahKagan Ich denke, @ glennjackman meinte nicht, dass Backticks nicht funktionieren, sondern dass sie $()aufgrund der vielen Vorteile von $()Backticks schrittweise zugunsten von Backticks auslaufen sollten.
jw013
5

In Bash empfehle ich type -püber which. whichist ein externer Befehl und manchmal schwierig . Sie können verwenden sed, um alles nach dem Finale zu entfernen /, oder das Spezialdienstprogramm verwenden dirname.

cd "$(dirname -- "$(type -p program)")"
cd "$(type -p program | sed 's:[^/]*$::')"

Wenn Sie in der Befehlszeile wissen, dass das Verzeichnis keine Sonderzeichen (Leerzeichen oder \[?*) enthält, können Sie die Anführungszeichen weglassen. Sie können auch Backquotes anstelle eines der Backquotes verwenden $(…)(das Verschachteln von Backquotes ist schwierig, hier nicht wert).

cd `dirname $(type -p program)`
cd $(dirname `type -p program`)
cd `type -p program | sed 's:[^/]*$::'`

In zsh gibt es eine kompaktere Syntax.

cd ${$(whence -p program):h}
cd ${$(echo =program):h}
cd ${${_+=program}:h}

(Ja, das letzte ist kryptisch. Es verwendet die ${VAR+TEXT}Syntax für die _Variable, wobei der Wert =programdem entspricht $(whence -p program).)

Gilles 'SO - hör auf böse zu sein'
quelle