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
, paste
및 sort
기타 다른 것(또는 GNU touch
) 이고 $variable
인 경우 위에서 언급한 것처럼 이는 옵션이 아니기 -
때문에 유틸리티가 여전히 특수 처리를 수행하게 됩니다 . 대신 현재 작업 디렉터리의 파일 과 같이 -
파일 이름( 로 시작하거나 같을 수 있는 경우 -
) 앞에 경로가 오도록 규정하세요../
좋은 습관은 사용하는 것입니다
for filename in ./*; do
대신에
for filename in *; do
예를 들어.