Whichコマンドの出力を取得し、親ディレクトリにcdします。たとえば、次のようなものがあるとします。
which someprogram
出力あり:
/home/me/somedirectory/someprogram
そして、私はいくつかのプログラムが住んでいるディレクトリにcdしたいと思います:
cd /home/me/somedirectory
これを一行で達成したいと思います。これを行うための最もエレガントでトリッキーな短い方法は何ですか?
dirname
を使用します:
cd "`dirname $(which program)`"
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)
と同等です。)