"-"라는 파일을 "터치"하고 "캣"하는 방법

"-"라는 파일을 "터치"하고 "캣"하는 방법

GNU를 사용하여 touch이름이 지정된 파일을 업데이트하는 방법은 무엇입니까 -?

GNU를 사용하여 cat이름이 지정된 파일을 표시하는 방법은 무엇입니까 -?


나는 뛰고있어:

% cat --version | head -n1
cat (GNU coreutils) 8.29
% touch --version | head -n1
touch (GNU coreutils) 8.29

첫 번째, touch:

% touch -
% ls -l
total 0
% touch -- -
% ls -l -- -
ls: cannot access '-': No such file or directory

좋아요, 이제 사용 을 포기하겠습니다 touch.date

% date > -
% ls -l -
-rw-r--r-- 1 ravi ravi 29 Sep  8 19:54 -
%

이제 시도해 보겠습니다 cat.

% cat -
% # I pressed ^D
% cat -- -
% # Same again - I pressed ^D

나는 다음 문제를 해결할 수 있다는 것을 알고 있습니다.

% > -

그리고

% cat < -

--그런데 왜 이 GNU 유틸리티는 그 이후의 모든 것이 옵션이 아닌 것으로 간주된다는 규칙을 지원하지 않습니까 ?

일반적인 경우(예: 콘텐츠가 있는 변수가 있는 경우) 이러한 도구를 어떻게 사용합니까 -?

답변1

파일에 대한 명시적인 경로를 사용하십시오.

touch ./-
cat ./-

GNU는 touch파일 피연산자를 특별히 처리합니다 -:

FILE 인수 문자열은 표준 출력과 연관된 파일을 변경하는 시간을 -발생시키기 위해 특별히 처리됩니다 .touch

을 위한 cat,POSIX 표준파일 피연산자가 -표준 입력에서 읽기 위한 요청으로 해석되어야 함을 지정합니다.

이중 대시 규칙은 여전히 ​​작동하지만 표시하기 위한 것은 아닙니다.논쟁하지만 결국옵션. 두 경우 모두 -옵션으로 처리되지 않지만(옵션만으로는 -옵션이 될 수 없음) 피연산자("파일 이름 인수")로 처리됩니다.


마지막 질문에 관해서:

변수의 내용이 사용될 때 옵션 집합으로 해석되지 않도록 보호합니다.

utility "$variable"

사용

utility -- "$variable"

유틸리티가 cat, sed, awk, pastesort기타 다른 것(또는 GNU touch) 이고 $variable인 경우 위에서 언급한 것처럼 이는 옵션이 아니기 -때문에 유틸리티가 여전히 특수 처리를 수행하게 됩니다 . 대신 현재 작업 디렉터리의 파일 과 같이 -파일 이름( 로 시작하거나 같을 수 있는 경우 -) 앞에 경로가 오도록 규정하세요../

좋은 습관은 사용하는 것입니다

for filename in ./*; do

대신에

for filename in *; do

예를 들어.

관련 정보