cat 및 grep과 같은 명령이 빼기 기호로 시작하는 파일을 인식할 수 없는 이유는 무엇입니까? [복사]

cat 및 grep과 같은 명령이 빼기 기호로 시작하는 파일을 인식할 수 없는 이유는 무엇입니까? [복사]

예를 들어 이름이 하나 또는 여러 개의 빼기 기호로 시작하는 파일이 있는 경우 --1많은 명령에 대한 인수로 사용할 수 없습니다. 달려가도

cat --1

파일 내용 대신 인식할 수 없는 옵션 오류 메시지가 나타납니다.

cat: unrecognized option '--1'

입력해도 동일한 효과가 나타납니다.

cat "--1"
cat '--1'
cat \-\-1

아무것도 작동하지 않습니다. "-"로 시작하는 파일은 파일 시스템에서는 불법이 아니지만, cli나 스크립트에서는 사용하기가 상당히 어렵습니다. 알았어 거기 있으면 cat아니면 grep내가 사용해도 돼

cat <--1

이것은 효과가 있지만

rm --1

둘 중 하나도 작동하지 않으며 명령을 다른 명령으로 바꾸는 것도 어렵습니다. 결국 매우 불편합니다. 그러한 파일 이름을 사용하지 않는 것과 다른 일반적인 해결 방법이 있습니까?

그런데 이름 파일이 단일 -이고 대부분의 명령이 이를 이해할 수 있다면 stdin그렇지 않습니까?

mv그리고 명령을 사용하여 스크립트에서 파일 이름을 바꿀 수 없기 때문에 이와 같은 파일 이름을 사용하지 않는 것이 어렵습니다 .

답변1

관례는 a로 시작하는 것은 모두 -옵션이라는 것입니다. . 로 시작하는 파일 이름과 충돌합니다 -. 이 문제를 해결하기 위해 대부분의 명령은 이를 --옵션 종료 태그로 인식합니다. 다음에 나오는 내용은 --옵션으로 인식되지 않고 문자 그대로 파일 이름으로 간주됩니다.

예를 들어

cat -- --1

또는

rm -rf -- --1

또 다른 방법은 경로로 파일 이름을 한정하는 것입니다.

예를 들어

cat ./--1

심지어

cat /home/username/foo/--1

줄 바꿈을 포함하여 다양한 문자를 포함 할 수 -있는 .

질문에 답하려면: cat 및 grep과 같은 명령이 빼기 기호로 시작하는 파일을 인식할 수 없는 이유는 무엇입니까? 명령줄은 단지 문자열이기 때문입니다. 쉘은 일부 파일 이름 확장, 일부 토큰화 및 일부 변수 대체를 수행하지만 궁극적으로 프로그램은 문자열 배열을 받습니다.

옵션을 나타내는 문자열과 파일 이름을 나타내는 문자열을 어떻게 분리할 수 있나요? 일부 파수꾼 캐릭터에 의해. 유닉스/리눅스 세계의 관례는 -센티넬 문자를 사용하는 것입니다. a로 시작하는 모든 것은 -옵션입니다. 글쎄, 거의 모든 것. 옵션에 대한 인수는 로 시작할 수도 있지만 -이는 개별 프로그램 세부사항입니다.

모든 프로그램이 이 규칙을 따르는 것은 아닙니다. 틀림없이 가장 인기 있는 예는 다음과 같습니다 dd.

dd if=/dev/random of=whatfreespace

dd=파일 이름은 기호 뒤에 나타나는 대로 인식됩니다 .

전부는 아니지만 대부분의 GNU 프로그램은 GNU getopt 규칙을 따릅니다. 짧은 옵션은 및 및 로 시작하고 -길이는 단 한 문자이고 긴 옵션은 및 및 로 시작하며 --길이는 최소 2자입니다. --이는 자체적으로 옵션의 끝을 표시하며 해당 표시 이후의 문자열은 옵션으로 인식되지 않습니다. 자세한 내용은 읽어보십시오.프로그램 매개변수 구문 규칙GNU libc 매뉴얼에 있습니다.

GNU 규칙을 부분적으로만 따르는 프로그램의 예는 다음과 같습니다 find.

find -not -name porn -delete

옵션과 옵션이 아닌 옵션을 구별하는 데 find사용되지만 -긴 옵션과 짧은 옵션을 구별하지는 않습니다. --옵션의 끝으로 식별됩니다 . 각 프로그램은 옵션, 파일 이름 및 기타 사항을 식별하는 고유한 방법을 정의할 수 있습니다.

단일 문자를 stdin으로 해석하는 규칙은 문자열 배열에서 -단일 문자를 발견할 때 이를 해석하는 방법에 대한 규칙 이기도 합니다.-

답변2

대시로 시작하는 모든 항목은 옵션으로 간주됩니다. 옵션처럼 보이지 않도록 파일 이름 앞에 경로를 추가할 수 있습니다.

cat ./--filename

답변3

cat -- --filename옵션 검색을 중지하려면 지침을 따르세요 . 타사 애플리케이션이 대시 파일 이름을 처리하는 방법을 모르기 때문에 이 접근 방식에는 잠재적인 문제가 있습니다. 그러나 POSIX 바이너리 등은 cp, rm, cat이러한 대시를 처리하는 방법을 알고 있습니다 .

답변4

보다 일반적으로 다음과 같습니다.

cat $options_and_or_file_patterns_or_stdin_if_dash

cat "$option_or_file_or_stdin_if_dash"

cat -- "$file_or_stdin_if_dash"

cat < "$file"

cat - < "$file" # same as above

관련 정보