Mengapa sort -o bermanfaat?

32

Filsafat UNIX mengatakan: lakukan satu hal dan lakukan dengan baik. Buat program yang menangani teks, karena itu adalah antarmuka universal.

The sortperintah, setidaknya GNU semacam, memiliki -opilihan untuk output ke file bukan stdout. Mengapa, katakanlah, sort foobar -o whateverberguna ketika saya bisa saja sort foobar > whatever?

strugee
sumber
3
GNU bukan UNIX. Dalam banyak aspek itu berbeda, misalnya argumen verbose (--help, dll.).
sakisk
@faif ya itu benar . tetapi saya berpendapat bahwa itu bukan jawaban untuk pertanyaan khusus ini.
strugee
2
Itu sebabnya saya meninggalkannya sebagai komentar dan bukan jawaban :)
sakisk

Jawaban:

47

Bukan hanya jenis GNU yang memilikinya. BSD sort memilikinya juga. Dan mengapa?
(Saya pikir itu juga pertanyaan yang bagus ...)

Dari halaman manual: "Argumen yang diberikan adalah nama file output yang akan digunakan alih-alih output standar. File ini bisa sama dengan salah satu file input."

Anda tidak dapat pergi ke file yang sama dengan redirection, redirection output menghapus file.

Untuk lebih memperjelas, jika saya ingin menyortir file dan meletakkan hasil yang diurutkan di tempat yang sama saya mungkin berpikir untuk mencoba sort < foo > foo. Kecuali redirection output memotong file foodalam persiapan untuk menerima output. Dan kemudian tidak ada yang disortir. Tanpa "-o" cara untuk melakukannya adalah sort < foo > bar ; mv bar foo. Saya menganggap -oopsi melakukan sesuatu yang serupa tanpa membuat Anda harus khawatir tentang hal itu.

kurtm
sumber
12
Anda juga dapat sudo sort -o /some/placemengetahui bahwa pengguna non-privleged Anda tidak memiliki izin untuk menulis.
bahamat
8
Dan untuk membantu menghindari kebingungan dengan komentar bahamat: Dia tidak mengatakan bahwa mereka dapat mengurutkan file yang tidak mereka miliki izinnya. Pengalihan I / O berfungsi ... buruk dengan sudo. Karena pengalihan terjadi di shell Anda (sudo hanyalah sebuah perintah yang akan dijalankan), menggunakan pengalihan dengan perintah melalui sudo itu mengganggu. (Awalnya saya bingung apa yang dikatakan bahamat, jadi kupikir orang lain juga mungkin bingung).
kurtm
3
Hanya untuk bermain advokat iblis, sebenarnya ada alternatif untuk kedua "file input sama dengan masalah file output" dan "redirection istimewa" masalah, dan kedua alternatif lebih dalam semangat "melakukan satu hal dengan baik". Untuk "input = output", ada sponge(bagian dari moreutils). Untuk pengalihan hak istimewa ada perpipaan | sudo tee, yang juga memiliki manfaat membatasi eskalasi hak istimewa untuk satu program sederhana tee,.
jw013
Poin bagus. Meskipun -oopsi sortada jauh sebelum spons melakukannya. Setidaknya setua 4.4-lite2 (yang merupakan awal sejarah OpenBSD CVS). Dan untuk kasus di mana Anda beroperasi pada file non-istimewa dan menulis ke daerah istimewa, | sudo teebekerja dengan baik, tetapi untuk sebagian besar waktu, Anda ingin semuanya menjadi istimewa, dan membuat sudoAnda tersandung. Dan sudo grep file | sudo teeitu konyol.
kurtm
1
sortperlu membaca seluruh input sebelum dapat mulai mengeluarkan apa pun, itu sebabnya ia dapat dengan aman menimpa inputnya. Ini dapat menyimpan data dalam memori atau dalam file sementara sebelum mulai menghasilkan.
Stéphane Chazelas
12

The '-o' pilihan sudah di dalam sortdari Edisi Keenam Unix

Namun saya setuju dengan Anda bahwa itu tidak ada dalam filosofi Unix. uniqtidak memiliki opsi itu (dan sorttidak memiliki -uitu).

Pada PDP-11 saya, saya menggunakan program kecil yang akan mengambil satu parameter:

renac whatever

Jika whateversudah ada, itu akan menulis semuanya dari stdin ke file sementara, yang hanya diubah namanya whateversetelah input stdin mengering. Dengan cara itu Anda bisa menyalurkan output dari perintah apa pun ke renacalih-alih mengarahkan ulang ke nama file tanpa kemungkinan menimpa input. Memecahkan masalah penulisan ulang dengan cara itu adalah IMHO lebih sesuai dengan filosofi Unix.

Beberapa tambahan selanjutnya untuk program ini adalah: tidak menimpa file keluaran jika tidak ada yang tiba pada stdin (misalnya hasil salah ketik bagian dari commandline), dan memungkinkan opsi untuk menambahkan stdin ke file yang disebutkan.

Ini adalah salah satu yang pertama (jika bukan yang pertama) program C nyata yang saya buat (untuk pekerjaan saya, saya sebagian besar dikembangkan di Pascal pada sistem itu).

Anthon
sumber
Jika saya mengerti dengan baik, aptorang-orang GNU / Linux yang beraroma dapat memiliki versi fungsionalitas yang ditulis ulang yang renacdisediakan, dengan sebuah program yang disebut sponge(dari man: menyerap input standar dan menulis ke file ), package moreutils`.
41754
@upgo. Saya baru saja melihat sumber sponge.c dan tampaknya memiliki banyak overhead kode karena fungsionalitas sponging (stdin -> stdout).
Anthon
@uprego tidak spongejuga moreutilsdibuat oleh GNU.
jw013
Saya tidak bermaksud menegaskan hal itu.
41754