`touch`에 -f 옵션을 사용하는 것은 무엇입니까?


23

보낸 사람 man touch:

-f     (ignored)

하지만 의미가 무엇하지 않는 무시 .

나는 다음을 시도했다.

$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:17 file

$ touch -f file
$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:18 file

에도 불구하고 타임 스탬프가 변경 -f됩니다.

그래서 나는 무엇이 무엇을 -f의미 하는지 알고 싶습니다 .


2
-f옵션으로 무시되는 것으로 가정합니다 . 아마도 인수 파서를 통해 엉망이 될 수 있습니다.
Thomas

1
(무시)는 명령이 아니라 플래그가 무시됨을 의미합니다.
기금 모니카의 소송

답변:


47

GNU 유틸리티의 경우 전체 설명서는 다음 info페이지에서 읽을 수 있습니다.

-f
무시 `touch '의 BSD 버전과 호환됩니다.

참조 터치 역사적인 BSD 맨 페이지 , -f하는 것이었다 강제 터치합니다.

이전 BSD의 소스를 살펴보면 utimes()시스템 호출 이 없었 으므로 touch파일을 읽기 + 쓰기 모드로 열고 1 바이트를 읽은 다음 다시 검색하여 마지막 액세스 및 마지막 수정 시간을 업데이트하기 위해 다시 쓰십시오 .

분명히, 읽기쓰기 권한이 모두 필요했습니다 ( false touchaccess(W_OK|R_OK)반환 된 경우 시도하지 마십시오 ). 일시적으로 권한을 0666으로 변경하여-f 그 문제를 해결하려고했습니다 !

0666은 모든 사람에게 읽기 및 쓰기 권한을 의미합니다. 그 짧은 창에서 의미 할 수 있는 다른 방법 (예 : 여전히 터치를 허용 한 0600과 같은보다 제한적인 권한)과 달리 파일에 대한 읽기 또는 쓰기 권한이있는 프로세스는 더 이상 할 수 없었습니다. 기능을 깨고 .

그러나 그렇지 않으면 파일에 액세스 할 수없는 프로세스는 이제 파일을 열 기회가 짧아 보안이 손상 됩니다.

그것은 매우 합리적인 일이 아닙니다. 현대의 touch구현은 그렇게하지 않습니다. 그 이후로 utime()시스템 호출 이 도입되어 파일의 내용과 어울리지 않고 수정 및 액세스 시간을 개별적으로 변경할 수 있습니다 (즉, 비정규 파일과도 작동 함).

옵션을 touch통과해도 GNU는 여전히 실패하지 않지만 -f플래그를 무시합니다. 이런 식으로, 이전 버전의 BSD 용으로 작성된 스크립트는 GNU 시스템으로 이식 될 때 실패하지 않습니다. 요즘 관련성이 적습니다.


3
developer.apple.com/library/mac/documentation/Darwin/Reference/… 에 따르면 -f여전히 Mac OS X에서 작동합니다. 그러나 GUI를 사용하여 동일한 기능 "더 나은"을 수행하는 방법에는 적어도 57 가지가 있습니다! )
alephzero

20
GUI를 사용하는 것이 반드시 "더 나은"것은 아닙니다. 스크립트를 사용하는 요점은 자동화하는 것입니다. 여기에는 가능한 한 많은 유닉스 방언이나 최소한 발생할 수있는 대부분의 방언에서 스크립트가 수정되지 않도록하는 것이 포함됩니다. .
Guntram Blohm은 Monica

@alephzero OS X의 버전이 BSD 버전이기 때문에 GNU는 호환성을 유지합니다.
Barmar

14

-f아무것도하지 않습니다. 역사적 호환성 (BSD touch에 따라 info touch) 과 함께 유지 되므로 존재한다고 예상되는 응용 프로그램은 그것을 전달하지 않고 존재하지 않는다는 오류 메시지를 다시받습니다. 이것이 GNU coreutils라고 가정하면 소스 에서 이것이 break아무것도하지 않고 옵션 처리 스위치에서 수행한다는 것을 알 수 있습니다.

무시 된 옵션으로, 1992 년에 추가 된 -fGNU touch명령 의 첫 번째 버전 에서 제공됩니다 ( diff 참조 ). 적어도 FreeBSD v9에서는 -f"파일 권한이 현재 그것을 허용하지 않는 경우에도 강제로 업데이트를 시도합니다"(Sukminder에 의해 발견됨).


2
info페이지는 무시
heemayl

@heemayl 제외하고 "-f"인수와 함께 제공되는 것으로 보이는 BSD를 찾을 수 없으므로 꽤 오래되었습니다.
Chris Down

흠 .. 방금 Coreutils 매뉴얼을 확인했습니다 . "무시; BSD 버전의 터치와의 호환성을 위해."
Pandya

3
-f파일 권한이 BSD에서 허용하더라도 파일을 강제로 업데이트하는 데 사용됩니다. V10에는 없지만 v9에는 freebsd.org/cgi/… (적어도 FreeBSD).
Runium

@sukminder 에이스, 감사합니다! 답변에 귀하의 정보를 추가하겠습니다.
Chris Down

12

--help 출력 또는 맨 페이지에 "옵션 X가 무시 됨"이 표시 될 때마다 프로그램 옵션 X를 수락 합니다. 구문 오류는 발생하지 않지만 아무런 영향을 미치지 않습니다. 프로그램은 옵션이 없을 때와 똑같은 작업을 수행합니다.

다른 답변에서 알 수 있듯이 이전 버전과의 호환성을 위해 수행됩니다. 옵션 사용 이했던 어떤 어떤 효과가 더 이상 유용하지 않으며, 옵션에 관계없이 같은 일을하고있는 것은 바로 호환성 동작입니다.


0

역사적인 소스 코드 의 주석 22를 볼 때 :

  22   -f                     (ignored)\n\

Jim Meyering이 처음 릴리스 한 이후 -f 옵션은 무시되었습니다.

그리고 옵션을 처리하기위한 switch 문은 아무것도하지 않는 명백한 경우 (150/151 행)를 가지고 있습니다.

 150         case 'f':
 151           break;

1992 년 이래로이 옵션을 무시한 동기는 다음과 같습니다. -f 옵션이 필요하고 그렇지 않으면 중단되는 사용 시나리오가 있습니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.