-
실수 로 (예 : ) 라는 파일을 만들었습니다 seq 10 > -
. 그런 다음 을 사용하여 보려고 시도했지만 less
작동이 멈췄습니다.
less -
나는 의 입력이 필수이기 때문에 이런 일이 발생한다는 것을 알고 있으므로 파일 이름으로 stdin
해석되지 않습니다 . -
시도해 보았지만 less \-
역시 작동하지 않습니다.
less
그렇다면 이것이 -
표준 입력이 아니라 파일이라는 것을 나타낼 수 있는 방법이 있습니까 ?
내가 얻을 수 있는 최선은 다음과 같습니다.
find -name '-' -exec less {} +
답변1
접두사를 추가하면 됩니다 ./
.
less ./-
또는 리디렉션을 사용하십시오.
less < -
-
(예를 들어 관련 -x
또는 예를 들어) 는 --foo--
옵션이 아닌 특수 파일 이름으로 처리되므로 다음은 작동하지 않습니다.
less -- - # THIS DOES NOT WORK
답변2
그냥 알아요 mv - f && less f
. 문제가 해결되었습니다.
답변3
노트:내 대답은아니요OP의 경우에 작동하며 아래에 언급된 규칙을 따르는 도구에 대해서만 작동합니다. 파일 이름이 (dash) 인 경우에는 작동하지 않습니다. -
이는 일반적으로 표준 입력에서 읽을 것으로 예상하도록 지정하는 특별한 경우이기도 합니다.허용되는 답변을 참조하십시오.
여기에는 사람들이 답변을 찾을 때 우연히 발견할 수 있는 다른 상황에 대한 유용한 정보가 포함되어 있기 때문에 여기에 남깁니다.
더블 대시!
--
마지막 인수를 표시하려면 표준 이중 대시( ) 규칙을 사용하십시오 .
less -- -FILENAME
예
$ echo "meh" > -badname
$ less -badname
Number is required after -b
$ less -- -badname # GREAT SUCCESS!
시하앗?
이 --
주장은 대부분의 쉘 유틸리티 및 명령줄 도구 구현에서 지원되는 규칙에서 비롯되었으며 대부분의 쉘은 CLI 도구를 구현할 때 따라야 한다고 명시적으로 주장합니다.
공개그룹 추천
OpenGroup도 이 내용을 언급했습니다.유틸리티 설명 기본값기본 사양의 (v6) 부분:
기본 동작: [...] 옵션을 허용하지 않지만 피연산자를 허용하는 표준 유틸리티는 "--"를 삭제할 첫 번째 인수로 인식해야 합니다.
"--"를 인식해야 하는 요구 사항은 애플리케이션을 준수하는 경우 구현이 확장으로 제공할 수 있는 임의의 옵션으로부터 피연산자를 보호하는 방법이 필요하기 때문입니다. 예를 들어, 표준 유틸리티 foo가 옵션 없이 나열되어 있고 응용 프로그램이 앞에 하이픈이 있는 경로 이름을 제공해야 하는 경우 다음을 수행하는 것이 안전합니다.
foo -- -myfile
-m을 확장명으로 사용하면 문제가 발생하지 않습니다.
그리고유틸리티 구문 가이드(v7):
지침 10: 옵션 매개변수가 아닌 첫 번째 -- 인수는 옵션의 끝을 나타내는 구분 기호로 허용되어야 합니다. 후속 인수는 "-" 문자로 시작하더라도 피연산자로 처리되어야 합니다.
배쉬 추천
다음은 이를 지원하는 내장 함수를 설명하는 bash 매뉴얼에서 발췌한 내용입니다.
달리 언급하지 않는 한, 이 섹션에 설명된 각 내장 명령은 옵션의 끝을 표시하기 위해 앞에 -accepts--가 붙은 옵션을 허용합니다.
:, true, false 및 test 내장 함수는 옵션을 허용하지 않으며 특별히 처리하지 않습니다. 종료, 로그아웃, 중단, 계속, 허용 및 이동 내장 함수는 -- 없이 -로 시작하는 인수를 승인하고 처리합니다. 인수를 허용하지만 허용 옵션으로 지정되지 않은 다른 내장 함수는 -로 시작하는 인수를 유효하지 않은 옵션으로 해석하고 require -를 해석하여 이러한 해석을 방지합니다.
echo는 --를 옵션의 끝으로 해석하지 않는다는 점에 유의하세요.