Saya tidak mengetahui penghargaan itu sampai hari ini ketika beberapa pemula mencoba untuk menempelkan UUOC pada saya untuk salah satu jawaban saya. Itu adalah cat file.txt | grep foo | cut ... | cut ...
. Saya memberinya sedikit pikiran, dan hanya setelah itu mengunjungi tautan dia memberi saya merujuk pada asal-usul penghargaan dan praktik melakukannya. Pencarian lebih lanjut membawa saya ke pertanyaan ini. Sayangnya, meski dengan pertimbangan sadar, tidak ada jawaban yang termasuk alasan saya.
Saya tidak bermaksud bersikap defensif ketika mendidiknya. Setelah semua, di tahun-tahun muda saya, saya akan menulis perintah karena grep foo file.txt | cut ... | cut ...
karena setiap kali Anda melakukan single grep
Anda belajar penempatan argumen file dan siap pengetahuan bahwa yang pertama adalah pola dan yang kemudian adalah nama file.
Itu adalah pilihan sadar ketika saya menjawab pertanyaan dengan cat
awalan sebagian karena alasan "selera yang baik" (dalam kata-kata Linus Torvalds) tetapi terutama karena alasan fungsi yang meyakinkan.
Alasan terakhir lebih penting sehingga saya akan memadamkannya terlebih dahulu. Ketika saya menawarkan pipa sebagai solusi saya berharap itu dapat digunakan kembali. Sangat mungkin bahwa pipa akan ditambahkan pada akhir atau disambungkan ke pipa lain. Dalam hal ini memiliki argumen file untuk menangkap kembali usabilitas, dan sangat mungkin melakukannya diam - diam tanpa pesan kesalahan jika argumen file ada. Saya. E. grep foo xyz | grep bar xyz | wc
akan memberi Anda berapa banyak baris dalam xyz
berisi bar
saat Anda mengharapkan jumlah baris yang mengandung keduanya foo
dan bar
. Harus mengubah argumen ke perintah dalam pipa sebelum menggunakannya cenderung mengalami kesalahan. Tambahkan ke dalamnya kemungkinan kegagalan diam dan itu menjadi praktik yang sangat berbahaya.
Alasan sebelumnya juga tidak penting karena banyak "selera yang baik" semata-mata adalah alasan bawah sadar yang intuitif untuk hal-hal seperti kegagalan diam di atas yang tidak dapat Anda pikirkan tepat pada saat ketika seseorang yang membutuhkan pendidikan mengatakan "tetapi tidak kucing itu tidak berguna ".
Namun, saya akan mencoba juga membuat sadar alasan "selera baik" yang saya sebutkan sebelumnya. Alasan itu berkaitan dengan semangat desain ortogonal Unix. grep
tidak cut
dan ls
tidak grep
. Karena itu paling grep foo file1 file2 file3
tidak bertentangan dengan semangat desain. Cara ortogonal untuk melakukannya adalah cat file1 file2 file3 | grep foo
. Sekarang, grep foo file1
ini hanyalah kasus khusus grep foo file1 file2 file3
, dan jika Anda tidak memperlakukannya sama, Anda setidaknya menggunakan siklus jam otak untuk menghindari penghargaan kucing yang tidak berguna.
Itu membawa kita ke argumen yang grep foo file1 file2 file3
menyatukan, dan cat
menyatukan jadi itu pantas untuk cat file1 file2 file3
tetapi karena cat
tidak menyatukan dalam cat file1 | grep foo
karena itu kita melanggar semangat baik cat
Unix dan Mahakuasa. Nah, jika itu yang terjadi maka Unix akan membutuhkan perintah yang berbeda untuk membaca output dari satu file dan meludahkannya ke stdout (bukan paginate atau apa pun hanya meludah murni untuk stdout). Jadi Anda akan memiliki situasi di mana Anda mengatakan cat file1 file2
atau Anda katakan dog file1
dan dengan sadar ingat untuk menghindari cat file1
untuk menghindari mendapatkan penghargaan, sementara juga menghindari dog file1 file2
karena semoga desain dog
akan melempar kesalahan jika beberapa file ditentukan.
Mudah-mudahan pada titik ini Anda bersimpati dengan desainer Unix untuk tidak memasukkan perintah terpisah untuk meludah file ke stdout, sementara juga penamaan cat
untuk concatenate daripada memberinya beberapa nama lain. <edit>
ada anjing seperti itu, <
operator yang malang . Sangat disayangkan penempatannya di ujung pipa mencegah kompabilitas yang mudah. Tidak ada cara yang bersih secara sintaksis atau estetis untuk menempatkannya di awal. Sangat disayangkan tidak cukup umum sehingga Anda mulai dengan anjing tetapi cukup tambahkan nama file lain jika Anda juga ingin diproses setelah yang sebelumnya. (Di >
sisi lain tidak setengah buruk. Ini memiliki penempatan yang hampir sempurna pada akhirnya. Biasanya bukan bagian yang dapat digunakan kembali dari pipa, dan karenanya dibedakan secara simbolis.)</edit>
Pertanyaan selanjutnya adalah mengapa penting untuk memiliki perintah yang hanya meludah file atau gabungan beberapa file untuk stdout, tanpa proses lebih lanjut? Salah satu alasannya adalah untuk menghindari setiap perintah Unix tunggal yang beroperasi pada input standar untuk mengetahui cara mengurai setidaknya satu argumen file baris perintah dan menggunakannya sebagai input jika ada. Alasan kedua adalah untuk menghindari pengguna harus mengingat: (a) ke mana argumen nama file pergi; dan (b) menghindari bug pipa diam seperti yang disebutkan di atas.
Itu membawa kita ke mengapa grep
memang memiliki logika ekstra. Alasannya adalah untuk memungkinkan pengguna-kelancaran untuk perintah yang sering digunakan dan atas dasar yang berdiri sendiri (bukan sebagai saluran pipa). Ini adalah sedikit kompromi ortogonalitas untuk keuntungan yang signifikan dalam kegunaan. Tidak semua perintah harus dirancang dengan cara ini dan perintah yang tidak sering digunakan harus sepenuhnya menghindari logika ekstra argumen file (ingat logika tambahan mengarah pada kerapuhan yang tidak perlu (kemungkinan bug)). Pengecualian adalah untuk memungkinkan argumen file seperti dalam kasus grep
. (Omong-omong, catatan yang ls
memiliki alasan yang sangat berbeda untuk tidak hanya menerima tetapi cukup banyak membutuhkan argumen file)
Akhirnya, apa yang bisa dilakukan dengan lebih baik adalah jika perintah yang luar biasa seperti grep
(tetapi tidak harus ls
) menghasilkan kesalahan jika input standar tersedia. Ini masuk akal karena perintah termasuk logika yang melanggar semangat ortogonal Unix yang maha kuasa untuk kenyamanan pengguna. Untuk kenyamanan pengguna lebih lanjut, yaitu untuk mencegah penderitaan yang disebabkan oleh kegagalan diam, perintah tersebut tidak boleh ragu untuk melanggar pelanggaran mereka sendiri dengan memperingatkan pengguna jika ada kemungkinan kegagalan diam.