Mengapa mkdir tidak memiliki flag -p yang ditetapkan secara default untuk memungkinkan pembuatan direktori bersarang?


11

Saya tidak melihat alasan mengapa -pbendera aktif mkdirtidak boleh diatur secara default.

  -p, --parents     no error if existing, make parent directories as needed

Itu adalah perintah yang tidak merusak dari apa yang bisa saya lihat. Apakah saya melewatkan sesuatu yang penting tentang cara kerjanya?

Kedua, apakah ada cara mudah untuk mendapatkan ini menjadi perilaku default mkdir?


2
menempatkan ini di .bashrc: alias mkdir="mkdir -p".
Kevin

Setelah semua diskusi saya telah memutuskan untuk pergi dengan aliasmkdp
Treffynnon

Jawaban:


6

Ini adalah fitur opsional, yang tidak selalu diinginkan - terutama dalam skrip. Pertimbangkan kekurangan berikut dalam kasus skrip:

  • Fakta bahwa direktori sudah ada tidak dilaporkan: Jika sebuah skrip seharusnya meletakkan beberapa file dalam direktori yang baru dibuat dan direktori tersebut sudah ada dan berisi file, skrip tersebut dapat membuat banyak kekacauan. (Akan sulit untuk kemudian memfilter file yang ditempatkan di sana oleh skrip.)
  • Di sisi lain dari di atas, beberapa skrip (atau bagian dari itu) mungkin bergantung pada struktur direktori yang dibuat sebelumnya (mungkin oleh paket / skrip lain). Misalnya, skrip instalasi paket mungkin perlu meletakkan pustaka di subdir /usr/local/lib/GreatSoftware/ImportantPartOfIt, tetapi pustaka bergantung pada / tautan ke hal-hal di bawah /usr/local/lib/GreatSoftware. Jika ini tidak ada, skrip tidak boleh dilanjutkan.

Perilaku generik mkdirmembuatnya mudah dan alami, seperti situasi yang dilaporkan dan dapat langsung ditangkap.


Anda dapat membuat alias untuk itu jika Anda ingin selalu menggunakan mkdir -pshell:

alias mkdir='mkdir -p'

(Ini harus pergi ke .bashrckonfigurasi Anda atau apa pun yang digunakan shell Anda.)


1
Saya tidak akan menyarankan alias perintah standar untuk membuatnya berperilaku cara non standar. Itu akan membuat skrip menjadi non portable dan dapat membingungkan pembaca. Membuat alias atau fungsi baru, seperti alias mkdp="mkdir -p"akan lebih disarankan.
jlliagre

2
@ jlliagre Tidak, ini tidak akan memengaruhi skrip. Alias ​​yang didefinisikan secara lokal di .bashrctidak (biasanya) mempengaruhi lingkungannya.
rozcietrzewiacz

Memang tetapi Anda melewatkan poin saya. Mengabaikan perintah standar untuk mengubah perilakunya, bahkan untuk penggunaan Anda sendiri, bukanlah praktik yang disarankan. Contoh terburuk adalah di mana-mana alias rm='rm -i'.
jlliagre

1
@ jlliagre Tidak direkomendasikan oleh siapa? ;) Tapi ya, saya setuju, saya sendiri lebih suka menggunakan alias yang berbeda - tetapi untuk alasan praktis, bukan ideologis. Saya juga tidak berpikir rm -ialias selalu buruk - meskipun mungkin mengarah pada kebiasaan buruk. Tentu saja tidak semua alias perintah sama baiknya / buruk - pertimbangkan ls="ls --color=auto"atau ssh="TERM=xterm ssh"misalnya.
rozcietrzewiacz

Tidak ada ideologis dalam rekomendasi saya. Alias ​​rm secara tidak langsung bertanggung jawab atas banyak file yang hilang (saya telah bertemu banyak korban alias ini). Saya mencurigai mkdir memiliki efek samping yang tidak diinginkan. Tentu saja, saya tidak menentang perubahan kosmetik, perilaku, seperti contoh ssh dan ls Anda.
jlliagre

16

Tentu saja orang dapat berargumen bahwa pembuatan direktori induk harus menjadi default dan beberapa opsi cek dapat digunakan untuk mencegah pembuatan direktori jika induknya tidak ada.

Tetapi alasan mengapa sebaliknya adalah hanya sejarah. Versi dasar mkdir tidak membuat direktori induk. Inilah sebabnya mengapa distribusi X11 datang bersama dengan perintah bernama mkdirhier yang dapat memenuhi tugas ini: periksa apakah direktori induk ada dan buat jika diperlukan.

