rekursives Skript funktioniert nicht

rekursives Skript funktioniert nicht

Ich versuche, rekursive Unterstützung hinzuzufügen zu meinemFilegrep-Skript.

Aus irgendeinem Grund funktioniert dies nicht wie erwartet:

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

Aus Gründen der besseren Lesbarkeit möchte ich in diesem Fall auf die Verwendung von Funktionen verzichten.

BEARBEITEN: Das Skript sollte folgendermaßen funktionieren:

für jedes übergebene Argument:

  • Wenn das aktuelle Argument ein Verzeichnis ist, prüfen Sie, ob der rekursive Modus aktiviert ist, und führen Sie wenn ja den rekursiven Aufruf aus.
  • andernfalls, wenn das aktuelle Argument eine Datei ist, grepmit dem aktuellen Muster aufrufen;
  • andernfalls wird davon ausgegangen, dass es sich beim aktuellen Argument um ein Grep-Muster oder einen Grep-Schalter handelt, und es wird an die aktuelle $GREP_ARGSListe angehängt.

Das ist vielleicht nicht ganz zuverlässig, aber für mich funktioniert es gut als Ersatz für zgrep, pdfgrep, usw.

Antwort1

Versuchen Sie, die -Hfolgende Option zu verwenden grep:

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

Anstatt Ihr Skript aufzurufen, tun Sie einfach Folgendes:

grep -H PATTERN [FILE...]

Außerdem ist es eine gute Idee, die Manpage des von Ihnen verwendeten Tools zu prüfen, bevor Sie versuchen, ein Wrapper-Skript zu schreiben. Bei gängigen Unix-Tools sind die gewünschten einfachen Optionen fast immer bereits im Tool integriert.

Antwort2

Ich habe endlich das Problem gefunden, dass grepmit dem -rSchalterignoriert stdin und sucht stattdessen im aktuellen Arbeitsverzeichnis. Um das Lesen von Standardeingaben zu erzwingen, habe ich einfach Folgendes hinzugefügt -:

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

verwandte Informationen