Apa gunanya opsi -f untuk `touch`?

23

Dari man touch:

-f     (ignored)

Tapi saya tidak mengerti apa yang dimaksud dengan diabaikan .

Saya sudah mencoba mengikuti:

$ 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

Dan perhatikan bahwa itu mengubah cap waktu meskipun -f.

Jadi, saya ingin tahu apa -fartinya, atau apa fungsinya.

Pandya
sumber
2
Saya menganggap itu -fsebagai opsi hanya diabaikan. Mungkin hancur melalui argumen parser dan hanya itu.
Thomas
1
(diabaikan) berarti bahwa bendera diabaikan, bukan perintah.
Dana Gugatan Monica

Jawaban:

47

Untuk utilitas GNU, dokumentasi lengkap ada di infohalaman, tempat Anda dapat membaca:

-f
Diabaikan; untuk kompatibilitas dengan versi BSD `touch '.

Lihat halaman manual BSD bersejarah untuk disentuh , di mana -fharus memaksa sentuhan.

Jika Anda melihat sumber BSD lama itu, tidak ada utimes()panggilan sistem, jadi touchakan membuka file dalam mode baca + tulis, baca satu byte, cari kembali dan tulis lagi untuk memperbarui akses terakhir dan waktu modifikasi terakhir .

Jelas, Anda memerlukan izin baca dan tulis ( touchakan menghindari mencoba melakukan itu jika access(W_OK|R_OK)dikembalikan salah ). -fmencoba mengatasinya dengan mengubah sementara izin untuk sementara ke 0666 !

0666 berarti membaca dan menulis izin untuk semua orang. Pasti seperti itu (seperti dengan izin yang lebih ketat seperti 0600 yang masih mengizinkan sentuhan ) yang dapat berarti selama jendela pendek itu, proses yang seharusnya memiliki izin baca atau tulis ke file tidak bisa lagi , melanggar fungsionalitas .

Namun itu berarti bahwa proses yang seharusnya tidak memiliki akses ke file sekarang memiliki peluang pendek untuk membukanya, melanggar keamanan .

Itu bukan hal yang sangat masuk akal untuk dilakukan. touchImplementasi modern tidak melakukan itu. Sejak itu, utime()system call telah diperkenalkan, memungkinkan perubahan modifikasi dan waktu akses secara terpisah tanpa harus berbaur dengan konten file (yang berarti juga berfungsi dengan file non-reguler) dan hanya perlu akses tulis untuk itu.

GNU touchmasih tidak gagal jika melewati -fopsi, tetapi mengabaikan bendera. Dengan begitu, skrip yang ditulis untuk versi BSD lama itu tidak gagal saat diporting ke sistem GNU. Tidak banyak yang relevan saat ini.

Stéphane Chazelas
sumber
3
Menurut developer.apple.com/library/mac/documentation/Darwin/Reference/… -f masih berfungsi di Mac OS X. (Tapi tidak diragukan lagi ada setidaknya 57 cara berbeda untuk melakukan fungsi yang sama "lebih baik," menggunakan GUI! )
alephzero
20
Menggunakan GUI tidak selalu "lebih baik". Inti dari penggunaan skrip adalah mengotomatiskan hal-hal, yang mencakup memastikan skrip Anda berjalan tanpa modifikasi pada sebanyak mungkin dialek unixy, atau setidaknya pada sebagian besar dialek yang mungkin Anda temui, dan ini adalah masalah kompatibilitas yang lama dan usang ini menjadi masalah. .
Guntram Blohm mendukung Monica
@alephzero Itu karena versi di OS X adalah versi BSD, yang dipertahankan GNU.
Barmar
14

-ftidak melakukan apa-apa. Itu disimpan untuk kompatibilitas historis (dengan BSD touchmenurut info touch), sehingga aplikasi yang mengharapkannya tidak lulus dan kembali pesan kesalahan mengatakan itu tidak ada. Dengan asumsi bahwa ini adalah GNU coreutils, Anda dapat melihat di sumbernya bahwa ini hanya melakukan breakkeluar dari saklar pemrosesan opsi tanpa melakukan apa pun.

Sebagai opsi yang diabaikan, -fhadir dari versi pertama dari touchperintah GNU yang ditambahkan pada tahun 1992 ( lihat perbedaan ). Tampaknya, setidaknya di FreeBSD v9, -f"upaya [untuk] memaksa pembaruan, bahkan jika izin file saat ini tidak mengizinkannya" (seperti yang ditemukan oleh Sukminder, terima kasih).

Chris Down
sumber
2
infohalaman mengatakan Diabaikan; untuk kompatibilitas dengan versi BSD `touch '.
heemayl
@ Heemayl Kecuali saya tidak bisa menemukan BSD yang sepertinya dikirim dengan argumen "-f" untuk disentuh, jadi itu pasti sudah cukup tua.
Chris Down
Hmm .. Saya baru saja memeriksa manual Coreutils , yang mengatakan: "Diabaikan; untuk kompatibilitas dengan versi sentuhan BSD."
Pandya
3
-fadalah / digunakan untuk mencoba memaksa pembaruan bahkan jika izin file tidak mengizinkannya pada BSD. Bukan di V10, tetapi v9: freebsd.org/cgi/… (setidaknya dari FreeBSD).
Runium
@sukminder Ace, terima kasih! Saya akan menambahkan informasi Anda ke dalam jawabannya.
Chris Down
12

Setiap kali Anda melihat "opsi X diabaikan" di --help output atau manpage, itu berarti: program menerima opsi X - Anda tidak mendapatkan kesalahan sintaks - tetapi tidak memiliki efek apa pun. Program ini melakukan hal yang sama seperti yang dilakukan jika tidak ada pilihan.

Seperti yang ditunjukkan oleh jawaban lain, ini dilakukan untuk kompatibilitas ke belakang. Opsi yang digunakan memiliki efek, apa pun yang dilakukannya tidak lagi berguna, dan melakukan hal yang sama terlepas dari pilihannya adalah perilaku kompatibilitas yang tepat.

zwol
sumber
0

Saat melihat komentar di kode sumber historis , baris 22:

  22   -f                     (ignored)\n\

opsi -f dimaksudkan untuk diabaikan sejak rilis awal oleh Jim Meyering.

Dan pernyataan beralih untuk menangani opsi memiliki kasus eksplisit (baris 150/151) untuk tidak melakukan apa pun:

 150         case 'f':
 151           break;

Sungguh luar biasa apa yang memotivasi penulis berikut sejak 1992 untuk membiarkan opsi ini diabaikan. Mungkin ada skenario penggunaan yang membutuhkan opsi -f dan jika tidak istirahat?

Kami melihat
sumber