“Yararsız kedi kullanımı” konusundaki genel fikir birliği nedir?


41

Grep, sed, tr vb. Gibi çoklu unix komutları eklerken, cat kullanılarak işlenen giriş dosyasını belirtme eğilimindeyim. Yani bir şey gibi cat file | grep ... | awk ... | sed ....

Ancak son zamanlarda, bunun kedinin işe yaramaz bir kullanım olduğunu belirten birkaç yorumdan sonra cevaplarımı bıraktıktan sonra, burada soruyu soracağımı düşündüm.

Sorunu baktı ve rastladı UUOC üzerinde Wikipedia'nın makalesinde ve Kedi Ödülü Yararsız Kullanımı ve yapılan tartışmalar verimlilik açısından olduğu gibi geliyor bana.

Karşılaştığım en yakın soru şuydu: Kedi aramak çok mu zararlı? - ama istediğim bu değil.

UUOC kampının önerdiği şeyi kullanmak cmd1 args < file | cmd2 args | cmd3 ..veya komutun dosyadan okuma seçeneği varsa, o zaman dosyayı argüman olarak iletmek için tahmin ediyorum .

Ama bana cat file | cmd1 ... | cmd2okumak ve anlamak çok daha kolay görünüyor. Giriş dosyalarını farklı komutlara göndermenin farklı yollarını hatırlamak zorunda değilim ve işlem mantıksal olarak soldan sağa akıyor. Önce girdi, sonra ilk işlem ... vb.

Kedinin işe yaramaz kullanımı hakkında ne gibi tartışmalar yapıldığını anlayamıyor muyum? Çok fazla işlem yapan her 2 saniyede bir çalışan bir cron işi çalıştırıyorsam, o zaman bu durumda kedi israf olabilir. Ama aksi takdirde, kedi kullanımıyla ilgili genel fikir birliği nedir?


16
Kabul ediyorum, burada, kedi çağrısı yetersiz olabilir, ancak komutu daha sonra anlamak ve düzenlemek daha kolay hale getirir ve (önemli olarak, IMO) her farklı komutu yalnızca bir işe sahip olmaktan ayırır, her şeyi halletmeyi çok daha kolaylaştırır ile.
Phoshi

4
Genel fikir birliği, fikir birliği olmadığı yönündedir.
jwg

2
Bu, stackoverflow.com/questions/11710552/useless-use-of-cat dosyasının çoğunu çoğaltır .
üçlü

1
Bunun da < file cmd1 args | cmd2 args ...işe yaradığını unutma ... yani " soldan sağa " argümanınız geçersiz. Genellikle açıklık için kullanırım - gösterdiğim düzen insanların duraklamasına neden olabilir, bu iyi değildir. Daha yüksek iplik sayıları norm haline geldiğinde, bu IMO sorunundan daha az ...
Attie

Yanıtlar:


21

Bu şekilde kullanmanın başka hiçbir şeyi gerçekleştirmediği, muhtemelen daha verimli olan seçeneklerin (yani doğru sonuçlar üretmek) anlamsız olması anlamsızdır.

Ama catsadece yoldan daha güçlü cat somefile. Bu cevapta ne yazdığımı sor man catya da oku . Ancak, yalnızca pozitif olarak yalnızca tek bir dosyanın içeriğine ihtiyaç duyuyorsanız , dosya içeriğini almak için kullanmamaktan biraz performans avantajı elde edebilirsiniz .cat

Okunabilirlik ile ilgili olarak, bu kişisel zevklerinize bağlıdır. catDosyaları aynı sebeple diğer komutlara dahil etmeyi seviyorum , özellikle de performans açısından önemsiz ise.

Ayrıca ne yazdığınıza da bağlıdır. Masaüstü makineniz için kendi kabuğunuz ve kolaylık yönteminiz varsa, kendinizden başka kimse umursamaz. Zincirdeki bir sonraki aracın arama yapmaktan daha iyi olacağı bir duruma rastlarsanız ve bunu düşük performanslı bir yönlendiricideki bazı asgari Linux sistemlerinde sık sık kullanılan bir yazılım olarak ya da gerçek sınırlar olan benzer bir cihazda dağıtabilirsiniz. işleme yeteneği, bu farklı. Her zaman içeriğe bağlıdır.


