2012-01-19 29 views
9

でネストされたバッククォート私は指定されたファイル(または、そのようなファイル名の最初のfindたの発生)が含まれていCWDの子孫ディレクトリにジャンプしますエイリアスを作成しようとしています:バッシュ:エイリアス問題を引き起こす

alias jump="cd \`dirname \\\`find -name '$1' | sed -n 1p\\\`\`" 
:私は作業エイリアスを作成するために、正しい方法でこれを逃れるように見えることはできません、しかし

cd `dirname \`find -name 'MyFile.txt' | sed -n 1p\`` 

次のコマンドの組み合わせは、所望の結果を達成し

出力:

/* 
dirname: missing operand 
Try `dirname --help' for more information. 
bash: cd: find: No such file or directory 

私のロジックがバッククォートは、単一の\で二重引用符で囲まれた文字列にエスケープする必要があり、私は\\を行うことができない文字列内の単一のバックスラッシュに変換されますので、第二のネストされたバッククォートが必要なことです1 + 2 = 3である。

提案がありますか?

答えて

13

エイリアスは$1のような引数を取ることができません。代わりに関数を使用してください。

また、ネストするのが簡単なので、コマンド置換の代わりにをバッククォートの代わりに使用してください。

関数は次のようになります。

jump() { 
    cd $(dirname $(find -name "$1" | sed -n 1p)) 
} 
+0

ドル情報の皆様に感謝します。私が尋ねた正確な質問に答えるためのドッグベーンへの特別な感謝 - このアプローチを使用してエイリアスを作成する方法。 – KomodoDave

3

Backticksはネストしていません。それは

cd $(dirname $(find /path/to/search -name 'MyFile.txt' | sed -n 1p)) 
+0

バッククォートが提供ネスティングを行うが、あなたはすぐに複数のネストのレベルのために扱いにくくなり、バックスラッシュ、それらをエスケープする必要があります。 '$ {..}'の構文は目にははるかに簡単です。 – mjuarez

2

バッククォートはcommand substitutionの古い形態であるだろうあなたのケースでは、構文$(..)

を持ってcommand substitutionを使用してみてください、あなたは簡単に巣にそれらをすることはできません。しかし、新しい$()formは簡単に巣を行います。

cd $(dirname $(find -name 'MyFile.txt' | sed -n 1p)) 
関連する問題