재귀 스크립트가 작동하지 않습니다

재귀 스크립트가 작동하지 않습니다

재귀 지원을 추가하려고 합니다.파일 그렙 스크립트.

어떤 이유로 인해 예상대로 작동하지 않습니다.

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목록에 추가된 것으로 가정됩니다.

아마도 이것은 완전히 신뢰할 수는 없지만 대체 등 으로 나에게는 잘 작동합니다 zgrep.pdfgrep

답변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: #"

관련 정보