3
Performans maliyetleri önemsiz mi? Birçok durumda bunlar: oletange.blogspot.dk/2013/10/useless-use-of-cat.html
Ole Tange

15

Her gün komut satırı kullanımında pek farklı değil. Özellikle işlemcilerin kullanılmaması nedeniyle engellendiği için herhangi bir hız farkını fark etmeyeceksiniz, işlemciniz catboşta kalacak. Her ne kadar pratik bir uygulamada yüzlerce veya binlerce (veya yüzbinlerce) eşyaya dolassanız bile , çok yüklü bir sistemde olmadıkça (Ortalama / N CPU> 1) fazla bir fark yaratmaz.

Kauçuğun yolla buluştuğu yer, iyi alışkanlıklar oluşturmak ve kötülerden vazgeçmekle ilgilidir. Küflü bir klişeyi sürüklemek için şeytan ayrıntıda gizlidir. Ve vasat olanı büyükten ayıran detaylar böyle.

Araba sürerken olduğu gibi, neden sadece üç hak yapabileceğiniz zaman sola dönüyorsunuz? Tabii ki yapabilirsiniz ve mükemmel çalışıyor. Ama eğer sola dönüşlerin gücünü anladıysanız, üç hak saçma görünüyor.

Bir dosya tanıtıcısı, 17k RAM ve 0.004 saniye CPU zamanı tasarrufu ile ilgili değil. UNIX kullanmanın bütün felsefesi ile ilgili. Çizimimdeki "sola dönüş gücü" sadece girdiyi yönlendirmiyor, UNIX felsefesi. Bu tamamen tam anlamıyla sizi çevrelerdekilerden çok daha iyi hale getirecek ve anlayanlardan saygı göreceksiniz.


2
Trafik ışıksız 6 şeritli bir otoyolda sola dönmeyi düşünüyorsanız, o zaman sağa dönmeyi veya farklı bir rota izlemeyi düşünmeniz uygun olabilir. * nix, size birkaç rota seçeneği sunar. Bu kişisel tercih ve okunabilirlik meselesidir. "Cat file | cmd1 | cat | cmd2 | more" istiyorsanız, devam edin. (Bazen cmd1 sayfalandırılırsa yararlıdır - kedi onu ortadan kaldıracaktır.) $ CPU zamanı << $ Beyin zamanı.
MikeP 21

1
@MikeP catHerhangi bir sayfalandırmayı ortadan kaldırmaz, ancak bir şeye boru bağlantısı bazı uygulamalar tarafından çağrı yapılmasını engelleyebilir.
üçlü

14

