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
Sam
źródło
Z tego, co sobie przypominam, przekierowanie wyjścia do pliku powoduje, że nie jest on wysyłany do terminala. Co ci nie pasuje?
Anon.
serverfault.com/questions/41964/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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
John Kugelman
źródło
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
Debugger
źródło
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 &>-
Eduardo Cuomo
źródło
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

Matt
źródło
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 :) "

Henry H.
źródło
2
Ciekawy hack ... upvoting for spryt ^ _ ^
skplunkerin
4

Spróbuj z:

myprogram &>/dev/null

aby nie uzyskać żadnego wyniku

Swathi
źródło
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

Berni
źródło
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 &
NVRM
źródło
0

Do wyjścia tylko w przypadku błędu :

więc [polecenie]

Logo

Alberto Salvia Novella
źródło