The GNU Coreutils panduan untukmv
mengatakan:
-f --force Do not prompt the user before removing a destination file.
Namun, ini tampaknya sudah menjadi perilaku default untuk mv
, sehingga -f
opsi tampaknya berlebihan. Misalnya dalam GNU Bash versi 4.3.11:
$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2
Tampaknya tidak mungkin maksud -f
bendera adalah untuk menimpa alias mv="mv -i"
, karena ada beberapa cara standar untuk mengesampingkan alias (misalnya menggunakan \mv
) yang akan melakukan ini lebih ringkas dan dengan cara yang konsisten di seluruh perintah.
Manual mencatat bahwa, "Jika Anda menentukan lebih dari satu opsi -i, -f, -n, hanya yang terakhir yang berlaku," tetapi tampaknya tidak mungkin maksud dari -f
bendera tersebut untuk mengganti -i
bendera secara umum, karena perilaku yang setara dapat dicapai hanya dengan menggunakan mv
, yang jauh lebih ringkas dan mudah dipahami daripada menggunakan mv -if
.
Karena itu, apa tujuan dari -f
bendera? Mengapa itu ada?
mount
, misalnya (meskipun ada contoh yang lebih baik). Apakah Anda benar-benar harus mengingat apa default untuk setiap opsi, sehingga Anda dapat menentukan opsi mana yang perlu Anda atur? HAL YANG BAIK untuk memiliki opsi, baik untuk default maupun non-default, sehingga Anda dapat secara eksplisit mengatur opsi alih-alih perlu secara mental melacak apa defaultnya. Sesuatu di sana lebih mudah diingat daripada sesuatu yang tidak ada .Jawaban:
Penggunaan
-f
lebih jelas dijelaskan di halaman manual dari 4BSD, di mana-f
dan-i
opsi ditambahkan:Definisi yang lebih tepat tentang bagaimana mv beroperasi diberikan dalam standar POSIX , yang menambahkan bahwa
-f
hanya menimpa-i
jika terjadi kemudian di baris perintah.Jadi perilaku default agak berbeda dari
-f
. Standarnya adalah meminta konfirmasi hanya ketika target tidak dapat ditulisi. (Perilaku ini kembali setidaknya sejauh V4 , di manamv
tidak mengambil opsi.) Jika-i
opsi diberikan, mv juga akan meminta konfirmasi setiap kali target ada. The-f
pilihan akan menghambat bertanya dalam kedua kasus tersebut (jika terjadi setelah salah-i
).sumber
-f
flag telah digunakan bahkan jika belum digunakan .isatty(0)
). Juga, meskipun benar bahwa kemudian-f
ditimpa-i
, itu mungkin tidak berarti bahwa ini sama dengan tidak ada argumen yang diberikan.Ini berguna ketika mengatur eksekusi
mv
ke standar waras:Saat Anda ingin memaksakan suatu gerakan, ini akan berhasil:
Karena ini adalah opsi terakhir dalam perintah diperluas yang diperhitungkan:
Poin ini juga disebutkan dalam manual GNU Coreutils .
sumber
alias mv="mv -i"
adalah alasan keberadaan-f
.mv(1)
(dan perintah Unix lainnya) "gila" seperti yang Anda-i
, saya percaya bahwa siapa pun yang telah menggunakan baris perintah selama lebih dari beberapa tahun telah dibakar olehmv
, pada satu titik atau yang lain.Itu ada karena (
man mv
)Jadi, Anda dapat memiliki skrip / alias / fungsi yang selalu meminta, tetapi Anda masih bisa mengganti opsi.
Fungsi / skrip yang berarti akan melakukan sesuatu yang lebih, tentu saja (mis. Mencatat tindakan)
sumber
alias mv="mv -i"
alasan keberadaan-f
. Anda menyebutkan skrip dan fungsi juga. Tolong bisakah Anda memberikan contoh menggunakan dua ini?mv -f
, jadi masih belum jelas bagi saya bagaimana mereka membenarkan / menjelaskan keberadaannya. Maaf jika saya melewatkan yang jelas!mv -i
. Jika Anda ingin menggunakannya tetapi lewati interaksi, Anda akan menggunakanMV -f
dll.mv
tanpa opsi-opsi itu adalah kadang - kadang bertanya (target tidak dapat ditulisi dan terminal interaktif), jadi ini akan menjadi perbedaan yang jelas antaramv -f
dan\mv
.The
mv
perintah pada fungsi dapat sendiri berbeda dengan-f
pilihan, dalam hal itu akan mencoba untuk menimpa dilindungi menulis file tanpa prompt.Karena izin menulis di direktori, user2 dapat menimpa file user1
./dir/
, tetapi akan diperingatkan sebelum melakukannya.-f
mencegah peringatan.sumber
Dalam pemrograman shell, menggunakan -f adalah idiom umum yang digunakan untuk memastikan bahwa perintah Anda tidak dibatalkan dengan kesalahan atau meminta script / pengguna untuk respon interaktif ketika menjalankan perintah tertentu. Hal terakhir yang Anda inginkan adalah skrip Anda berhenti menunggu input pengguna, atau mungkin lebih buruk, untuk perintah yang salah untuk mengambil input dari standar.
Catatan: membatalkan alias dapat menyebabkan / menghilangkan efek samping. Jika Anda telah mengubah perintah ke versi lain atau dengan opsi tambahan, membatalkan alias akan menyebabkan efek samping yang tidak diinginkan. Misalnya, Anda mungkin memiliki pengaturan alias dengan mv dan rm untuk menggunakan recycle can (atau sistem perlindungan / pelacakan lainnya). Membatalkan alias akan merusak ini ...
sumber
-f
Opsi untuk cp atau mv tidak menjamin bahwa "mereka berfungsi". Sebagai contoh jika izin tidak mencukupi, perintah -f tidak akan membuatnya berfungsi. Yang Anda maksud adalah bahwa -f memaksa overwrite tanpa prompt. Bendera yang berlawanan -i berarti membutuhkan interaktif untuk menimpa.isatty(0)
), jadi misalnya jika skrip Anda berjalan sebagai bagian dari pipa itu tidak akan terpicu. 2.) Menambahkan-f
tidak sama dengan membatalkan-i
karenamv -i -f
berbeda darimv
, lihat jawaban Markus .