Jak ukryć dane wyjściowe aplikacji powłoki w systemie Linux?


Odpowiedzi:


68

Możesz przekierować wyjście dowolnego programu, aby nie było widoczne.

$ program > /dev/null

Spowoduje to przekierowanie standardowego wyjścia - nadal będziesz widzieć błędy

$ program &> /dev/null

Spowoduje to przekierowanie wszystkich danych wyjściowych, w tym błędów.


Pierwszy nie działał dla wgeta
Jader Dias

To dlatego, że wget używa stderr do niektórych swoich danych wyjściowych. Drugi powinien działać.
theotherreceive

2
Nawiasem mówiąc, możesz zapisać to wyjście wget w pliku dziennika, więc kiedy / jeśli pobieranie przestanie działać, możesz dowiedzieć się, dlaczego. Jeśli i tak jest w skrypcie. Jeśli jest to jednorazowy bieg, to tak, do kosza
Matt Simmons,

1
Dla wgetmożna użyć -qopcji, aby go uciszyć.
pkhamre

Jakikolwiek sposób na tłumienie danych wyjściowych zapisanych bezpośrednio w / dev / tty?
d11wtq

30

W wierszu poleceń dostępne są trzy urządzenia IO.

 standard in - 0 
 standard out - 1 
 standard error - 2 

Aby przekierować standardowe wyjście (domyślne wyjście) do pliku (i zastąpić plik), użyj

 command > file.log 

Aby dołączyć do pliku file.log, użyj 2> s

 command >> file.log

aby przekierować standardowy błąd do pliku.log, użyj

 command 2> file.log

i dołączyć

 command 2>> file.log

Aby połączyć wyniki w jeden strumień i wysłać je wszystkie w jedno miejsce

 command > file.log 2>&1 

To wysyła 2 (stderr) do 1 (stdout) i wysyła stdout do pliku.log

Zauważ, że można również przekierować standard na polecenie oczekujące standardowego wejścia

 command << file.txt 

EDYCJA
Aby uzyskać więcej informacji, zapoznaj się z przewodnikiem Advanced Bash Scripting Guide


Czy ktoś może wyjaśnić, jak command > file.log 2>&1działa?
Cory Klein

Jak niski poziom chciałbyś wiedzieć?
Matt Simmons

3
@nomoreink: w rzeczywistości są to 2 polecenia, jedno jest, > filea drugie jest 2>&1. Pierwszy przekierowuje standard do pliku. Drugi pobiera drugi deskryptor pliku i przekierowuje go do pierwszego. Możesz zrobić odwrotną, przekierować standardowe wyjście do standardowego błędu za pomocą, >&2a następnie przekierować standardowy błąd do pliku za pomocą 2> file.
Hubert Kario

12

Ukryć stdout

./command >/dev/null

Ukryj stdoutistderr

./command >/dev/null 2>&1

Ukryj stdouti stderrzwolnij terminal (uruchom polecenie w tle)

./command >/dev/null 2>&1 &

3

Jeśli chcesz tylko ukryć wynik (i nie zapisywać go w pliku), możesz użyć:

Edytowane:

$ command &> / dev / null


Spowoduje to przekierowanie danych wyjściowych do pliku o nazwie null
thererereive

Wygenerował plik zerowy
Jader Dias,

1
nie miałbyś na myśli / dev / null, prawda?
Babu

1
Tak, chciałbym, Babu. Miałem na myśli $ command &> / dev / null. Przepraszam za zbyt szybkie pisanie dla własnego dobra.
Lucho

2

W systemie Mac OS X (10.6 „Snow Leopard”):

Jeśli chcesz ukryć dane wyjściowe, nie informując o tym programu, sprawdzając deskryptor pliku wyjściowego / błędu, możesz spróbować użyć następujących poleceń w powłoce:

stty flusho; command ;stty -flusho

lub jeśli po prostu chcesz ukryć dane wejściowe z terminala:

stty  -echo; command ;stty  echo

Więcej informacji znajduje się na stronie instrukcji stty (1)

W przypadku Linuksa wiem tylko, że Ubunutu (10.04 „Lucid”) i niektóre „Debian / Arch” (komentowane poniżej - tnx hendry) nie mają tego flushoustawienia (i nie widzę nic innego odpowiedniego na stronie podręcznika man) . Mimo to echoustawienie działa na Ubuntu.


Mój domyślny styl w Debian / Arch nie ma tych opcji.
hendry

Powinienem oczywiście wspomnieć, że nawet nie miałem systemu operacyjnego OP. Edytowałem mój post.
vike
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.