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

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

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

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

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에 있다는 것을 발견했습니다-r대신 stdin을 무시하고 현재 작업 디렉토리에서 검색합니다.. 표준 입력 읽기를 강제하기 위해 방금 다음을 추가했습니다 -.

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

관련 정보