19Aug

Jak uruchomić polecenie w tle bez wyjścia, chyba że wystąpił błąd?

Jeśli jesteś osobą zapracowaną, to ostatnią rzeczą, której potrzebujesz, jest przeszkadzanie ogromnej ilości "bezużytecznych" powiadomień, więc jak możesz je uspokoić?Dzisiejszy post SuperUser Q & A ma kilka świetnych odpowiedzi, które pomogą czytelnikowi wyciszyć wydajność.

Dzisiejsze pytanie &Sesja odpowiedzi przychodzi do nas dzięki uprzejmości SuperUser - poddziału Stack Exchange, opartego na społecznościach grupy Q & A.

Pytanie

Czytnik SuperUser Xster chce wiedzieć, jak uruchomić polecenie w tle bez wyjścia, chyba że wystąpił błąd:

Jak tłumić dane wyjściowe polecenia, ale pokazać je, jeśli polecenie exit kody?

Jak uzyskać polecenie uruchamiania w tle bez danych wyjściowych, chyba że wystąpił błąd?

Odpowiedź Odpowiedzi

SuperUser Bob i Maximillian Laumeister mają dla nas odpowiedź.Najpierw, Bob:

Niestety, założenie, że stderr służy tylko do wyjścia błędu, nie zawsze jest poprawne. Zamiast tego stderr jest często wykorzystywany do dowolnego interaktywnego wyjścia i diagnostyki( tj. Wyjście przeznaczone do odczytu przez użytkownika w interaktywnym monitorze).

( 1) wget i dd są dobrze znanymi przykładami.

Niektóre polecenia dostarczają flagę( tj. - cicha lub - płynna ) w celu powstrzymania braku błędów wyjściowych. Przeczytaj ich strony man, aby sprawdzić, czy istnieje.

Inną konwencją, która ma częściej jest , program zwraca kod wyjścia po jego wyjściu. Zazwyczaj ( 2) , kod zakończenia 0 wskazuje na sukces, a każdy inny kod wyjścia wskazuje na błąd.

Z bash , możesz uzyskać kod zakończenia ostatniego polecenia z $?Zmienna .W ryby , użyj zmiennej $ status .Możesz przesyłać stderr do pliku tymczasowego i drukować go tylko w przypadku wystąpienia błędu. Na przykład( fish ):

Możesz również użyć niektórych skrótów, jeśli nie łańcuchujesz komend:

Lub:

Możesz także przekierować stdout do tego samego bufora używając 2 & gt; & gt;/tmp/ bufor wyjściowy .

( Uwaga: Tak naprawdę nie znam ryb , więc dostosowuję koncepcję do tego, co mogę znaleźć w jej dokumentacji. Kompletność może być nieco błędna. Możesz również użyć mktemp do wygenerowania unikalnego tymczasowegoplik: uruchom go i zapisz nazwę pliku w zmiennej.)

Jeśli chcesz uruchomić całość w tle powłoki, której używasz jednocześnie w tym samym czasie, lepiej jest napisać skrypt do obsługiwyjście - ukrywanie i uruchamianie tego skryptu w tle za pomocą standardowych technik( fish ).Heck, możesz umieścić coś podobnego do następującej funkcji ~ /.config/fish/ config.fish :

Zadzwoń z run-silent somecommand &( gdzie kończy się i powoduje, że działa on w tle)

Zauważ, że to pochłonie oryginalny kod wyjścia, i zrzuci oba stdout i stderr w przypadku awarii. W razie potrzeby możesz go dostosować.

( 1) Nie ma gwarancji, że wyjście błędu nie pojawi się na stdout , niektóre programy zrzucą tam wszystkie dane wyjściowe!

( 2) Niestety, nie zawsze tak jest. Kod wyjścia jest całkowicie kontrolowany przez program, a niektóre z nich wskazują pewne warunki powodzenia z niezerowymi wyjściami. Ponownie sprawdź instrukcję.

Po odpowiedzi od Maximilliana Laumeistera: narzędzia

Unix wysyłają ogólne komunikaty do stdout , a także komunikaty o błędach do stderr , więc jeśli chcemy tylko zobaczyć komunikaty o błędach, to wystarczy powstrzymać stdout , abytylko stderr dostaje wyjście do konsoli.

Aby to zrobić( zarówno w bash i fish ) należy dołączyć & gt;/dev/ null do polecenia. Ta rura jest stdout w nicość, ale stderr ( z twoimi komunikatami o błędach) nadal przechodzi do konsoli.

Tak na przykład:

Polecenie echo 1 & gt;/dev/ null nic nie drukuje, ponieważ normalne wyjście jest wyłączone i nic nie zostało zapisane w stderr .

Komenda man doesnotexist & gt;/dev/ null drukuje komunikat o błędzie, ponieważ człowiek zapisuje swój komunikat o błędzie do stderr .

Czy chcesz coś dodać do wyjaśnienia? Dźwięk w komentarzach. Chcesz przeczytać więcej odpowiedzi od innych użytkowników Stack Exchange, którzy znają się na technologii? Sprawdź cały wątek dyskusji tutaj.