Ben sık sık cat file | myprogramörneklerde kullanıyorum. Bazen Yararsız kedi kullanımıyla suçlanıyorum ( http://www.iki.fi/era/unix/award.html ). Aşağıdaki nedenlerden dolayı katılmıyorum:

Neler olduğunu anlamak kolaydır.

Bir UNIX komutunu okurken, bir komut ve ardından argümanların ardından yönlendirmeyi beklersiniz. İse yönlendirme hiçbir yerinde koymak mümkün ama nadiren görülür - böylece insanlar daha sert bir süre örnek okuma olacaktır. inanıyorum

    cat foo | program1 -o option -b option | program2

okumaktan daha kolay

    program1 -o option -b option < foo | program2

Yönlendirmeyi başlangıcına taşırsanız, bu sözdizimine alışkın olmayan kişilerin kafasını karıştırırsınız:

    < foo program1 -o option -b option | program2

ve örnekleri anlamak kolay olmalı.

Değiştirmesi kolaydır.

Programın kediden okuyabildiğini biliyorsanız, normal olarak STDOUT'a çıkış yapan herhangi bir programdan çıktı okuyabildiğini ve böylece kendi gereksinimlerinize uyarlayıp tahmin edilebilir sonuçlar elde edebileceğinizi varsayabilirsiniz.

STDIN normal bir dosya değilse, programın başarısız olacağını vurguluyor.

Çalışırsa program1 < fooo cat foo | program1zaman da çalışacağını varsaymak güvenli değildir . Ancak, bir tersini varsaymak uygulama içi kasa. Bu program STDIN bir dosya ise çalışır, ancak girdi bir boru ise başarısız olur, çünkü arama kullanır:

    # works
    < foo perl -e 'seek(STDIN,1,1) || die;print <STDIN>'

    # fails
    cat foo | perl -e 'seek(STDIN,1,1) || die;print <STDIN>'

Http://oletange.blogspot.dk/2013/10/useless-use-of-cat.html adresindeki performans cezalarına baktım. İşlemincat file | karmaşıklığı basit bir grep ile aynıysa sonuç kullanılamaz ve performans okunabilirlikten daha önemli. Diğer durumlar cat file |için iyidir.


1
Sonunda gerçek kriterler ile bir cevap. Buradaki yorumuma "bazen" kedilerin daha hızlı olabileceğini de not ediyorum. "Kedinin işe yaramaz kullanımı" nın gerçek bir zarar verici olduğunu hayal edebildiğim tek zaman, büyük dosyalar için önemsiz işlemler yapıyorsanız (ya da işlem, kuyruk komutu gibi stdin'i
rogerdpack

12

Bir UUOC olduğu hakkında bir yorum yapanların bazıları tarafından alınan pozisyonun, eğer biri Unix ve kabuk sözdizimini gerçekten anlaması durumunda, bu bağlamda kedi kullanmayacağını düşünüyorum. Zayıf dilbilgisi kullanmak gibi görünüyor: Zayıf dilbilgisini kullanarak bir cümle yazabiliyorum ve hâlâ görüşüme katlanıyorum, ama aynı zamanda zayıf dilimi ve uzantı olarak zayıf eğitimimi anladığımı da gösteriyorum. Yani bir şeyin bir UUOC olduğunu söylemek, birisinin ne yaptığını anlamadığını söylemenin başka bir yoludur.

Verimlilik söz konusu olduğunda, komut satırından bir boru hattı yürütüyorsanız, makinenin çalışması cat somefile |daha verimli olup olmayacağını düşünmenizden daha az zaman alır < somefile. Sadece önemli değil.


6
Bir süredir kedisiz cat somefile | progkabuklu deniz hayvanlarında ifade etmenin başka yolları olduğunu biliyordum , sanki prog < somefileama her zaman bana göre sırayla dizilmişlerdi, özellikle bir araya getirilmiş komutlar zinciri ile. Şimdi < somefile proghile kadar zarif bir şey görüyorum , teşekkür ederim. Kedi kullanmak için bıraktığım bahanelerden kaçtım.
Alex

4

Bazı çaylakların cevaplarımdan biri için UUOC'yi bana doğru tutmaya çalıştığı güne dek bu ödülün farkında değildim. Öyleydi cat file.txt | grep foo | cut ... | cut .... Ona aklımdan bir parça verdim ve ancak bunu yaptıktan sonra bana ödülün kökenlerine ve bunu yapma pratiğine değinen bağlantıyı ziyaret etti. Daha fazla arama beni bu soruya yönlendirdi. Ne yazık ki, bilinçli bir değerlendirmeye rağmen, cevapların hiçbiri mantığımı içermiyordu.

Onu eğitirken savunmacı olmak istemedim. Ne de olsa, daha genç yaşlarımda emir olarak yazdım grep foo file.txt | cut ... | cut ...çünkü sık sık beklediğiniz zaman grepdosya argümanının yerleşimini öğreniyorsunuz ve birincinin desen, daha sonra da dosya isimlerinin ne olduğunu bilmeye hazır.

Öncelikle soruyu catkısmen “iyi tat” (Linus Torvalds'ın sözleriyle) bir nedeni nedeniyle ama esas olarak zorlayıcı bir işlev sebebi nedeniyle yanıtladığımda bilinçli bir seçimdi .

İkinci sebep daha önemlidir, bu yüzden önce onu açıklayacağım. Bir çözüm olarak bir boru hattı önerdiğimde, yeniden kullanılabilir olmasını bekliyorum. Bir boru hattının sonuna eklenmesi veya başka bir boru hattına eklenmesi muhtemeldir. Bu durumda, yeniden kullanılabilirliği arttırmak için bir dosya argümanına sahip olmak ve dosya argümanı mevcutsa , büyük olasılıkla sessizce bir hata mesajı olmadan bunu yapmak . I. e. grep foo xyz | grep bar xyz | wckaç satır size verecektir xyziçerirler barhem içerirler satır sayısını bekliyoruz ederken foove bar. Argümanları kullanmadan önce bir boru hattındaki bir komuta değiştirmek zorunda kalmak hatalara açıktır. Sessiz başarısızlık olasılığını eklediğinizde, bu özellikle sinsi bir uygulama haline gelir.

İlk sebep, çok fazla "iyi tadı" olan sadece önemsiz değildir, çünkü yukarıda belirtilen, başarısızlık gibi şeyler için sezgisel, bilinçli bir mantıktır, çünkü şu an için eğitime ihtiyacı olan bir kişinin söylediği anda düşünemezsiniz " bu kedi işe yaramaz ".

Ancak, bahsettiğim eski "iyi tat" sebebini de bilinçlendirmeye çalışacağım. Bu nedenle Unix'in dik tasarım ruhuyla ilgisi var. grepdeğil cutve lsdeğil grep. Bu nedenle en azından grep foo file1 file2 file3tasarım ruhuna aykırıdır. Bunu yapmanın ortogonal yolu cat file1 file2 file3 | grep foo. Şimdi, grep foo file1sadece özel bir durumdur grep foo file1 file2 file3ve aynı şekilde muamele etmezseniz, en azından işe yaramaz kedi ödülünden kaçınmaya çalışırken beyin saati döngülerini kullanıyorsunuzdur.

Bu bizi grep foo file1 file2 file3birleştiren ve catbirleştiren argümana götürür , böylece uygun olur, cat file1 file2 file3ancak catbirleştirici olmadığı cat file1 | grep fooiçin, hem de cathem de yüce Unix'in ruhunu ihlal ediyoruz . Öyleyse, durum böyle olsaydı, Unix bir dosyanın çıktısını okumak ve onu stdout'a tükürmek için farklı bir komuta ihtiyaç duyardı (onu sayfalandırmak ya da sadece stdout'a saf bir tükürük vermek için değil). Yani söylediğiniz cat file1 file2veya söyleyeceğiniz bir duruma sahip olacaksınız dog file1ve cat file1ödülü almaktan kaçınmak için vicdanlı bir şekilde hatırlayacağınız bir yandan da kaçınmaktan kaçının dog file1 file2çünkü umarım dogbirden fazla dosya belirtilirse tasarım bir hata verecektir.

Umarım bu noktada, Unix tasarımcılarına bir dosyayı stdout'a tükürmek için ayrı bir komut eklememekle ve aynı zamanda catbaşka bir isim vermek yerine birleştirmek için adlandırma konusunda sempati duyarsınız . <edit>talihsiz <operatör gibi bir köpek var . Kolay birleştirilebilirliği önleyen boru hattının sonuna yerleştirilmesi talihsiz bir durumdur. Başına yerleştirmenin sözdizimsel veya estetik açıdan temiz bir yolu yoktur. Aynı zamanda yeterince genel olmamak da talihsiz bir durumdur, bu nedenle köpekle başlayabilirsiniz, ancak bir öncekinden sonra da işlenmesini istiyorsanız başka bir dosya adı ekleyin. ( >Öte yandan, yarısı kadar kötü değildir. Sonunda neredeyse mükemmel bir yerleşime sahiptir. Tipik olarak bir boru hattının tekrar kullanılabilir bir parçası değildir ve buna göre sembolik olarak ayırt edilir.)</edit>

Bir sonraki soru, başka bir işlem yapmadan sadece bir dosyayı ya da birkaç dosyanın stdout'u birleştirmesini sağlayan komutlara sahip olmanın neden bu kadar önemli? Bunun bir nedeni, standart girdi üzerinde çalışan her bir Unix komutunun en az bir komut satırı dosyası argümanının nasıl ayrıştırılacağını ve varsa girdi olarak nasıl kullanılacağını bilmek istememesidir. İkinci sebep, kullanıcıların hatırlamak zorunda kalmamasıdır: (a) dosya adı argümanlarının gittiği yer; ve (b) yukarıda belirtildiği gibi sessiz boru hattı hatasını önlemek.

Bu bize neden grepekstra mantığa sahip olduğunu gösteriyor. Bunun gerekçesi, sık kullanılan ve tek başına bir temelde (bir boru hattı olarak) kullanılan komutlar için kullanıcının akıcılığını sağlamaktır . Kullanılabilirlikte önemli bir kazanç elde etmek için hafif bir ortogonalite uzlaşmasıdır. Tüm komutlar bu şekilde tasarlanmamalı ve sık kullanılmayan komutlar, dosya argümanlarının ekstra mantığından tamamen kaçınmalıdır (fazladan mantığın gereksiz kırılganlığa yol açtığını unutmayın (bir hata olasılığı)). Bunun istisnası, olduğu gibi dosya argümanlarına izin vermektir grep. (bu arada lssadece kabul etmekle kalmayıp aynı zamanda dosya argümanları gerektirmek için tamamen farklı bir nedene dikkat edin )

Son olarak, daha iyi yapılabilecekler, eğer standart giriş mevcutsa, istisnai olarak verilen komutların grep(ancak zorunlu olmamak üzere ls) bir hata üretmesidir. Bu mantıklıdır çünkü komutlar, kullanıcı rahatlığı için her şeye rağmen Unix'in ortogonal ruhunu ihlal eden bir mantık içerir. Daha fazla kullanıcı rahatlığı için, yani sessiz bir arızadan kaynaklanan ıstırabın önlenmesi için, bu komutların, sessiz bir arıza olasılığı varsa kullanıcıyı uyaran kendi ihlallerini ihlal etmekte tereddüt etmemesi gerekir.


1
Sitede tartışıldığı gibi bu cevap ve sorunun tekrarı, grep pattern f1 f2 f3basit birleştirme değildir . grepdosyaları bilir ve dosya adlarını (ve isteğe bağlı olarak satır numaralarını ve diğer her şeyi) yazdırır. grep . /sys/kernel/mm/transparent_hugepage/*dosya adı yazdırmak için güzel bir kesmek: çok sayıda tek satırlı dosya içeren dosya içeriği. Klasik Unix tasarımı, çoğu yardımcı programın *.txtihtiyaç duymadan çalışmasıdır cat. catbirden çok dosyayı tek bir akışta düzleştirmek içindir.
Peter Cordes

@PeterCordes Ben sadece grep hakkında çok fazla yazmadım. Hatalara / kopyala-yapıştır'a sağlamlık konusunda gözlemlediğim önemli sorunlar var; doğruluk vs performans, uygun olmayan bazı küçük / çevresel kaygıların lehine göz ardı etmeyi seçtiniz.
rastgele

Özellikle boru hatlarını kopyalarken / yapıştırırken alabileceğiniz hatalar hakkında bazı ilginç ve geçerli noktalar ortaya koyuyorsunuz. Örneğinizi grep, bunun gibi bir programla değiştirmenizi öneririm cut, birden fazla dosyayı önemsemek için bir nedeni yoktur ve her zaman sadece stdin'den beslenebilir. Bazı programlar, trdosya argümanlarını hiçbir şekilde kabul etmiyor ve sadece bir filtre olarak çalışıyorlar, yani seçim catve arasında <.
Peter Cordes

1
Yazınızla ilgili en büyük sorunum, girdi yeniden yönlendirmesinde indirim yapmanız. <file cmd1 | cmd2 >outharika değil, itiraf ediyorum, ama buna alışmak tamamen mümkün. "Şerefsiz Unix'in ruhu" hakkında alaycı bir şekilde devam ediyorsunuz, ki bu benim için tamamen düştü, çünkü ya Unix tasarımcılarının gerçekten düşündüğü gibi olsun ya da istemiyor gibisiniz. Unix tasarımını beğenmiyorsanız sorun değil, fakat doğası gereği aptal değil. İşletim sisteminin tasarımının kabuk sözdizimini önleyip hazırlamadığından ve bunların nasıl geliştiğinden emin değilim, ancak cat1970’te fazladan kaçınmaya değdi!
Peter Cordes

1
@PeterCordes Gördüğümde, cevabımda uzun zamandan beri titrendim. Ekstra cat, boru hatlarının yeniden kullanılmasına ve birleştirilmesine yardımcı olur, oysa onsuz sessiz hatalar alabilirsiniz (cevabımda "sessizce" ifadesini arayın).
randomstring,

2

Yararsız Kedi Kullanımlarını Savunma

(Bu uygulama ile dırdırcı yorumlardaki tsunamiyi dengelemeye yardımcı olacak birkaç paragraf)

Beş yıldan beri bash'ı hem kabuk hem de küçük betikler için bir betik dili olarak kullanıyorum (bazen çok küçükler için pişmanlık duyuyorum). Uzun zaman önce, "Kedinin Yararsız Kullanımı" (UUoC) hakkında bir şeyler öğrendim. Hala en azından her hafta ondan suçluyum ama açıkçası nadiren küçük bir parçanın bile bundan kaçınmaya zorlandığını hissediyorum. catVs kullanmanın < fileteknik farklılıklardan ziyade lezzet ile ilgili olduğuna inanıyorum ve bu cevabı Linux için yeni olan ve zevklerimi paylaşan insanları korumak için yazdım.catyollarında ciddi bir yanlışlık olduğunu düşünmekten (ve olduğu birkaç olayı not edin). Linus Torvalds gibi ben de genelde lezzetin beceriden daha önemli olduğuna inanıyorum. Bu, zevkimin sizinkinden daha iyi olduğu anlamına gelmiyor, ancak bu kötü bir şey tadıyorsa, değerli bir şey kazanmadan yapamayacağım anlamına geliyor.

Soru yazarında olduğu gibi, artan bir şekilde karmaşık komutlar oluşturarak bir problemi araştırdığım bir REPL üzerinde çalışırken REPL üzerinde çalışırken kedi kullanmanın çok doğal olduğunu hissediyorum zaten açık . İşte çok tipik bir örnek: Bir metin dosyam var ve bu konuda fazla bir şey bilmiyorum. cat fileİçeriğin tadına bakmak için yazacağım . Eğer çıkış çok fazla ben ok benim kadar hit olacak ve koşullara bağlı olarak ben ekleyeceğiz | headveya | grep fooveya | what_everişleme adımları ekleyerek önceki komutu uzanan. Bu, artan bir şekilde basit bir komuttan daha karmaşık bir birine, bir işlem adımı ekleyerek diğerinin bana karşı çok doğal hissetmesini sağlamanın yolu (aynısını ipython üzerinde yapıyorum ve bu şekilde seviyorum)pyfunctionalve benzer programlama araçları bu stili kapsar). Bash kabuk üzerinde çalışırken Yani I 'benim akışını kesintiye kaldırmak için emin değilim catolduğunu daha yararsız olması ve olguların 99.9% olarak ... hiç de iyi hiçbir sonucu acı çekmesine izin daha.

Tabii işler komut dosyalarını yazarken olabilir değiştirin. Ancak senaryo yazarken bile, UUoC ile alay eden insanların bu önemli dersleri büyük bir zihinle görmezden geldiklerini düşünüyorum: "Erken optimizasyon tüm kötülüklerin kaynağıdır " . Eğer atipik bir şey yapmıyorsanız, UUoC için optimizasyonun gerekli olacağı bir yer olması gerçekten zordur. Tabii ki, bu konuda neyin yetersiz olduğunu kesinlikle bilmeniz gerekir (BTW'den bu işlem için ekstra işlem çağrısıdır. Bir işlemi çağırmanın pahalı olduğu nadir sistemler üzerinde çalışıyorsanız (örneğin, bazı gömülü sistemler veya daha düşük bir dereceye kadar CygWin), bu bilgiyi elde etmek, özel bir durum gerektiriyorsa ne yapacağınızı bileceksiniz. Örneğin, kendinizi aramaya başlarsanızcatbir döngü içinde saniyede birçok kez (BTW kendinizi bu pozisyonda bulursanız, bash iş için doğru araç olup olmadığını sorun). Yine de: "önce doğru çalışmasını sağlayın, sonra gerekirse optimize edin" .

Ve UUoC Nick ile ilgili şikayetlerin tsunamiğini nasıl açıklarsınız?

Benim zevkime sahip olan herkesin yanı sıra, pek çok insanın UUoC hakkında şikayet etmesinin neden büyük bir kısmının teknik değil de insan olduğuna inanıyorum: Çoğu Unix yeni başlayanlar < file commanddeyimi bilmeyecek, bu yüzden "Eski Guru " onlara. Ayrıca süslü kelimeleri kullanma ("işlem çağırma") ve "optimizasyon" işleminin değerli konusuna dokunma fırsatına sahip olacak. İyi bir izlenim garanti edilir, bu yüzden direnmek çok zor. Sonra yeni gelenler Guru'nun tavsiyesini yüz değerinden alacaklar ve uzun süre "Sadece Gerçek" olarak tekrar edecekler (ve bu cevabı küçümseyecekler :-). Komik not: UUoC'un verimsizliğinden kaçınmak için bash'ı düzeltmek muhtemelen o kadar kolaydır ki kimsenin bu özelliği neden eklediğini ya da neden yapmadığını merak etmek zorundadır.< filenameBir çok yıldan sonra bir dosya kedi. Karanlık bir ruh, bazı kızıl saçlı bas korsanlarının bizimle alay etmek için fırsatlar bırakmaktan hoşlandığını;


+1 Bu pratiği yayan antropolojik faktörlerin neden
17

1

Gerçekten güzel olurdu ne gibi bir sözdizimi destekleyen bir kabuktur:

< filename cmd | cmd2 cmd2arg1... | cmd3

Bu arada, cat filename | realcmd1...dosya adını bir argüman olarak gerektiren ilk komutlarla sözdizimini standart hale getirdiği için kabul edilebilir olduğunu düşünüyorum .


17
Bash ve benzeri mermiler desteklenir < filename cmd | cmd2 .... Bu yeterince yakın mı?
garyjohn

@garyjohn: Bence bunu bir cevap olarak göndermelisin.
Kevin Reid

14
Zorunlu eski kabuk korsan yorumu: Bourne tarzı mermiler, < file command ...en azından 80'lerin ortalarından bu yana ve muhtemelen orjinalinin shyazıldığı 70'lerin başına kadar destek verdi . Daha genel olarak, giriş / çıkış yönlendirmeleri soldan sağa ayrıştırılır ve komut satırı içinde herhangi bir sırayla serpiştirilebilir. Yani, cmd <file arg arg...aynı zamanda geçerli olurdu.
Dale Hagglund

3
Evet, kısmen UUOC'yi icat ettiğimi yazmak ne kadar kolay olduğu için.
Randal Schwartz

2
Kaydırılan dört karaktere karşılık kaydırılmamış bir karakter o kadar büyük bir fark değil ve telefonumun bile farkına bile varmadan istediğim bir dosyayı iletmektense, istediğimde bana bir dosya aktarıyor, bu da beni her gördüğümde başım ağrıyor. .
Aaron Miller

0

Kedinin kullanımı kabul edilebilir olduğunu söyleyen herkes için “daha ​​iyi kokuyor” veya “daha ​​okunaklı” diyor çünkü şunu söyleyeceğim:

Senin için belki ... ama kodunu okuyabilen veya anlamaya çalışan başkalarına. Asla başkalarına örneklerinizle ilgili talimat vermeye ya da kodunuzu paylaşmaya çalışmazsanız, lütfen kesinlikle kendi isteğinizle kullanın.

Ayrıca bu yorumu ekleyeceğim, uzun zamandır Linux kullanıcısı ve Yönetici / Mühendis ... (ve birçoğumuz var), gözlerimizin bunu görmesini engelliyor. Neden? Çünkü kaynakları sıkı kontrol ettiğimiz sistemlerdeki kaynakları kullanıyor. Cat komutu ve borunun kendisi, tamamen işe yaramaz olan ekstra bellek ve dosya tutamaçlarını kullanır. Sistemimin ücretsiz olarak ihtiyaç duyduğu kaynakları bağladınız ve bu kaynakların kullanımını açıklayabilecek HİÇBİRİM elde ettiniz. Bu çok büyük bir hayır.

Şimdi burada oturup oturup koku kokusu veya okunabilirlik gibi şeyleri herkesle tartışabilirim, ancak günün sonunda bir sistemde kaynak kullanıp herhangi bir şey kazanmadığınız zaman yazım ya da yanlış meselesidir. bu yanlış.

Bir ev kullanıcısı olarak tavsiyemden öğrenebilir ve bir şeyler yapmanın daha iyi yollarını öğrenebilir ya da kedilerin "kokusu" ile kör olmayı seçebilirsin, seçimin ... ama bu uygulamayı açıkça kullanırsan ... Bu uygulamada her zaman ve sessizce doğru olduklarını ve inatçı olduğunu kabul etmek zorunda kalacaksınız çünkü doğru. :-)


Ayrıca uzun zamandır Linux (ve daha önceki * nix) kullanıcıları ve yazılım geliştiricileriyim. Görmek için "gözlerimizin kanamasına neden oluyor" derken benim için konuşmuyorsun cat foo.txt | .... Diğer cevap, neden iyi bir kullanım olabileceğini iyi açıklıyor. Vakanın basit özeti şöyle: "$ CPU zamanı << $ Beyin zamanı" (@MikeP'nin yukarıda yorumladığı gibi).
Jim DeLaHunt

Birincisi, bu 2017'nin cevabıydı (ölü lol'i canlandırmanın yolu). İkincisi, bir yönetici veya geliştirici olarak, mümkün olduğunda kaynak kullanımını en aza indirmek için her zaman çaba göstermemiz gerektiğini unutmayın. Uygulamalar ve servisler yazarken, uygulama / hizmetten çok az fayda sağlayan veya hiç fayda sağlamayan bellek veya işlemci drenajlarını izlemeye mi çalışıyorsunuz? Peki UUOC tam olarak budur. Şimdi, kedinin kusursuz olarak geçerli kullanımları var, eminim ki emir vermek için borulamayı içerir ... ama çoğu zaman değil. Bu yüzden dediğin gibi senin için konuşmayabilirim ... ama eğer profesyonel bir isen neden daha kolay katılmıyorsun diye merak ediyorum (gerçek bir UUOC senaryosu verildi).
David Dreggors

Mesele şu ki, bir geliştiricinin optimize etmesi için bellek veya CPU tahliyesi tek maliyet değil. İnsan zamanının maliyeti, sorunu anlamak ve bir uygulamayı yazmak ve hata ayıklamak da tradeoffun bir parçasıdır. Buradaki cevapların bazıları insan zamanının hafızadan veya CPU'dan çok daha az ve pahalı olduğu yargısına dayanıyor. . … Ama bu kurallara aykırı bir tartışma haline geliyor. Cevaplardaki oyların Süper Kullanıcılar tarafından hangi perspektif için desteklendiğini söylesin.
Jim DeLaHunt
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.