Kemudian fungsi ini ditambahkan ke perintah mkdir pada banyak versi UNIX (saya tidak tahu apakah itu dalam standar POSIX saat ini). Untuk menjaga kompatibilitas fitur ini dibuat tersedia dengan menyalakan bendera pilihan: -p.

Mengapa buruk untuk mengaktifkannya secara default? Skrip mungkin bergantung pada mkdir gagal jika direktori induk tidak ada. Terutama sebagai root pengguna bisa berbahaya untuk membuat pohon direktori secara default.

Contoh:

 if mkdir /backup/$(uname -n)/$(date +%Y%m%d)
  then
    perform_backup ...

Dalam contoh ini direktori akan dibuat dan cadangan dilakukan meskipun sistem file /backuptidak di-mount dan induknya /backup/$(uname -n)tidak ada jika defaultnya adalah sebaliknya.

Rule of thumb: Merupakan praktik yang baik untuk tidak mengubah perilaku default alat apa pun. Jika diinginkan, berikan opsi untuk memungkinkan perubahan perilaku default.


2
Saya suka contoh mount yang telah Anda gunakan di sini. Saya belum memikirkan skenario khusus itu.
Treffynnon

1
Opsi -p (dan -m) diperkenalkan oleh System V pada tahun 1983. Keduanya jelas merupakan bagian dari standar POSIX.
jlliagre

4

Saya pikir, ini agak filosofi. Perintah bare mkdir (1) (tanpa opsi) mewakili panggilan sistem mkdir (2) , menyediakan fungsionalitasnya dalam shell, tidak melakukan apa pun lebih atau kurang.


4

Pada awalnya , hanya ada mkdirperintah kosong . Sesuai dengan prinsip-prinsip desain Unix, perintah sederhana ini melakukan satu tugas sederhana: membuat direktori.

Kemudian, mkdirmemperoleh -popsi untuk menangani kasus penggunaan umum di mana penelepon ingin membuat nol, satu atau lebih direktori untuk memastikan bahwa ada jalur tertentu. Ini bukan operasi default karena beberapa alasan. Pertama, tidak semua sistem memiliki fitur yang lebih kompleks ini, dan memerlukan -popsi berarti bahwa skrip yang menggunakannya akan mendapatkan pesan kesalahan yang masuk akal (seperti mkdir: invalid option -z) daripada anehnya gagal membuat direktori sesekali. Kedua, dan yang paling penting, perilaku mkdir -pbukan pengganti yang kompatibel mkdirdalam semua kasus.

Secara khusus, pada sebagian besar sistem file, mkdiradalah operasi atom . Jika suatu program berjalan mkdir playgrounddan perintah berhasil, program tersebut tahu bahwa ia menciptakan playgrounddirektori. Ini memungkinkan program untuk memperlakukan direktori baru sebagai taman bermain eksklusif: jika instance lain dari program yang sama berjalan bersamaan, panggilannya ke mkdir playgroundakan gagal. Properti ini jelas tidak disediakan oleh mkdir -pkarena memungkinkan adanya argumen.

Jika mkdir -psudah ada sejak awal, itu bisa menjadi mode default, dengan sesuatu seperti mkdir -auntuk perintah pembuatan direktori tunggal. Tapi itu tidak akan mengikuti filosofi desain Unix yang biasa: sebagian besar utilitas dasar adalah pembungkus sederhana di sekitar primitif yang mendasarinya, dengan perilaku yang lebih menarik (seperti membuat beberapa direktori sekaligus) yang memerlukan opsi mewah.


2

Bagi saya, masalahnya adalah bahwa perilaku opsi -p jika itu pada dasarnya adalah efek samping. Itu menambah kompleksitas suatu perintah dengan melakukan sesuatu tambahan untuk apa yang Anda minta. Satu hal lagi yang tidak terlihat harus diingat. Salah satu aturan dasar praktik pemrograman suara adalah untuk menghindari efek samping.

Bahasa pemrograman modern sangat kuat sehingga relatif mudah untuk membangun perintah rumit apa pun yang Anda butuhkan dari primitif yang disediakan oleh bahasa. Melakukan hal itu melibatkan membuat keputusan sadar tentang perilaku apa yang diperlukan dan juga meninggalkan catatan nyata dan konkret tentang apa yang telah dilakukan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.