“-”라는 파일을“적게”만드는 방법?


17

실수로 이름이있는 파일 -(예 :)을 만들었습니다 seq 10 > -. 그런 다음 그것을 사용 less하여 보려고 시도했지만 중단됩니다.

나는 less -입력을 기대 하기 때문에 이것이 일어나고 있음을 이해합니다.stdin 하므로 -파일 이름으로 해석하지 않습니다 . 시도 less \-했지만 작동하지 않습니다.

따라서 나타낼 방법이 있습니까? less-파일과 stdin을하지 않음?

내가 얻을 수있는 최선은 다음과 같습니다.

find -name '-' -exec less {} +

2
@muru는 의견에 감사하지만 가능한 중복은 너무 구체적이므로 "정확한 복제"라고 생각하지 않습니다. "- '로 시작하는 파일에 액세스하는 방법"과 같은보다 일반적인 것으로 다시 말하면 어쩌면.
fedorqui 2016 년

4
중복 된 질문이 아닙니다. -혼자 의 경우 는 다릅니다. -옵션이 아닙니다.
Stéphane Chazelas 2016 년

1
@ terdon 나는 같은 대답을 직접적으로 갖는 것이 중복된다고 생각하지 않습니다. Meta SO 어딘가에 예가 있습니다. 질문에 "아니오"로 답한 경우 정답이 "아니오"인 사람이 중복됩니까? 앞에서 말했듯이 복제 후보를 다시 말하면 더 일반적입니다. 그렇지 않으면 이와 같은 다른 질문을 보내는 것은 의미가 없습니다.
fedorqui 2016 년

4
@ 터던 수락 된 솔루션은 여기서 작동하지 않습니다. 그리고 아니요, -옵션으로 취급되지 않습니다. 이는 옵션과 같은 형태의 인수와는 완전히 다른 문제입니다.
Stéphane Chazelas 2016 년

2
묶어야 할 필요가 없습니다 -처럼 작은 따옴표 사이 '-'처럼 또는 도주 \-하기 때문에 -일반적인 쉘에 대한 특수 문자 (적어도 POSIX 호환 것)이 아니다. 결과는 같습니다.
pabouk

답변:


53

접두사로 ./:

less ./-

또는 리디렉션을 사용하십시오.

less < -

이후하는 것으로 -(반대 -x또는 --foo--특수 파일 이름이 아닌 옵션으로 간주됩니다 예를 들어), 다음하지 작업을 수행합니다 :

less -- -   # THIS DOES NOT WORK

3
BTW, 그게 다야 find -name '-' -exec less {} +.
Stéphane Chazelas 2016 년

6
@fedorqui, 아니 그것 뿐이다 -./-(또는 /path/to/-../to/-) 그 두 가지 (4) 유효한 경로입니다 -파일이 있지만 -인수에 특별한 less동안 (수단은 표준 입력에서 읽기) ./-특별하지 않다.
Stéphane Chazelas

2
@fedorqui find -name '-' -exec less {} +는의 비표준 형식입니다 find . -name '-' -exec less {} +. 트리를 내려 .가서 파일을 찾고 해당 파일의 경로를 인수로 전달합니다 less. 교체 -exec less-exec echo less실행되고 있는지 확인합니다.
Stéphane Chazelas 2016 년

4
@haylem --은 옵션의 끝을 표시하는 것입니다. 여기서 도움이되지 않습니다. 이것은 -옵션이 아니라 특별한 비 옵션 인수입니다. 참조 unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756을
스테판 Chazelas가에게

3
@haylem, 직접 해보십시오. --옵션의 끝을 표시하기 위해 getopt ()에 의해 처리되고 getopt ()에 -의해 옵션 -으로 인식 --되지 않으므로 제공 여부에 관계없이 일반 인수로 인식됩니다 . 그리고 less대부분의 텍스트 유틸리티와 마찬가지로 일반적인 논거 로서 stdin을 의미하는 것으로 간주합니다.
Stéphane Chazelas 2016 년


3

참고 : 내 대답은 하지 영업 이익의 경우에 유효하고, 단지 컨벤션 정확히 단지라는 이름의 파일의 경우 아래 아니라 언급 한 다음과 같은 도구에 적용 -표준에서 독서를 지정하는 것이 자주 (대시), 특별한 경우 입력이 예상됩니다. 허용 된 답변을 참조하십시오.

여기에 답을 찾는 동안 넘어 질 수있는 다른 경우에 대한 유용한 정보가 들어 있으므로 여기에 남겨 두십시오.


더블 대쉬!

표준 이중 대시 ( --) 규칙을 사용하여 마지막 인수를 나타냅니다.

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 내장은 옵션을 허용하지 않으며 특별히 취급하지 않습니다. 종료, 로그 아웃, 중단, 계속, 렛트 및 시프트 내장은-없이 시작하여 인수를 승인하고 처리합니다. 인수를 허용하지만 옵션을 수락하도록 지정되지 않은 다른 내장은이 해석을 막기 위해 유효하지 않은 옵션으로 시작하는 인수를 해석하고 요구합니다.

echo는 옵션의 끝을 의미하는 것으로 해석되지 않습니다.

추가 자료


2
+1 : 가장 휴대 성이 뛰어나고 명령에 독립적 인 솔루션으로 기억하기 쉽고 "모범 사례"로 간주
mveroone

2
@ Kwaio "모범 사례"에 대한 언급이 있습니까? 그냥 궁금해
fedorqui 2016 년

24
이 답변은 옵션처럼 보이는 인수에 적용됩니다. -옵션이 아닌 경우 는 아닙니다. 사용 ./-는 같은 문제의 다른 종류의 방지로 일반적으로 더 나은 방법입니다 가능한 경우 또는 재 지정 foo=barawk또는를 -. 참조 unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756을
스테판 Chazelas가에게

7
스테판이 말했듯이,이 응답하지 않습니다 질문을. 여전히 stdin에서 읽으려고합니다. less -- -
Michał Politowski 2016 년

5
답을 삭제하거나 ( 여기에 유용한 참고 자료가 있으므로 다른 질문 으로 옮길 수 있음)이 특정 경우에 적용되지 않는다는 것을 분명히하고 (어떻게 더 유용한 지 설명 할 수도 있습니다).
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.