web-dev-qa-db-ja.com

cdへの入力に使用されたコマンドの出力

Whichコマンドの出力を取得し、親ディレクトリにcdします。たとえば、次のようなものがあるとします。

which someprogram

出力あり:

/home/me/somedirectory/someprogram

そして、私はいくつかのプログラムが住んでいるディレクトリにcdしたいと思います:

cd /home/me/somedirectory

これを一行で達成したいと思います。これを行うための最もエレガントでトリッキーな短い方法は何ですか?

7
well actually

dirnameを使用します:

cd "`dirname $(which program)`"
13
Kevin

Bashでは、whichよりも_type -p_をお勧めします。 whichは外部コマンドであり、時々注意が必要ですsedを使用して、最後の_/_の後のすべてを削除するか、特別な目的のdirnameユーティリティを使用できます。

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

コマンドラインで、ディレクトリに特殊文字(空白または_\[?*_)が含まれていないことがわかっている場合は、引用符を省略できます。 $(…)の代わりにバッククォートを使用することもできます(バッククォートのネストは難しく、ここでは価値がありません)。

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

Zshには、よりコンパクトな構文があります。

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

(はい、最後のものは不可解です。_${VAR+TEXT}_変数で___構文を使用し、値は_=program_であり、これは$(whence -p program)と同等です。)