31

.aliases に次のエイリアスがあります。

alias gi grep -i

名前fooに文字列が含まれるすべてのファイルで、大文字と小文字を区別せずに検索したいと思います。bar

find -name \*bar\* | xargs gi foo

これは私が得るものです:

xargs: gi: No such file or directory

xargs でエイリアスを使用する方法はありますか、それともフル バージョンを使用する必要がありますか。

   find -name \*bar\* | xargs grep -i foo

注: これは簡単な例です。その上gi、手動で簡単に拡張できないかなり複雑なエイリアスがいくつかあります。

編集: を使用tcshしたので、回答がシェル固有のものかどうかを指定してください。

4

8 に答える 8

33

エイリアスはシェル固有です。この場合、おそらく bash 固有です。エイリアスを実行するには、bash を実行する必要がありますが、エイリアスは対話型シェルに対してのみ読み込まれます (より正確に.bashrcは、対話型シェルに対してのみ読み込まれます)。

bash -iは、対話型シェル (およびソース .bashrc) を実行します。 bash -c cmdcmdを実行します。

それらをまとめると、 bash -ic cmdは対話型シェルでcmdを実行します。ここで、 cmdは で定義された bash 関数/エイリアスにすることができます.bashrc

find -name \*bar\* | xargs bash -ic gi foo

あなたがしたいことをするべきです。

編集:質問に「tcsh」のタグを付けたようです。そのため、bash固有のソリューションは適用できません。tcsh では、-i.tcshrc を指定しない限り、.tcshrc と表示されるため、.tcsh は必要ありません-f

これを試して:

find -name \*bar\* | xargs tcsh -c gi foo

私の基本的なテストではうまくいきました。

于 2009-06-11T06:38:02.390 に答える
8

代わりに「gi」をスクリプトに変換します

/home/$USER/bin/gi:

#!/bin/sh
exec /bin/grep -i "$@"

ファイルを実行可能としてマークすることを忘れないでください。

于 2009-06-11T05:39:30.567 に答える
6

ここでの提案は、xargs を避け、xargs の代わりに「while read」ループを使用することです。

find -name \*bar\* | while read file; do gi foo "$file"; done

ファイル名のスペースまたは改行を処理するための改良については、上記のリンクで受け入れられた回答を参照してください。

于 2009-06-11T05:40:12.797 に答える
0

Bashを使用すると、次のようにエイリアス(または関数)に渡される引数の数を指定することもできます。

alias myFuncOrAlias='echo'  # alias defined in your ~/.bashrc, ~/.profile, ...
echo arg1 arg2 | xargs -n 1 bash -cil 'myFuncOrAlias "$1"' arg0

(tcshでも同様に機能するはずです)

# alias definition in ~/.tcshrc
echo arg1 arg2 | xargs -n 1 tcsh -cim 'myFuncOrAlias "$1"' arg0  # untested
于 2010-07-19T10:20:04.400 に答える
0

tcsh (関数を持たない) の場合、次を使用できます。

gi foo `find -name "*bar*"`

bash/ksh/sh の場合、シェルで関数を作成できます。

   function foobar 
   {
      gi $1 `find . -type f -name "*"$2"*"`
   }

   foobar foo bar

シェルで逆引用符を使用する方が、複数の観点から xargs を使用するよりも有利であることに注意してください。関数を .bashrc に配置します。

于 2009-06-11T07:20:01.683 に答える