Neden birçok komut “sessiz” bir seçenek sunar?


37

Neden birçok komutları seçeneğini sağlıyoruz -qveya --quietkolayca boş dosyaya standart çıktıyı yönlendirerek aynı şeyi elde edebilirsiniz bastırmak çıkışına?


3
Bunu çoğunlukla elverişli bir bayrak olarak görüyorum.
Janis

7
Tüm komutlar tüm çıktıları -qbastırmak için kullanılmaz . Örneğin, Docker'ın görüntüleri listeleme komutu var; bir dizi bilgiyi içeren biçimlendirilmiş bir tabloyu gösterirken , görüntü kimliklerinin düz bir listesini çıkarırken (diğer komutlara yönlendirme yapmak için yararlıdır). docker imagesdocker images -q
new123456 19.03.2015

Yanıtlar:


71
  • Bir kabuğa kolayca yönlendirme yapabilseniz de, komutu bir kabuk komut satırı kullanmadan başka bir dilde çalıştırırken olduğu gibi kolay olmadığı başka bağlamlar da vardır. Bir kabukta bile:

    find . -type f -exec grep -q foo {} \; -printf '%s\n'

    içeren tüm dosyaların boyutunu yazdırmak için foo. Yönlendirirseniz /dev/null, ikisini de kaybedersiniz findve grepçıktılar Başvurmanız gerekir -exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;(yani ekstra bir kabuk doğurmak).

  • grep -q foo yazmaktan daha kısa grep foo > /dev/null
  • Yönlendirme /dev/null, çıktının hala yazıldığı ve sonra atıldığı, yazmamaktan daha az verimli olduğu anlamına gelir (ve tahsis etmeyin, yazının hazırlanmasına hazırlanın)
  • Bu, daha fazla optimizasyona izin verir. Durumunda grepolan beri Örneğin -q, grepilk eşleşme bulursa olarak çıkış gerekli değildir bilir, en kısa sürede çıkar. Bununla birlikte grep > /dev/null, hala tüm eşleşmeleri bulmaya çalışırdı.
  • sessiz anlamına gelmez sessiz . Bazı komutlar için, ayrıntıların azaltılması anlamına gelir (bunun tam tersi -v|--verbose). Örneğin mplayer, bir --quietve a vardır --really-quiet. Bazı komutlarla, -qqqayrıntı düzeyini 3 kat azaltmak için kullanabilirsiniz .

El kitabında grepher iki seçeneğin de -q, ve -staşınabilirliğin bir endişe kaynağı olması durumunda kaçınılması önerilmektedir. greperken çıkış önemli bir optimizasyondur, ancak böyle seçeneklere sahip tüm programlar bunu yapamaz; curl -shala tüm verileri işleyecektir (ancak 3. nokta hala geçerlidir, bu nedenle işlem zamanından tasarruf sağlar).
Janis

6
@Janis, bu çok eski sistemlere taşınabilirlik olurdu. Hem -qve -sPOSIX tarafından belirlenir. Biz eski, o zaman benim o sistemlerini dikkate iseniz sh -c '...' sh {} \;irade değil işin ya (daha önce birlikte kshtabanlı shs).
Stéphane Chazelas

Man sayfasından bahseder: USG tarzı grep de -q 'dan yoksundu ancak -s seçeneği GNU grep gibi davrandı. - Davranıştaki farkın bir sorun olabileceğini düşündüm. Alaka düzeyiyle ilgili karar veremiyorum.
Janis

-Q ve --quiet seçeneklerini sıklıkla komut dosyasındaki bir komutun dönüş koduyla ilgilendiğimde kullanırım. Yukarıda belirtilen sebepler, neden daha iyi örneklerdir.
Mark Stewart

@ StéphaneChazelas: Eğer (bir kısmı) birçok sistem o eski ... (iyi, aslında, birçok ^^ ama orada hala bazı) hala nasıl inanamazsın
Olivier Dulac

3

Komutun ekrana bir not alması gerektiğini hissettiği zaman vermesini sağlar, ancak normalde hiçbir şey ortaya çıkarmaz. hepsinin null değerine yönlendirilmesi ile çıktının görülmesi için bir şans yoktur.


Sessizlik, yanıt beklenmeyeceği anlamına gelir; Yine de çıktı görürsek beklenmedik olurdu. (Herhangi bir şekilde "gerçekten gerçekten" bir şey olması durumunda, yazdırılması önemli (bir terminale bağlı işlemde), bir tty / pty aygıtı doğrudan işlem tarafından kullanılabilir. )
Janis

2

Muhtemelen komuta bağlı -qolsa da , çıktısını da devre dışı bırakır stderr. Bu , gürültüden kaçınmak için stderr komutunun stdout'a kolayca erişmesine izin vermeyen kabukları (size bakıyorum, csh& tcsh) sağlar.

Bazı programlar, durum mesajlarıyla karıştırılmasını istemediğiniz başka anlamlı çıktılara sahip olabileceği durumlar için "sessiz" bir seçenek sunar. -qVeya eşdeğer diyelim ki, bir saf veri akışını sağlayan, tüm program durum çıkışını susturmaya, olur tarya gzip.


0

Yukarıdaki tüm iyi tepkiler ve puanların yanında. Her bayrak için zıt bir seçenek sunmak en iyisidir. Öyleyse, ayrıntı için bir -v varsa, ayrıntı için değil, sessizlik için -q olmalıdır. (bu tartışma konusu değil ama…) Her kısa için uzun bir seçenek olması gerektiği gibi, -q ve --quite.

İşimizdeki neredeyse her şeyde olduğu gibi, bir çözüm veya aynı sonuçları almanın birçok yolu vardır. -Q olması onlardan biri.

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.