Bash betiğinde çıktı nasıl susturulur?


153

Standart çıktı veren bir programım var ve bu çıktıyı bir dosyaya aktarırken bir Bash betiğinde susturmak istiyorum.

Örneğin, programı çalıştırmak şu çıktıyı verecektir:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

Aşağıdaki betiğin terminale hiçbir şey vermemesini istiyorum:

#!/bin/bash
myprogram > sample.s

Hatırladığım kadarıyla, çıktıyı bir dosyaya yeniden yönlendirmek, uçbirime yansımamasına neden oluyor. Senin için çalışmayan nedir?
Anon.


Yanıtlar:


195

Stderr'e de çıktı verirse, bunu susturmak isteyeceksiniz. Bunu, dosya tanımlayıcısı 2'yi yeniden yönlendirerek yapabilirsiniz:

# Send stdout to out.log, stderr to err.log
myprogram > out.log 2> err.log

# Send both stdout and stderr to out.log
myprogram &> out.log      # New bash syntax
myprogram > out.log 2>&1  # Older sh syntax

# Log output, hide errors.
myprogram > out.log 2> /dev/null

15
"&>" Satırı, az önce yayınladığım şeyin daha kısa bir versiyonu. Bu kısayola daha önce rastlamadım. Olumlu oylama.
chradcliffe

5
&>bash 4'ten çok daha yaşlı
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams Değişiklik günlüğünün belgelenmesinin &>girişine bağlantı verebilir misiniz ? : o
ThorSummoner

1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 , bunun 4.0'da>>& tanıtıldığını gösterir . Orada hiç söz edilmemiştir &>ama 1.x. zaten o aracı düşünüyorum böylece sadece 2.0 dönmek DEĞİŞİKLİKLER
üçlü

git blameon redir.c, halen mevcut kod tabanında bulunan en eski oluşum için 1998 kaydına işaret ediyor.
üçlü

64

Stderr'i stdout'a yönlendir

Bu, stderr'i (tanımlayıcı 2'dir) stdout olan dosya tanımlayıcı 1'e yönlendirecektir.

2>&1

Stdout'u Dosyaya Yönlendir

Şimdi bunu gerçekleştirdiğinizde, stdout'u dosyaya yönlendiriyorsunuz. sample.s

myprogram > sample.s

Stderr ve stdout'u Dosyaya yönlendirin

İki komutun birleştirilmesi, hem stderr hem de stdout'un örneğe yönlendirilmesine neden olur.

myprogram > sample.s 2>&1

Stderr ve stdout'u / dev / null'a yönlendirin

/dev/nullUygulamanızı tamamen sessize almak istiyorsanız adresine yönlendirin .

myprogram >/dev/null 2>&1

13
Sonuncusunda bir yönlendirme operatörü eksiktir; olmalıdır myprogram >/dev/null 2>&1(öndeki kamaya /dev/nullve yönlendirmelerin sırasına dikkat edin).
üçlü

3
olmaz myprogram &>/dev/nullyeterli mi?
JaviOverflow

39

Tüm çıktı:

scriptname &>/dev/null

Taşınabilir:

scriptname >/dev/null 2>&1

Taşınabilir:

scriptname >/dev/null 2>/dev/null

Daha yeni bash için (taşınabilir değil):

scriptname &>-

Bu çalışmıyor. Aslında adında bir dosya oluşturur -ve &>taşınabilir olmayan bir bourne kabuk uzantısıdır.
PhilT

Taşınabilir eşdeğeri echo moo 1>&-bir hata üretir çünkü dosya tanımlayıcısı 1 kapalı:-bash: echo: write error: Bad file descriptor
üçlü

11

STDOUT ve STDERR'ın ikisini de [her şeyi] istiyorsanız, en basit yol şudur:

#!/bin/bash
myprogram >& sample.s

sonra olduğu gibi çalıştırın ./scriptve terminalinizden hiçbir çıktı almayacaksınız. :)

"> &" STDERR ve STDOUT anlamına gelir. &Ayrıca bir boru ile aynı şekilde çalışır: ./script |& sed o sed için her şeyi gönderecek


7
man bash ("Yönlendirme Standart Çıktı ve Standart Hata" altında) &> ve> & eşittir ancak ilk (&>) tercih edilir. Ancak | & bunu borular için yapmanın tek yoludur.
John Mellor

1
@John Hayır, borular için taşınabilir bir yoldura 2>&1 | b 2>&1 | c
tripleee

10

Hala bir cevap bulmakta zorlanıyorsanız, özellikle çıktı için bir dosya oluşturduysanız ve net bir alternatifi tercih ediyorsanız: echo "hi" | grep "use this hack to hide the oputut :) "


2
İlginç hack ... zekâ için oylanıyor ^ _ ^
skplunkerin

6

Şunu deneyin:

myprogram &>/dev/null

çıktı almak için


0

Not: Bu cevap, "Linux bir kabuk betiği çalıştırılırken yankı nasıl kapatılır" sorusuyla ilgilidir ve bu da buna yinelenmiş olarak işaretlenmiştir.

Yankıyı gerçekten kapatmak için komut şudur:

stty -echo

(bu, örneğin; bir parola girmek istediğinizde ve bunun okunabilir olmasını istemediğinizde. Betiğinizin sonunda yankıyı açmayı unutmayın, aksi takdirde betiğinizi çalıştıran kişi, O andan itibaren yazıyor. Çalışırken yankıyı açmak için:

sıkı yankı


0

Komut dosyalarında kullanışlıdır:


Gizlenecek program hiç mevcut olmasa bile herhangi bir STDOUT'u gizlerken bir dosyada yalnızca STDERR'yi alın (ana komut dosyasını hiçbir zaman asmaz), bu tek başına çalışıyordu:

stty -echo && ./programMightNotExist 2> errors.log && stty echo

Tamamen ayırın ve her şeyi susturun, üst komut dosyasını öldürmek bile iptal etmez ./prog:

 ./prog </dev/null >/dev/null 2>&1 &

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.