1

私は2つのbash関数catallとgrepallを持っています

catall正常に動作し、最初にファイル名が出力され、次にコンテンツと新しい行が出力されたすべてのファイルを cat します。

catall ()
{
  find . -name $1 | xargs -I % sh -c 'echo %; cat %; echo"" '
}


grepall ()
{
  find . -name $1 | xargs -I % sh -c 'echo %; cat % | grep $2; echo"" '
}

しかし、grepall機能しません。同じことを行う必要がありcatallますが、ファイルのコンテンツにgrepステージを使用します

$2サブされない理由

このgrepallを機能させることはできますか?

4

1 に答える 1

2

これは、使用して新しいシェル プロセスをフォークしており、エクスポートsh -cしない限り、親シェルのすべての変数を子シェルで使用できないためです。

この関数を使用して機能させます。

grepall () {
   export p="$2"; find . -name $1 | xargs -I % sh -c 'echo %; grep "$p" %; echo "" ';
}

サブシェルでも使用できるようになるエクスポートされた変数を作成しているため、現在は機能していpます。

とにかく新しいシェルをフォークしているので、あなたのために仕事をすることができるので、実際に呼び出す必要はありませんxargsa:find

grepall () {
   export p="$2"; find . -name $1 -exec sh -c 'echo $1; grep "$p" $1; echo "" ' - {} \;;
}
于 2014-08-28T09:38:24.303 に答える