再帰スクリプトが動作しない

再帰スクリプトが動作しない

私は再帰サポートを追加しようとしていますfilegrep スクリプト

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

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を無視し、代わりに現在の作業ディレクトリを検索します標準入力の読み取りを強制するために、以下を追加しました-:

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

関連情報