쉘스크립트 `grep` 실행이 대화형 쉘처럼 작동하지 않습니다.

쉘스크립트 `grep` 실행이 대화형 쉘처럼 작동하지 않습니다.

사용할 수 없거나 제거할 수 없는 환경을 처리해야 하는 경우 ack이 명령은 C++ 프로젝트를 통해 문자열을 찾는 데 관련 파일만 제한하려고 시도합니다.

 grep pattern --color -- /project/path/**/*.*([chCH]|cc|cxx|[ch]pp|py)

그러면 작업이 완료됩니다. 이제 더 많은 상품을 제공하기 위해 목표는 이를 쉘 스크립트에 넣는 것입니다. 이름이 이라고 가정합니다 wrapped_grep. 내용은 다음과 같습니다 wrapped_grep.

#!/usr/bin/env bash

shopt -s extglob # enable advanced pattern matching
grep $1 --color -- /project/path/**/*.*([chCH]|cc|cxx|[ch]pp|py)

그러나 실행하려고 하면 wrapped_grep pattern동등한 직접 grep 쿼리가 예상대로 일치하는 항목을 찾더라도 출력이 제공되지 않습니다.

직접 grep 호출과 동일한 결과를 제공하기 위해 이 스크립트에서 누락된 것은 무엇입니까?

답변1

쉘 옵션은 표현식의 일부를 extglob활성화 하지만 해당 부분에는 옵션이 필요합니다*([chCH]|cc|cxx|[ch]pp|py)**/globstar

          globstar
                  If set, the pattern ** used in a pathname expansion con‐
                  text  will  match all files and zero or more directories
                  and subdirectories.  If the pattern is followed by a  /,
                  only directories and subdirectories match.

그래서 당신은 필요할 수 있습니다

shopt -s extglob globstar

관련 정보