再帰スクリプトが機能しない

再帰スクリプトが機能しない

再帰サポートを追加しようとしています。ファイルグレップスクリプト

何らかの理由で期待どおりに動作しません。

RECURSIVE_MODE=off

# iterate over args
for ARG in "$@"
do
    if [ -d "$ARG" ] && [ $RECURSIVE_MODE = on ] ; then
        # recursive call
        $0 $GREP_ARGS $ARG/*
    elif [ -f "$ARG" ]; then
        filecat "$ARG" | grep $GREP_ARGS | sed "s#^#$ARG: #"
    else
        [ "$ARG" = "-r" ] && RECURSIVE_MODE=on
        # append to the current grep args
        GREP_ARGS="$GREP_ARGS $ARG"
    fi
done

この場合、読みやすくするために関数の使用を避けたいと思います。

編集:スクリプトは次のように動作するはずです。

渡された各パラメーターに対して、以下を行います。

  • 現在の引数がディレクトリの場合は再帰モードが有効になっていることを確認し、有効になっている場合は再帰呼び出しを実行します。
  • それ以外の場合、現在の引数がファイルの場合、grep現在のモードが使用されます。
  • それ以外の場合は、現在の引数がgrepパターンまたはgrepスイッチであり、現在の$GREP_ARGSリストに追加されたと見なされます。

おそらく、これは完全に信頼できませんが、代替として私にとってはうまくいきますzgreppdfgrep

答え1

-H次のオプションを試してくださいgrep

   -H, --with-filename
          Print the filename for each match.

したがって、スクリプトを呼び出すのではなく、次のようにします。

grep -H PATTERN [FILE...]

また、ラッパースクリプトを作成する前に、使用しているツールのマニュアルページを確認することをお勧めします。一般的なUnixツールを使用すると、必要な単純なオプションはほとんど常にツールに組み込まれています。

答え2

ついに問題がスイッチgrepにあることがわかりました-rstdinを無視して現在の作業ディレクトリから検索。 stdinで強制的に読むには、以下を追加しました-

filecat "$ARG" | grep $GREP_ARGS - | sed "s#^#$ARG: #"

関連情報