Neden `sort -“ $ f1 ”` yerine `sort <“ $ f1 ”` tercih edilir ve bu neden “$ f1” `sıralama yerine tercih edilir?


29

Gönderen https://unix.stackexchange.com/a/458074/674

Kullanmayı unutmayın -- komutlara keyfi argümanlar geçerken (veya kullanım yönlendirmeler mümkün). Yani sort -- "$f1"ya da sort < "$f1"yerine daha iyi sort "$f1".

Neden kullanımı --ve yönlendirmesi tercih edilir ?

Neden sort < "$f1"tercih edilir sort -- "$f1"?

Neden sort -- "$f1"tercih edilir sort "$f1"?

Teşekkürler.


Yanıtlar:


55
sort "$f1"

değerleri için başarısız $f1olan bu başlangıcı -ya da burada durumu için sortile başlayan bazı +(adlı bir dosyayı ağır sonuçları olabilir -o/etc/passwdörneğin).

sort -- "$f1"

(burada -- seçeneklerin sonunu işaret eder) bu sorunların çoğuna hitap eder ancak çağrılan dosya için hala başarısız olur -(bunun sortyerine bunun yerine stdin olarak bakılır).

sort < "$f1"

Bu sorun yok mu?

İşte, dosyayı açan kabuk. Ayrıca, dosya açılamıyorsa, potansiyel olarak daha kullanışlı bir hata mesajı alırsınız (örneğin, kabukların çoğu komut dosyasındaki satır numarasını gösterir) ve kullanırsanız hata mesajının tutarlı olacağı anlamına gelir. dosyaları açmak için mümkün olduğunda yönlendirmeleri.

Ve

sort < "$f1" > out

(aksine sort -- "$f1" > out), "$f1"açılamazsa outyaratılmaz / kesilmez, sorthatta koşmaz.

Olası karışıklığı gidermek için (aşağıdaki yorumları izleyerek), dosyanın kendisi aranabilir olması şartıyla komutun mmap()dosyaya girmesini veya lseek()içine girmesini engellemeyin sort. Tek fark, dosyanın daha önce ve daha sonra muhtemelen farklı bir dosya tanımlayıcısındaki komuttan ziyade, kabuk tarafından dosya tanımlayıcısında 0 açılmasıdır. Komut yine de istediği gibi fd 0 arayabilir. Yani ile karıştırılmamalıdır değildir cat file | cmdbu zamanın nerede cmd'ın Stdin / mmaped aranmalıdır olamaz bir borudur.


4
Sadece bir yeniden yönlendirme kullanmanın sortverileri sırayla okumaya zorladığını ve dosyalayamayacağınızı unutmayın mmap. İken sortonunla çok problem olmayabilir, performansını dikkate less <fileve less file. İlk durumda lessdosyanın tüm içeriğini bellekte tutmak zorunda, ikinci durumda ise sadece istediği kısımları okuyabilir. Şimdi hayal file... Bir 100GB günlük dosyasıdır
strafor sinek

7
@styrofoamfly: less <fileTüm dosyayı bellekte tutan doğru , ancak zorunlu değil, bu daha az bir eksiklik. Sadece cat file | lesszorla. Check out less /dev/fd/0 <fstdin üzerine aldığı halde hafızada dosyayı tutmaz, hangi. Unix’deki stdin’in görülmez olması sık görülen bir yanılgıdır. Aslında, dosya türüne bağlı olarak aranabilir.
pts

@styrofoamfly read()Bir dosyayı sırayla mmap()okurken, tüm dosyayı bir kerede belleğe okurken demek istiyor musunuz ?
Tim,

1
@JohnBollinger Hayır. Bu, GNU projesi başlamadan önce 1980’de SysIII’den getopt’a kadar uzanıyor ve sortPOSIX de dahil olmak üzere çoğu standart tesis için desteklenmesi gerekiyor . Ama her zaman desteklenmediği doğru.
Stéphane Chazelas

2
Özür dilerim, @ StéphaneChazelas, konvansiyonun kökeni konusunda haklısınız ve ayrıca getopt()C işlevi için POSIX belirtiminin argümanın bu önemini tanımasını şart koşacağım --. Ancak asıl mesele, kabul ettiğiniz konu: argüman kullanma, bireysel programların alanıdır ve hepsi --özel olarak değerlendirilmez.
John Bollinger

17

Sorun, kısa çizgi ile başlayan dosya adlarıdır. komutu, değeri bir seçenek olarak yorumlayacağından başlamanın sort "$f1"değeri ile f1başlarsa -çalışmaz. Bu genellikle bir hataya neden olur, ancak bir güvenlik boşluğuna bile neden olabilir . İle sort -- "$f1", çift çizgi argüman --ortalama “Bu noktadan sonra hiçbir seçenek” değerine böylece f1bir seçenek olarak yorumlanır edilmeyecektir. Ancak yine de bir kenar durumu var: eğer değeri f1bir çizgi ise ve başka bir şey değilse, o zaman bir seçenek değildir -, yani “standart girdi” anlamına gelir (argüman bir girdi dosyasıdır; çıktı dosyası için “standart çıktı” anlamına gelir).

Yeniden yönlendirme kullanmak, bu tuzakların tümünü önler.

Bu sadece komutlar için değil, çoğu komut için geçerlidir sort.


sort < "$f1"Değer eşitse bunun işe yarayacağını mı söylüyorsunuz -? Çalıştığım hiçbir kabuğunda yok.
Grawity

@grawity, karşılaştırmak seq 10 > -; sort -ile seq 10 > -; sort < -.
Stéphane Chazelas
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.