рекурсивный скрипт не работает

рекурсивный скрипт не работает

Я пытаюсь добавить рекурсивную поддержку в свойскрипт 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

В данном случае я бы хотел избежать использования функций для лучшей читабельности.

EDIT: скрипт должен работать так:

для каждого переданного аргумента:

  • если текущий аргумент является каталогом, проверьте, включен ли рекурсивный режим, и если да, выполните рекурсивный вызов;
  • в противном случае, если текущий аргумент является файлом, вызвать grepс текущим шаблоном;
  • в противном случае предположим, что текущий аргумент является шаблоном grep или переключателем grep, и добавим его в текущий $GREP_ARGSсписок.

Возможно, это не совсем надежно, но для меня это отлично работает как замена zgrep, pdfgrep, и т. д.

решение1

Попробуйте использовать -Hопцию grep:

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

Поэтому вместо вызова вашего скрипта просто сделайте:

grep -H PATTERN [FILE...]

Также, хорошей идеей будет проверить страницу руководства для используемого вами инструмента, прежде чем пытаться написать скрипт-обертку. Для обычного инструмента Unix простые опции, которые вам нужны, почти всегда уже встроены в инструмент.

решение2

Я наконец-то понял, что проблема была grepв -rпереключателеигнорирует stdin и вместо этого ищет в текущем рабочем каталоге. Чтобы принудительно запустить чтение stdin, я просто добавил -:

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

Связанный контент