서브쉘에서 중괄호가 포함된 grep --include가 실패하는 이유는 무엇입니까? [복사]

서브쉘에서 중괄호가 포함된 grep --include가 실패하는 이유는 무엇입니까? [복사]

이는 쉘에서 작동합니다.

grep -R --exclude-dir=storage --exclude-dir=node-modules --include=*.{scss,css} loader.gif

그러나 이것은 실패합니다.

sh -c "grep -R --exclude-dir=storage --exclude-dir=node-modules --include=*.{scss,css} loader.gif"

메시지 없이 실패하며 아무 일도 일어나지 않습니다.

이것은 작동합니다:

sh -c "grep -R --exclude-dir=storage --exclude-dir=node-modules --include=*.scss loader.gif"

중괄호 사용이 --include=*.{scss,css}실패하는 이유는 무엇입니까?

답변1

이는 아마도 귀하의 shPOSIX sh가 일반 POSIX sh(또는 최소한 로그인 셸보다 간단함)이고 중괄호 확장이 지원되지 않기 때문일 수 있습니다. Linux 시스템의 경우 최소한 Debian 및 Debian이 기본값입니다.우분투. Bash를 실행하려면 실행하세요 bash -c.

답변2

"확장 시간" 때문입니다.

명령을 단순화해 보겠습니다.

$ echo --include=*.{scss,css}
--include=*.scss --include=*.css

보시다시피 중괄호는 "현재 실행 중인 쉘"(아마도 bash)에 의해 확장됩니다. *(or)로 시작 --include=하고 (or)로 끝나는 이름을 가진 파일이 현재 디렉터리에 없을 수 있으므로 확장되지 않습니다 ..scss.css

그러나 다음에서는

$ sh -c "echo --include=*.{scss,css}"
--include=*.{scss,css}

두 가지 일이 발생합니다.

  • 중괄호는 인용되어 문자 그대로 다음 쉘에 제공되므로 현재 실행 중인 쉘(PRS)에 의해 확장되지 않습니다 sh -c.

  • 다음 셸은 중괄호 확장을 지원하지 않으므로 그대로 둡니다. echo를 사용하여 인쇄하십시오.

따라서 PRS가 중괄호를 확장하도록 하십시오.

sh -c 'echo "$@"' mysh --include=\*.{scss,css}

이는 복잡하며 권장되는 해결 방법은 아닙니다. 또는 중괄호를 지원하는 셸을 사용하세요.

bash -c 'echo --include=\*.{scss,css}'

둘 다 *확장을 방지하기 위해 참조됩니다.

관련 정보