特定の実行可能ファイルがあるディレクトリに移動したいことがよくあります。だから私は何かが欲しい
cd `which python`
python コマンドがインストールされているディレクトリに移動します。ただし、cd はファイルではなくディレクトリを使用するため、これは明らかに違法です。ファイル名を削除するために実行できる regexp-foo が明らかにありますが、それは簡単なワンライナーであるという点を無効にします。
ここ:
cd $(dirname `which python`)
編集:
さらに簡単(今回は実際にテスト済み):
function cdfoo() { cd $(dirname `which $@`); }
次に「cdfoo python」。
これらすべての外部プログラム (「dirname」と、さらに悪いことに、役に立たないが人気のある「which」) をすべて回避するために、少し書き直した可能性があります。
cdfoo() {
tgtbin=$(type -P "$1")
[[ $? != 0 ]] && {
echo "Error: '$1' not found in PATH" >&2
return 1
}
cd "${tgtbin%/*}"
}
これにより、上記の珍しいキーワード 'function' も修正され、(非常に単純な) エラー処理が追加されます。
より洗練されたソリューションの出発点になる可能性があります。
比較のために:
zsh:~% cd =vi(:h) zsh:/usr/bin%
=cmd は cmd へのパスに展開され、(:h) はヘッドを取るグロブ修飾子です。
zsh は書き込み専用ですが強力です。
そのような何かがうまくいくはずです:
cd `dirname $(which python)`
私が使用した機能の 1 つは、pushd / popd です。これらはディレクトリ スタックを維持するため、ディレクトリを変更する前に現在の作業ディレクトリに戻りたい場合に、現在の場所の履歴を保持しようとする必要はありません。
例えば:
pushd $(dirname `which $@`)
...
popd
次のようなものを使用できます。
cd `which <file> | xargs dirname`
cdfoo() の動作が、存在しない/非パス引数の dirname の動作に従うようにする、簡単なエラー処理を少し追加しました。
function cdfoo() { cd $(dirname $(which $1 || ( echo . && echo "Error: '$1' not found" >&2 ) ));}