Bash kullanarak bir komuttan tüm çıktıları nasıl bastırabilirim?


297

Parametreleri olan bir programı çalıştıran bir Bash komut dosyası var. Bu program bir miktar çıktı verir (bunu yapıyor, yapıyor ...). Bu programın sessiz olması için herhangi bir seçenek yoktur. Komut dosyasının bir şey görüntülemesini nasıl önleyebilirim?

Windows ' ' echo off " gibi bir şey arıyorum .

Yanıtlar:


511

Aşağıdakiler null aygıta (bit kovası) standart çıktı gönderir.

scriptname >/dev/null

Ayrıca hata mesajlarının buraya gönderilmesini istiyorsanız, bunlardan birini kullanın (ilki tüm kabuklarda çalışmayabilir):

scriptname &>/dev/null
scriptname >/dev/null 2>&1
scriptname >/dev/null 2>/dev/null

Ve mesajları kaydetmek, ancak görmek istemiyorsanız, /dev/nullgerçek bir dosyayla değiştirin , örneğin:

scriptname &>scriptname.out

Tamlık için, Windows cmd.exe altında (burada "nul", "/ dev / null" değerine eşdeğerdir):

scriptname >nul 2>nul

8
'&>' Nin bash'a (ve belki de C mermilerine) özgü olduğunu unutmayın; Korn ve Bourne mermileri 2> / dev / null veya 2> & 1 gerektirir (stderr'ı stdout ile aynı yere göndermek için). Korn kabuğu, '&>' öğelerini "arka planda & öğelerine kadar çalıştır, ardından boş bir komutta i / o yönlendirmesini yap" olarak yorumluyor.
Jonathan Leffler

2
Bazı komutların standart çıkış / hata yerine doğrudan terminal aygıtına yazdığını unutmayın. Test etmek için echo foo > $(tty)bir komut dosyası koyun ve çalıştırın ./test.sh &> /dev/null- Çıktı yine de terminale yazdırılır. Bu komutları kullanmayan bir komut dosyası yazıyorsanız, elbette bu bir sorun değildir.
l0b0

1
@ l0b0, örneğin ne olursa olsun tüm çıktıların yeniden yönlendirilmesi için komut dosyasının (veya başka bir programın) farklı olmasını sağlamanın bir yolu var mı? Ekran ve komut dosyası böyle bir şey yapabilir biliyorum ama her ikisi de titiz ve * nix * nix arasında değişir.
Brent

@yang Cygwin'de /dev/nullvar, kullanmanıza gerek yok nul.
dimo414

48

Gibi bir şey

script > /dev/null 2>&1

Bu, standart çıktıyı ve hata çıktısını önleyerek her ikisini de yönlendirir /dev/null.


5
Ayrıca sadece &> bazı yazım kaydetmek istiyorsanız;) ile elde edildi;)
andynormancx

1
Bunu gs (GhostScript) komutuma eklememe rağmen, hala yazdırılıyor **** Uyarı: Dosyada %% EOF işareti bozuk veya %% EOF'dan sonra çöp var. Herhangi bir tavsiye?
ZurabWeb

Bu Unix sistemleri üzerinde sürecini çalışmaz, ben yapmak zorunda2>/dev/null
alper

14

Deneyin

: $(yourcommand)

: "hiçbir şey yapma" nın kısaltmasıdır.

$() sadece emrinizdir.


3
Çok ilginç ama bir sınırlama var: Döndürülen durum kodu her zaman 0(başarılı). Her falsezaman döndüren 1(başarısızlık) komutunu kullanan bir örnek görelim . Örneğin ( echo foo | tee file ; false ) && echo bargörüntüler foo. Sizin hile kullanarak çıktıyı bastırmak için: ( : $(echo foo | tee file ; false) ) && echo bar. Ancak bar, dönüş durum kodunun anlamı anlamına gelir 0(bu, döndürülen durum kodu değildir false). Lütfen bu sınırlamayı sağlayarak cevabınızı güncelleyin. Şerefe
olibre

2
@olibre, ne olacak DUMMY=$(yourcommand)? Bahsettiğiniz sınırlama yoktur. :)
16'da semente

3
@semente Perfect: Komut DUMMY=$( echo foo | tee file ; false ) && echo barhiçbir şey görüntülemiyor. Ve komut DUMMY=$( echo foo | tee file ; true ) && echo bargörüntülenir bar. Bana oy vermek için bir cevap vermek; bana bildirin; Şerefe
olibre

9

Bazı durumlarda uygun olabilecek bir alternatif, bir komutun sonucunu bir değişkene atamaktır:

$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1

Bash ve diğer POSIX komut satırı yorumlayıcıları değişken atamalarını komut olarak kabul etmediğinden, mevcut komutun dönüş koduna uyulur.

Not:typeset veya declareanahtar sözcüğüyle atama bir komut olarak kabul edilir, bu nedenle alt kabukta yürütülen komut değil, atamanın kendisinde olması durumunda değerlendirilen dönüş kodu:

$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0

6

Gibi andynormancx' yazı (bir Unix ortamında çalışıyorsanız), bunu kullanın:

scriptname > /dev/null

Veya bunu kullanabilirsiniz (bir Windows ortamında çalışıyorsanız):

scriptname > nul

1
Windows kabuğunda bundan daha iyisini yapabilirsiniz. Bunun yerine "scriptname> nul" kullanırsanız, "nul" / dev / null öğesinin Windows eşdeğeri olduğundan, silinecek bir dosyanız bile olmaz.
andynormancx

1
@andynormancx: Windows dosya sistemi düzeninden nefret ediyorum. Hangi dizinde olursanız olun (ağ paylaşımlarında olduğu gibi bu dosya adlarına sahip olabilen bir dosya sisteminde olsanız bile), NUL, COM1, LPT1, CON, vb. Gibi dosya adlarını "ayırır".
dreamlax

Aslında DOS 5.x'ten beri NUL kullandığımı sanmıyorum, bu cevabı gördüğümde ani bir ani parıltı vardı;)
andynormancx

> nulCygwin veya git bash ile Windows'ta kullandıysanız ve şimdi nulsilinemeyen bir dosya ile sıkışmışsanız , lütfen bu yanıtı deneyin , bir cazibe gibi çalıştı.
Daemon Painter

4

Linux Dokümantasyon Projesi'nden bu örneğe bir göz atın :

3.6 Örnek: stderr ve stdout 2 dosyası

Bu, bir programın her çıktısını bir dosyaya yerleştirir. Bir komutun mutlak sessizlikte geçmesini istiyorsanız, bazen cron girişleri için uygundur.

     rm -f $(find / -name core) &> /dev/null 

Bununla birlikte, bu basit yönlendirmeyi kullanabilirsiniz:

/path/to/command &>/dev/null

1

Senaryonuzda çıktı vereceğinizi bildiğiniz satırlara aşağıdakileri ekleyebilirsiniz:

some_code 2>>/dev/null

Yoksa deneyebilirsiniz

some_code >>/dev/null

1
hiç / dev / null .. 'ı meraktan hiç görmedim .. Bunu neden yapıyorsun?
Florian Berndl

Tüm çıktıları bastırıyor mu?
Peter Mortensen

Neden çift ">" ( >>)?
Peter Mortensen
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.