Sort -o neden faydalıdır?


32

UNIX felsefesi diyor ki: bir şeyi yap ve iyi yap. Metin işleyen programlar yapın, çünkü bu evrensel bir arayüzdür.

En sortazından GNU sıralama komutunun -oyerine bir dosyaya çıkış yapma seçeneği vardır stdout. Söyleyebildiğim sort foobar -o whateverzaman neden faydalı oluyor sort foobar > whatever?


3
GNU, UNIX değil. Birçok yönden farklıdır, örneğin ayrıntılı argümanlar (--help, vb.).
sakisk

@ faif evet bu doğru . ancak bunun bu özel sorunun cevabı olmadığını savunuyorum.
Strugee

2
Bu yüzden bir yorum olarak değil bir cevap olarak
bıraktım

Yanıtlar:


47

Bu sahip olan sadece GNU tür değil. BSD sıralama da var. Ve neden?
(Bunun da iyi bir soru olduğunu düşündüm ...)

Man sayfasından: "Verilen argüman standart çıktı yerine kullanılacak çıktı dosyasının adıdır. Bu dosya girdi dosyalarından biri olabilir."

Yeniden yönlendirmeyle aynı dosyaya gidemezsiniz, çıktı yönlendirmesi dosyayı siler.

Daha açıklığa kavuşturmak için, bir dosyayı sıralamak ve sıralanan sonuçları aynı yere koymak istersem denemeyi düşünebilirim sort < foo > foo. Çıktı yönlendirme dışında, çıktıyı fooalmak için hazırlık sırasında dosyayı keser . Ve sonra sıralayacak bir şey yok. "-O" olmadan bunu yapmanın yolu olurdu sort < foo > bar ; mv bar foo. -oSeçeneğin, endişelenmenize gerek kalmadan benzer şeyler yaptığını varsayıyorum .


12
Ayrıca edebilirsiniz sudo sort -o /some/placesenin olmayan privleged kullanıcı için yazma iznine sahip olmadığı.
bahamat

8
Bahamat'ın yorumuyla karışıklığı önlemek için: İzni olmayan bir dosyayı sıralayabileceklerini söylemiyor. G / Ç yönlendirmesi sudo ile zayıf çalışıyor. Yeniden yönlendirme kabuğunuzda gerçekleştiğinden (sudo yalnızca çalıştırılacak bir komuttur), sudo aracılığıyla bir komutla yönlendirmeyi kullanmak can sıkıcıdır. (Başlangıçta Bahamat'ın ne dediği konusunda kafam karıştı, bu yüzden başkalarının da kafasının karışabileceğini düşündüm).
kurtm

3
Sadece şeytanın savunucusunu oynamak için aslında hem "girdi dosyası çıktı dosyasıyla aynı" sorun hem de "ayrıcalıklı yeniden yönlendirme" sorununa alternatifler var ve her iki alternatif de "bir şeyi iyi yap" ruhu içinde. "İnput = output" için sponge(daha çok öğenin parçası) var. Ayrıcalıklı yeniden yönlendirme için | sudo teeayrıcalık yükselişini tek bir basit programla sınırlandırma avantajına sahip olan bir boru sistemi vardır tee.
jw013

Güzel nokta. Her ne kadar uzun süre sünger -oseçeneği sortyoktu. En azından 4.4-lite2 kadar eskidir (tarihin OpenBSD CVS'de başladığı yer). Ayrıcalıklı olmayan bir dosyada | sudo teeçalıştığınız ve ayrıcalıklı bir alana yazdığınız bir durum için harika çalışıyor, ancak çoğu zaman, her şeyin ayrıcalıklı olmasını istiyor ve sudosizi gezdiriyorsunuz. Ve sudo grep file | sudo teeaptalca.
kurtm

1
sortBir şey çıkarmaya başlamadan önce tüm girişi okuması gerekir, bu yüzden girişinin üzerine güvenle yazabilir. Çıktıya başlamadan önce verileri bellekte veya geçici dosyalarda saklayabilir.
Stéphane Chazelas

12

'-O' seçeneği zaten sortbir Unix Altıncı Baskı

Bununla birlikte, Unix felsefesinde olmadığını kabul ediyorum. uniqBu seçeneği sortyoktu (ve bir -uzaman yoktu ).

PDP-11'imde bir parametreyi alacak küçük bir program kullandım:

renac whatever

Eğer whateverzaten var, sadece yeniden adlandırıldı geçici bir dosyaya, stdin'i her şeyi yazardı whateverStdin girişi kurudu sonra. Bu şekilde, herhangi bir komutun çıktısını renac, girişin üzerine yazma şansı olmadan dosya adına yönlendirmek yerine yönlendirebilirsiniz. Üzerine yazma problemini bu şekilde çözmek IMHO, Unix felsefesine daha çok uygundur.

Programa daha sonra yapılan bazı eklemeler şunlardı: stdin'e bir şey gelmediyse (örneğin komut satırının yanlış yazılan kısmının bir sonucu) çıktı dosyasının üzerine yazmamak ve bir seçeneğin adlandırılmış dosyaya stdin ekleyebilmesine izin vermek.

Bu yaptığım ilk (ilk değilse) gerçek C programlarından biriydi (işim için çoğunlukla bu sistemde Pascal'da geliştirdim).


İyi anladıysam, aptaromalı GNU / Linux kullanıcıları renacsağlanan işlevselliğin yeniden yazılmış bir versiyonuna sahip olabilirler sponge(den man: standart girdiyi ), package emir ve moreutils dosyasına yazabilirler.
41754

@uprego. Ben sadece bir sponge.c kaynağına baktım ve sünger (stdin -> stdout) işlevselliği nedeniyle yükü çok fazla kodlanmış gibi görünüyor .
Anthon

@uprego ne GNU tarafından yaratıldı ne spongede moreutils.
jw013

Bunu iddia etmek istemedim.
41754
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.