エイリアスは、それが定義されているシェルの内部にあります。他のプロセスからは見えません。同じことがシェル関数にも当てはまります。xargs
は別個のアプリケーションであり、シェルではないため、エイリアスまたは関数の概念はありません。
xargsにgrep
直接起動する代わりにシェルを起動させることができます。ただし、シェルを呼び出すだけでは十分ではないため、そのシェルでもエイリアスを定義する必要があります。エイリアスがで定義されている場合、.bashrc
そのファイルを入手できます。ただし、これは.bashrc
、非対話型シェルでは意味をなさない他のタスクを実行しても機能しない場合があります。
find . -name '*.py' | xargs bash -c '. ~/.bashrc; grep -E regex_here "$@"' _
正規表現を入力するときに、ネストされた引用の複雑さに注意してください。正規表現をパラメーターとしてシェルに渡すことで、生活を簡素化できます。
find . -name '*.py' | xargs bash -c '. ~/.bashrc; grep -E "$0" "$@"' regex_here
エイリアスルックアップを明示的に実行できます。その後、表示xargs
されますgrep -n --color=always
。
find . -name '*.py' | xargs "${BASH_ALIASES[grep]}" regex_here
zshの場合:
find . -name '*.py' | xargs $aliases[grep] regex_here
ところで、find … | xargs …
スペースを含むファイル名(特に)でブレークすることに注意してください。これを修正するには、ヌル区切りのレコードに変更します。
find . -name '*.py' -print0 | xargs -0 "${BASH_ALIASES[grep]}" regex_here
またはを使用して-exec
:
find . -name '*.py' -exec "${BASH_ALIASES[grep]}" regex_here {} +
を呼び出す代わりにfind
、シェル内ですべてを実行できます。globパターン**/
は、ディレクトリを再帰的に走査します。bashでは、shopt -s globstar
最初にこのglobパターンを有効にするために実行する必要があります。
grep regex_here **/*.py
これにはいくつかの制限があります。
- 多数のファイルが一致する場合(またはパスが長い場合)、コマンドラインの最大長を超えるため、コマンドが失敗する場合があります。
- bash≤4.2では(ただし、最新バージョンでもkshやzshでも)、
**/
ディレクトリへのシンボリックリンクに再帰します。
別のアプローチは、MariusMatutiaeが示唆するように、プロセス置換を使用することです。
grep regex_here <(find . -name '*.py')
これは、**/
適用できない場合に便利です。複雑なfind
式の場合、またはシンボリックリンクで再帰したくない場合のbash≤4.2の場合。これは、スペースを含むファイル名で中断することに注意してください。回避策はglobbingを設定IFS
および無効にすることですが、少し複雑になり始めています:
(IFS=$'\n'; set -f; grep regex_here <(find . -name '*.py') )