디렉토리에 대시로 시작하는 파일이 포함되어 있으면 grep이 혼동되는 문제가 발생합니다.
예를 들어 " "라는 파일이 있습니다 ------.js
. 비슷한 작업을 수행하면 grep somestring *
오류가 발생합니다.
grep: unrecognized option '------.js'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
인터넷에 이런 질문이 많이 올라오는 것 같은데, 검색해도 안나오네요.
비슷한 접근 방식을 사용하여 문제를 수동으로 해결할 수 있지만find . | while read f; do grep MYSTRING "$f"; done
더 간단하고 강력한 솔루션이 있는지 알고 싶습니다.
저는 아치 리눅스를 사용하고 있습니다.
답변1
Romeo의 답변을 보완하여 다음 사항에 유의하십시오.
grep pattern --whatever
POSIX를 찾아야 합니다.무늬--whatever
파일 에서 . 옵션이 아닌 인수(여기 pattern
) 뒤에는 옵션이 인식되어서는 안 되기 때문입니다 .
이 경우 GNU는 grep
POSIX와 호환되지 않습니다. POSIXLY_CORRECT 환경 변수(어떤 값이든)를 해당 환경에 전달하여 호환 가능하게 만들 수 있습니다.
getopt()
getopt_long()
이는 명령줄 인수를 구문 분석하기 위해 GNU 또는 /의 호환 가능한 구현을 사용하는 대부분의 GNU 유틸리티 및 유틸리티의 경우입니다.
.env
env VAR=x grep --version
grep
env
또 다른 주목할만한 예외는 GNU 쉘( bash
)인데, 인터프리터와 그 내장 함수 중 어느 것도 옵션이 아닌 인수 뒤에 옵션을 허용하지 않습니다. 심지어 getopts
GNU 방식으로 옵션을 구문 분석할 수도 없습니다.
어쨌든 이렇게 하면 POSIXLY_CORRECT가 저장되지 않습니다.
grep -e pattern *.js
( pattern
여기에는 옵션이 아닌 인수가 없으며 -e
옵션에 인수로 전달되므로 나중에 더 많은 옵션이 허용됩니다.)
-
+
따라서 다음 내용이 특정 도구(또는 일부 도구)로 시작 되지 않을 것이라고 보장할 수 없는 경우 항상 옵션의 끝을 --로 표시하는 것이 좋습니다.
grep -e pattern -- *.js
grep -- pattern *.js
또는 다음을 사용하십시오:
grep -e pattern ./*.js
( 이것은 grep -- pattern *
while이라는 파일이 있는 경우 -
도움이 되지 않습니다 . 파일 자체가 로 시작할 수 있는 경우 에는 grep pattern ./*
대신 while을 사용해야 합니다 .)grep -e "$pattern"
grep "$pattern"
$pattern
-
1990년대 중반에는 환경 변수 를 통해 옵션으로 간주되지 않아야 하는 매개변수(일반적으로 glob 확장에 의해 생성된 매개변수 )를 bash
구별하려는 시도가 있었지만 이 시도는 해결하는 문제보다 더 많은 문제를 야기했기 때문에 제거되었습니다.getopt()
_<pid>_GNU_nonoption_argv_flags_
답변2
"매개변수 끝"을 알려주는 grep 옵션을 사용해 볼 수 있습니다.
grep -- <string> <filename>
그러면 grep이 다음 대시를 인수로 무시하고 이를 명령줄의 다음 요소로 처리하도록 지시합니다.
답변3
다른 답변과 함께 TLDR을 게시하려면확실히고정시키다,
grep -e pattern ./*.js
이는 --
해당 옵션이 없는 명령에 대해 작동합니다. 상당히 광범위하게 지원되지만 모든 명령이 이를 처리할 수 있는 것은 아닙니다.
(또한 -e
모호함도 명확하다는 점에 유의하십시오.무늬대시로 시작하세요. 물론 이 문제를 해결하기 위해 비슷한 접근 방식을 사용할 수 있지만 [-]pattern
그것은 작동하지 않습니다 grep -F
. 스키마가 사용자가 제공하는 경우에는 문제를 일으키지 않는 것이 가장 좋습니다. )
"(거의) 항상 변수를 인용"한 다음 이것은 아마도 쉘 프로그래밍에서 두 번째로 가장 일반적인 문제일 것입니다. 와일드카드 일치 및 사용자 제공 데이터에는 선행 대시가 포함될 수 있으며 때때로 포함되므로 준비하는 것이 좋습니다.
답변4
find . -name '-*' -exec rename 's/[- ]//' {} \;