Việc sử dụng tùy chọn -f cho `touch` là gì?


23

Từ man touch:

-f     (ignored)

Nhưng tôi không hiểu những gì có nghĩa là bỏ qua .

Tôi đã thử làm theo:

$ 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

Và nhận thấy rằng nó thay đổi dấu thời gian mặc dù -f.

Vì vậy, tôi muốn biết những gì -fđại diện cho, hoặc những gì nó làm.


2
Tôi giả sử rằng -ftùy chọn chỉ là bỏ qua. Có thể đọc qua trình phân tích cú pháp đối số và đó là nó.
Thomas

1
(bỏ qua) có nghĩa là cờ bị bỏ qua, không phải lệnh.
Vụ kiện của Quỹ Monica

Câu trả lời:


47

Đối với các tiện ích GNU, tài liệu đầy đủ có trong infotrang, nơi bạn có thể đọc:

-f
Làm ngơ; để tương thích với các phiên bản BSD của 'touch'.

Xem các trang người đàn ông BSD lịch sử để liên lạc , nơi -fđể buộc liên lạc.

Nếu bạn nhìn vào nguồn của các BSD cũ đó, không có utimes()cuộc gọi hệ thống, vì vậy touchsẽ mở tệp ở chế độ đọc + ghi, đọc một byte, tìm lại và viết lại để cập nhật lần truy cập cuối cùng và thời gian sửa đổi lần cuối .

Rõ ràng, bạn cần cả quyền đọcghi ( touchsẽ tránh cố gắng làm điều đó nếu bị access(W_OK|R_OK)trả về sai ). -fđã cố gắng khắc phục điều đó bằng cách tạm thời thay đổi các quyền tạm thời thành 0666 !

0666 có nghĩa là đọc và viết cho phép mọi người. Nó phải là như vậy (như với một sự cho phép hạn chế hơn như 0600 vẫn có thể cho phép chạm ) có thể có nghĩa là trong cửa sổ ngắn đó, các quy trình có thể đọc hoặc ghi quyền vào tệp không thể nữa , phá vỡ chức năng .

Tuy nhiên, điều đó có nghĩa là các quy trình không có quyền truy cập vào tệp bây giờ có cơ hội ngắn để mở tệp, phá vỡ bảo mật .

Đó không phải là một điều rất hợp lý để làm. touchTriển khai hiện đại không làm điều đó. Kể từ đó, utime()cuộc gọi hệ thống đã được giới thiệu, cho phép thay đổi thời gian sửa đổi và truy cập riêng biệt mà không phải trộn lẫn với nội dung của các tệp (có nghĩa là nó cũng hoạt động với các tệp không thường xuyên) và chỉ cần truy cập ghi cho điều đó.

GNU touchvẫn không thất bại nếu thông qua -ftùy chọn, mà chỉ bỏ qua cờ. Theo cách đó, các tập lệnh được viết cho các phiên bản BSD cũ đó không bị lỗi khi được chuyển sang các hệ thống GNU. Ngày nay không có nhiều liên quan.


3
Theo developer.apple.com/l -f Library / mac / document / Darwin / Reference / W vẫn hoạt động trong Mac OS X. (Nhưng không nghi ngờ gì, có ít nhất 57 cách khác nhau để thực hiện cùng một chức năng "tốt hơn", sử dụng GUI! )
alephzero 20/03/2016

20
Sử dụng GUI không nhất thiết phải "tốt hơn". Điểm quan trọng của việc sử dụng tập lệnh là tự động hóa nội dung, bao gồm việc đảm bảo tập lệnh của bạn chạy không được sửa đổi trên càng nhiều phương ngữ không thể trộn lẫn, hoặc ít nhất là trên hầu hết các phương ngữ mà bạn có thể gặp phải, và đây là vấn đề tương thích cũ, không được chấp nhận .
Guntram Blohm hỗ trợ Monica

@alephzero Đó là vì phiên bản trong OS X là phiên bản BSD mà GNU đang duy trì khả năng tương thích.
Barmar

14

-fKhông lam gi cả. Nó được giữ cho khả năng tương thích lịch sử (với BSD touchtheo info touch), để các ứng dụng mong đợi nó tồn tại không vượt qua nó và nhận lại thông báo lỗi nói rằng nó không tồn tại. Giả sử rằng đây là GNU coreutils, bạn có thể thấy trong nguồn rằng điều này chỉ thực hiện một breakcông tắc xử lý tùy chọn mà không làm gì cả.

Là một tùy chọn bị bỏ qua, -fcó mặt từ phiên bản đầu tiên của touchlệnh GNU được thêm vào năm 1992 ( xem khác biệt ). Dường như, ít nhất là trong FreeBSD v9, -f"cố gắng bắt buộc cập nhật, ngay cả khi quyền truy cập tệp hiện không cho phép" (như được tìm thấy bởi Sukminder, cảm ơn).


2
infotrang nói Bỏ qua; để tương thích với các phiên bản BSD của 'touch'.
heemayl

@heemayl Ngoại trừ tôi không thể tìm thấy một BSD dường như xuất hiện với một đối số "-f" để chạm vào, vì vậy nó phải khá cũ.
Chris Down

Hmm .. Tôi vừa kiểm tra hướng dẫn sử dụng Coreutils , có nội dung: "Bỏ qua; để tương thích với các phiên bản cảm ứng BSD."
Pandya

3
-flà / đã được sử dụng để cố gắng cập nhật ngay cả khi quyền truy cập tệp đã cho phép trên BSD. Không phải trong V10, mà là v9: freebsd.org/cgi/, (của FreeBSD ít nhất).
Runium

@sukminder Ace, cảm ơn! Tôi sẽ thêm thông tin của bạn vào câu trả lời.
Chris Down

12

Bất cứ khi nào bạn thấy "tùy chọn X bị bỏ qua" trong - đầu ra trợ giúp hoặc trang chủ, điều đó có nghĩa là: chương trình chấp nhận tùy chọn X - bạn không gặp lỗi cú pháp - nhưng nó không có bất kỳ ảnh hưởng nào. Chương trình thực hiện điều tương tự mà nó đã làm trong trường hợp không có tùy chọn.

Như các câu trả lời khác chứng minh, điều này được thực hiện để tương thích ngược. Một tùy chọn được sử dụng để có một số hiệu ứng, bất cứ điều gì nó đã làm không còn hữu ích nữa và thực hiện điều tương tự bất kể tùy chọn đó là hành vi tương thích đúng.


0

Khi xem nhận xét trong mã nguồn lịch sử , dòng 22:

  22   -f                     (ignored)\n\

tùy chọn -f đã được dự định bỏ qua kể từ khi Jim Meyering phát hành lần đầu.

Và câu lệnh chuyển đổi để xử lý các tùy chọn có trường hợp rõ ràng (dòng 150/151) không làm gì:

 150         case 'f':
 151           break;

Điều đáng chú ý là những gì thúc đẩy các tác giả sau đây kể từ năm 1992 để giữ cho tùy chọn này bị bỏ qua. Có lẽ có một kịch bản sử dụng đòi hỏi tùy chọn -f và nếu không thì phá vỡ?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.