예를 들어 이름이 하나 또는 여러 개의 빼기 기호로 시작하는 파일이 있는 경우 --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