이는 쉘에서 작동합니다.
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
이는 아마도 귀하의 sh
POSIX 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}'
둘 다 *
확장을 방지하기 위해 참조됩니다.