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.