재귀적 지원을 추가하려고 합니다.파일 그렙 스크립트.
어떤 이유로 인해 예상대로 작동하지 않습니다.
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: #"