Jak wyciszyć wyjście w skrypcie Bash?


149

Mam program, który wyprowadza na standardowe wyjście i chciałbym wyciszyć te dane wyjściowe w skrypcie Bash podczas przesyłania do pliku.

Na przykład uruchomienie programu zwróci:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

Chcę, aby następujący skrypt nie wyświetlał niczego na terminalu:

#!/bin/bash
myprogram > sample.s

Z tego, co sobie przypominam, przekierowanie wyjścia do pliku powoduje, że nie jest on wysyłany do terminala. Co ci nie pasuje?
Anon.


Odpowiedzi:


187

Jeśli wyprowadza również na stderr, będziesz chciał to wyciszyć. Możesz to zrobić, przekierowując deskryptor pliku 2:

# 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
Wiersz „&>” to krótsza wersja tego, co właśnie opublikowałem. Nie natrafiłem wcześniej na ten skrót. Głosowanie za.
chradcliffe

5
&>jest dużo starszy niż bash 4.
Ignacio Vazquez-Abrams,

@ IgnacioVazquez-Abrams Czy możesz powiązać dziennik zmian dokumentujący &>wprowadzenie? : o
ThorSummoner

1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 wskazuje, że >>&został wprowadzony w 4.0. Nie ma wzmianki o, &>ale ZMIANY powracają tylko do 2.0, więc myślę, że oznacza to, że było już w 1.x.
tripleee

git blamena redir.cpunkty do 1998 zobowiązać do najstarszego wystąpienia jeszcze w bieżącym kodem.
tripleee

60

Przekieruj stderr na stdout

To przekieruje stderr (który jest deskryptorem 2) do deskryptora pliku 1, który jest standardowym wyjściem.

2>&1

Przekieruj standardowe wyjście do pliku

Teraz, wykonując to, przekierowujesz standardowe wyjście do pliku sample.s

myprogram > sample.s

Przekieruj stderr i stdout do pliku

Połączenie tych dwóch poleceń spowoduje przekierowanie zarówno stderr, jak i stdout do sample.s

myprogram > sample.s 2>&1

Przekieruj stderr i stdout do / dev / null

Przekieruj do, /dev/nulljeśli chcesz całkowicie wyciszyć swoją aplikację.

myprogram >/dev/null 2>&1

13
W ostatnim brakuje operatora przekierowania; powinno być myprogram >/dev/null 2>&1(zwróć uwagę na klin przed /dev/nulli kolejność przekierowań).
tripleee

2
nie myprogram &>/dev/nullwystarczy?
JaviOverflow

38

Wszystkie dane wyjściowe:

scriptname &>/dev/null

Przenośny:

scriptname >/dev/null 2>&1

Przenośny:

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

Nowszy bash (nie przenośny):

scriptname &>-

To nie działa. W rzeczywistości tworzy plik o nazwie -i &>jest nieprzenośnym rozszerzeniem powłoki Bourne.
PhilT,

Przenośny odpowiednik echo moo 1>&-generuje błąd, ponieważ deskryptor pliku 1 jest zamknięty:-bash: echo: write error: Bad file descriptor
tripleee

11

Jeśli chcesz, aby STDOUT i STDERR [wszystko], to najprostszym sposobem jest:

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

następnie uruchom go jak ./script, a nie dostaniesz żadnego wyjścia na swój terminal. :)

„> &” oznacza STDERR i STDOUT. &również działa w ten sam sposób z rurą: ./script |& sed że wyśle wszystko sed


7
man bash (w sekcji „Przekierowywanie standardowego wyjścia i błędu standardowego”) mówi, że &> i> & są równoważne, ale preferowany jest pierwszy (&>). Jednak | & jest jedynym sposobem na zrobienie tego w przypadku rur.
John Mellor

1
@John Nie, przenośny sposób na rury toa 2>&1 | b 2>&1 | c
tripleee

9

Jeśli nadal masz trudności ze znalezieniem odpowiedzi, szczególnie jeśli utworzyłeś plik do wyjścia, i wolisz jasną alternatywę: echo "hi" | grep "use this hack to hide the oputut :) "


2
Ciekawy hack ... upvoting for spryt ^ _ ^
skplunkerin

4

Spróbuj z:

myprogram &>/dev/null

aby nie uzyskać żadnego wyniku


0

Uwaga: ta odpowiedź jest związana z pytaniem „Jak wyłączyć echo podczas wykonywania skryptu powłoki Linux”, które z kolei zostało oznaczone jako zduplikowane do tego.

Aby faktycznie wyłączyć echo, polecenie brzmi:

stty -echo

(jest to na przykład; gdy chcesz wprowadzić hasło i nie chcesz, aby było czytelne. Pamiętaj, aby włączyć echo na końcu skryptu, w przeciwnym razie osoba uruchamiająca skrypt nie zobaczy, co on / ona pisze od tego momentu. Aby włączyć echo podczas wykonywania:

stty echo


0

Przydatne w skryptach:


Pobierz tylko STDERR w pliku, ukrywając wszystkie STDOUT, nawet jeśli program do ukrycia w ogóle nie istnieje (nigdy nie zawiesza skryptu nadrzędnego), to samo działało:

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

Całkowicie odłącz i ucisz wszystko, nawet zabicie skryptu nadrzędnego nie zostanie przerwane ./prog:

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

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.