Tại sao cảm ứng tạo tập tin mới?


13

Tôi biết rằng touchlệnh được sử dụng để cập nhật ngày sửa đổi cuối cùng trên một tệp. Nó cũng được sử dụng để tạo một tệp mới nếu tệp được yêu cầu không tồn tại trên hệ thống tệp.

Vì cảm ứng (như tên của nó ngụ ý), nên chỉ cập nhật ngày mod cuối cùng, tại sao nó cũng cố gắng tạo một tệp mới?

Đây chỉ là một tấm séc được viết bằng mã cảm ứng, hay nó là thứ gì đó khiến tập tin được tạo ra?


Trong trường hợp sử dụng, tôi sử dụng touch /forcefsckđể tạo một tệp trống được gọi /forcefsckđể buộc các hệ thống tệp được kiểm tra lỗi trong lần khởi động lại tiếp theo. Các tập tin không cần phải chứa bất cứ điều gì, nó chỉ cần tồn tại. Nếu không touch, tôi cần sử dụng vihoặc nanolưu một tập tin trống. Nhanh hơn nhiều để sử dụng touch.
Tim

@Tim Không có lý do thực sự nào bạn không thể sử dụng >/forcefsckhoặc printf '' >>/forcefsck(sau này sẽ lưu giữ mọi nội dung hiện có). Những gì bạn mô tả là một cách để sử dụng một tiện ích hoạt động theo một cách nhất định, nhưng điều đó không có ý nghĩa thực sự về lý do tại sao nó được viết để hoạt động theo cách đó.
một CVn

Nếu câu hỏi này là về thiết kế touchthay vì cách nó hoạt động, tôi nghĩ touchvi phạm Nguyên tắc Trách nhiệm duy nhất với hiệu ứng phụ tạo tệp. Do đó, "tại sao" chỉ đơn giản là do các lựa chọn thiết kế ban đầu bị kẹt do tính phổ biến và mức độ phổ biến / dễ sử dụng.
George Pantazes

Câu trả lời:


15

Sử dụng strace touch tsản lượng:

open("t", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

Đó là touchmã của và tôi sẽ không gọi nó là kiểm tra . Dấu thời gian được cập nhật bằng cách mở tệp để ghi và sau đó chỉ cần đóng tệp.


14

touchtạo một tệp mới, trống nếu tệp không tồn tại vì đó là những gì nó được thiết kế để làm. Tiện ích phải chứa mã để xử lý trường hợp đó một cách cụ thể. Tiện ích xuất hiện trong Unix V7 ; hướng dẫn sử dụng của nó mô tả nó như vậy:

chạm - ngày cập nhật sửa đổi lần cuối của một tập tin

touchcố gắng đặt ngày sửa đổi của mỗi tệp . Điều này được thực hiện bằng cách đọc một ký tự từ tệp và viết lại. Nếu tệp ** không tồn tại, một nỗ lực sẽ được thực hiện để tạo tệp trừ khi -ctùy chọn được chỉ định.

(Tôi không biết touchđã làm gì nếu tệp trống. Cuộc gọi hệ thống cơ bản đến sau.)

Tôi không biết tại sao touchđược thiết kế để làm cho tập tin tồn tại, nhưng tôi nghi ngờ đó là vì make. Tại sao bạn muốn đặt thời gian sửa đổi của tệp thành thời gian hiện tại? Có những trường hợp có thể hữu ích để đặt thời gian sửa đổi thành một thời gian cụ thể, nhưng khả năng đó đến sau, bản gốc touchchỉ có thể đặt thời gian sửa đổi thành thời gian hiện tại. Một lý do để làm điều đó là để chạy lại một makequy tắc phụ thuộc vào tệp.

Đó là, giả sử bạn có một tệp foovà tệp thực hiện khai báo một lệnh để tạo bartừ đó foo. Khi bạn gõ make bar, lệnh được thực thi và barđược tạo. Nếu bartồn tại và mới hơn foo, make barkhông có gì, bởi vì makegiả sử barđã được tạo. Tuy nhiên, nếu barcũ hơn foo, hãy nghĩ rằng barnó không cập nhật và cần được tái tạo.

Nhưng nếu các quy tắc để tạo ra barđã thay đổi thì sao? Sau đó, bạn có hai lựa chọn:

  • rm bar; make bar
  • touch foo; make bar

Bạn sẽ cần footồn tại để tạo bar, nếu không lệnh thường không hoạt động.

Thuật ngữ của Touch touch cũng có mặt trong maketiện ích: make -t barsẽ chỉ giả vờ chạy các lệnh, nghĩa là nó sẽ đặt thời gian sửa đổi cho thời điểm barhiện tại mà không thực sự chạy lệnh để tạo bar(bạn sẽ làm điều này nếu bạn nghĩ rằng những thay đổi fookhông nên ảnh hưởng bar). Các touchvì vậy tiện ích là một phiên bản độc lập của make -ttính năng.

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.