Bash 확장이 "-"로 시작하는 파일을 인수로 전달하는 것을 방지하는 방법은 무엇입니까?

Bash 확장이 "-"로 시작하는 파일을 인수로 전달하는 것을 방지하는 방법은 무엇입니까?

문자열을 재귀적으로 검색하려고 하는데 grep다음과 같은 결과가 나타납니다.

$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

-Bash가 매개변수로 시작하는 파일을 전달하는 것을 방지하는 방법은 무엇입니까 ?

답변1

먼저, 대시로 시작하는 매개변수의 해석은 실행 중인 프로그램 grep이나 다른 프로그램에 따라 달라집니다. 쉘에는 이를 제어할 수 있는 직접적인 방법이 없습니다.

대부분의 프로그램과 마찬가지로 이러한 파일을 (완전히 무시하지 않고) 처리하려고 한다고 가정하면 이는 옵션의 끝을 나타내는 것으로 grep인식됩니다 .--

grep -r -e "stuff" -- *

당신이 원하는 것을 할 것입니다. 거기의 경우 -estuffa로 시작합니다.-

또는 다음을 사용할 수 있습니다.

grep -r -e "stuff"  ./*

-후자는 또한 호출되는 현재 디렉터리에 파일이 있는 경우 문제를 방지합니다. --구분자 뒤에도 stdin으로 grep해석되는데 , -현재 디렉토리에서 ./-호출되는 파일이다 .-

답변2

도착하다Bash 확장이 "-"로 시작하는 파일을 전달하지 못하도록 방지당신은 그것을 사용할 수 있습니다 :

echo [!-]*

대부분의 쉘에서 이식 가능하거나 ksh, bash, zsh에만 적용됩니다.

echo !(-*)

예: 이 파일이 포함된 디렉터리

$ echo *
a b c ---corporate-discount.csv d -e --option.txt

목록만( extglob활성인 경우):

$ shopt -s extglob
$ echo !(-*)
a b c d

$ echo [!-]*
a b c d

-그러나 옵션으로 a로 선언된 파일을 해석하지 않도록 grep에 지시하면서 모든 파일을 처리하려면 다음을 추가하면 됩니다 ./.

grep -r "stuff" ./*

또는 -나열된 파일 중에서 보장된 호출된 파일이 없는 경우(grep은 단독 파일을 다음 -과 같이 해석합니다.표준 입력에서 읽기) 다음과 같이 사용할 수 있습니다.

grep -r -- "stuff" *

관련 정보