Mengapa sentuh membuat file baru?

13

Saya sadar bahwa touchperintah itu digunakan untuk memperbarui tanggal modifikasi terakhir pada file. Ini juga digunakan untuk membuat file baru jika file yang diminta tidak ada pada sistem file.

Karena sentuh (sesuai namanya), haruskah hanya memperbarui tanggal mod terakhir, mengapa juga mencoba membuat file baru?

Apakah ini hanya cek yang ditulis dalam kode sentuhan, atau apakah itu sesuatu yang menyebabkan file dibuat?

Alex McCourt
sumber
Sebagai kasus penggunaan, saya menggunakan touch /forcefsckuntuk membuat file kosong yang dipanggil /forcefsckuntuk memaksa sistem file untuk diperiksa kesalahan pada reboot berikutnya. File itu sendiri tidak perlu mengandung apa pun, hanya perlu ada. Tanpa touch, saya harus menggunakan viatau nanomenyimpan file kosong. Jauh lebih cepat digunakan touch.
Tim
@Tim. Tidak ada alasan nyata Anda tidak dapat menggunakan >/forcefsckatau printf '' >>/forcefsck(yang terakhir akan mempertahankan konten yang ada) Apa yang Anda gambarkan adalah cara untuk menggunakan utilitas yang bekerja dengan cara tertentu, tetapi itu tidak memiliki pengaruh nyata mengapa itu ditulis untuk bekerja seperti itu.
CVn
Jika pertanyaan ini tentang desain touchdaripada bagaimana cara kerjanya, saya pikir touchmelanggar Prinsip Tanggung Jawab Tunggal dengan efek samping pembuatan file. Oleh karena itu, "mengapa" hanya karena pilihan desain awal yang macet karena popularitas dan prevalensi / kemudahan penggunaan.
George Pantazes

Jawaban:

15

Menggunakan strace touch thasil:

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

Ini dalam touchkode dan saya tidak akan menyebutnya cek sekalipun. Cap waktu diperbarui dengan membuka file untuk ditulis dan kemudian menutupnya.

VaTo
sumber
14

touchmembuat file kosong baru jika file itu tidak ada karena itu yang dirancang untuk dilakukan. Utilitas harus berisi kode untuk menangani kasus itu secara khusus. Utilitas muncul di Unix V7 ; -nya pengguna menggambarkannya demikian:

sentuh - tanggal pembaruan terakhir dimodifikasi dari suatu file

touchmencoba mengatur tanggal yang dimodifikasi dari setiap file . Ini dilakukan dengan membaca karakter dari file dan menuliskannya kembali. Jika file ** * tidak ada, upaya akan dilakukan untuk membuatnya kecuali -copsi tersebut ditentukan.

(Saya tidak tahu apa yang touchterjadi jika file itu kosong. Panggilan sistem yang mendasarinya datang kemudian.)

Saya tidak tahu pasti mengapa touchdirancang untuk membuat file itu ada, tetapi saya menduga itu karena make. Mengapa Anda ingin mengatur waktu modifikasi file ke waktu saat ini? Ada kasus di mana itu bisa berguna untuk mengatur waktu modifikasi ke waktu tertentu, tetapi kemampuan itu datang kemudian, yang asli touchhanya bisa mengatur waktu modifikasi ke waktu saat ini. Alasan untuk melakukan itu adalah untuk menjalankan kembali amake aturan yang bergantung pada file.

Artinya, misalkan Anda memiliki file foo, dan makefile yang menyatakan perintah untuk menghasilkan bardari foo. Saat Anda mengetik make bar, perintah dijalankan dan bardibuat. Jika barada dan lebih baru daripada foo, make bartidak melakukan apa-apa, karena makemenganggap bahwa barsudah dibuat. Namun, jika barlebih tua dari foo, buat berpikir itubar tidak mutakhir dan perlu diperbarui.

Tetapi bagaimana jika aturan untuk menghasilkan bartelah berubah? Maka Anda memiliki dua opsi:

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

Anda harus fooada untuk menghasilkanbar , jika tidak perintah biasanya tidak akan berfungsi.

Terminologi "sentuh" ​​juga ada dalam makeutilitas: make -t barhanya akan berpura-pura menjalankan perintah, yaitu, itu akan mengatur waktu modifikasi barke waktu saat ini tanpa benar-benar menjalankan perintah untuk menghasilkan bar(Anda akan melakukan ini jika Anda berpikir bahwa perubahan yang fooseharusnya tidak mempengaruhi bar). The touchutilitas karena itu versi standalone dari make -tfitur.

Gilles 'SANGAT berhenti menjadi jahat'
sumber