2010-11-22 7 views
1

bashrc関数を使用してファイル宛先ディレクトリに変更するにはどうすればよいですか?

私はこの小さな関数を自分のbashrcで使って、私が使っているカスタムユーティリティのソースをすばやく見ることができます:

function wvi() 
{ 
    vi `which $1`; 
} 

たとえば、fvi mysortは私のユーティリティmysortのソースを開きます。

私がここで使うことができるもう1つのことがあります - はユーティリティがに存在するディレクトリに自動的に切り替わります。

たとえば、

~ $ which mysort 
/usr/bin/mysort 
~ $ 

次にfvi mysortcd /usr/binを実行し、次にviを使用して開きます。

どうすればこの論理を.basrhcに入れることができますか?これにはいくつかの直接的なユーティリティがありますか、あるいは最初にパスを取得して最後のノードを切り取る必要がありますか?

答えて

2
dirname `which mysort` 
+0

「cd \ dirname \」をmysort \ 'に書き込む正しい方法は何ですか?ネスティングは許可されていないと思いますか? – Lazer

+0

@Lazer cd $(dirname' \ 'which mysort \' ')解決策 – shuvalov

+3

J 'cd $(dirname $(which mysort))' –

0
wvi() { 
    local file="$(which "$1")" 
    cd $(dirname "$file") 
    vi $(basename "$file") 
    cd - # return to the previous dir 
} 

あなたは()

で、あなたの関数を定義するときに、あなたが後で整理する必要はありませんので、サブシェルで動作するようにあなたの関数を書くことができfunctionキーワードは必要ありません。

wvi() (
    file="$(which "$1")" 
    cd $(dirname "$file") 
    vi $(basename "$file") 
) 
0
cd $(dirname `which $1`) 

あなたが考慮したいかもしれませんが、ほとんどの場合で動作しますif文

if [ -h `which $1 ]; then 
    ... 

あなたがこれを実行することをお勧めします理由(テスト組み込みに-hオプションは、シンボリックリンクを探します)場合

cd $(dirname $(readlink `which $1`)) 

のようなものを囲むことにより、シンボリックリンクがあることのvimの振る舞い開いているファイルで何をするつもりかに応じて、シンボリックリンクを開くときに変更されることがあります。

1

外部のユーティリティは必要ない:

fvi() { 
    cd "${1%/*}" 
    vi "${1##*/}" 
} 
+0

'$ s'の後ろを説明できますか?これは '$ {1%/ *}であってはいけません。 $ {1 ##/* /} '? – Sorpigal

+0

@Sorpigal: '$ s'はコピー・ペースト・エラーです。 "basename"パターンに余分なスラッシュは必要ありません。 –

1

私はこの方法

wvi() {(
    p=$(which "$1") 
    cd "${p%/*}" 
    ${EDITOR:-vi} "${p##/*/}" 
)} 

の$ EDITORだけではなく、ユーザはemacsのを好むかもしれない場合にスローされたリテラルのvi(それを行うだろう - 。

+0

関数が呼び出し側シェル環境でディレクトリを変更することが想定されていない限り、ディレクトリ変更をローカルに保つために、本文をカッコで囲む必要があります。 – Gilles

+0

良い点。一定。 – Sorpigal

関連する問題