19Aug
Pokud jste zaneprázdněná osoba, pak poslední věc, kterou potřebujete, je obtěžovat s obrovským množstvím "zbytečných" oznámení, tak jak to utišujete? Dnešní příspěvek SuperUser Q & A má několik skvělých odpovědí, které pomáhají čtenáři ztišit množství výstupu.
dnešní otázka &Odpověď na zasedání se k nám dostala s laskavým svolením SuperUser - podřízenou výměnou Stack Exchange, skupině webů Q & A založených na komunitě.
Otázka
Reader SuperUser Xster chce vědět, jak spustit příkaz na pozadí s žádným výstupem, pokud chyba neexistuje:
Jak potlačujete výstup příkazu, ale ukažte, že pokud příkaz ukončí chybu?
Jak získáte příkaz k běhu na pozadí bez výstupu, pokud nedojde k chybě?
Odpovědí odpovědí pro uživatele
SuperUser Bob a Maximillian Laumeister nám odpovídají.První, Bob:
Bohužel, předpoklad, že stderr se používá pouze pro výstup chyby, není vždy správný.Spíše stderr je často používán pro všechny interaktivní výstupy a diagnostiku( tj. Výstup určený uživateli k čtení v interaktivním výzvě).( 1) wget a dd jsou dobře známé příklady.
Některé příkazy poskytnou příznak( tj. -quiet nebo -silent ) k potlačení výstupu bez chyby. Přečtěte si jejich stránky mana, abyste zjistili, zda existuje.
Další konvence, která platí častěji, je kód , program vrátí při ukončení kód ukončení.Typicky ( 2) , výstupní kód 0 označuje úspěch a jakýkoli jiný kód ukončení označuje chybu.
S bash můžete získat kód posledního příkazu z $?Proměnná .V ryby použijte proměnnou $ . stderr můžete přenést do dočasného souboru a vytisknout jej pouze v případě, že dojde k chybě.Například( ryby ):
Můžete také použít některé klávesové zkratky, pokud nejste řetězecí příkazy:
nebo:
stdout můžete také potopit do stejné vyrovnávací paměti pomocí 2 & gt; 1 & gt;Výstupní /tmp/ .
( Poznámka: Vlastně neznám ryby , takže jsem přizpůsobil koncept tomu, co mám najít ve své dokumentaci. Tato syntaxe může být mírně špatná.Můžete také použít mktemp k vytvoření jedinečného dočasnéhosoubor spusťte a zaznamenat název souboru v proměnné.)
Pokud potřebujete spustit celou věc na pozadí shellu, který také používáte interaktivně současně, pak byste měli lépe psát skript, který se má zpracovatvýstup - skrytí a spuštění tohoto skriptu na pozadí se standardními technikami( fish ).Heck, můžete v ~ /.config/fish/ umístit něco podobného jako config.fish :
Volání s run-silent somecommand &( kde koncové a způsobí, že běží na pozadí)
Všimněte si, že to bude přehrát původní kód exit a vyskočí oba stdout a stderr v případě selhání.Můžete jej upravit podle potřeby.
( 1) Neexistuje žádná záruka, že chybový výstup se nezobrazí na stdout , některé programy vypaří všechny výstupy tam!
( 2) Bohužel, stále tomu tak není.Výstupní kód je zcela řízen programem a některé ukazují některé podmínky úspěšnosti s nenulovými výstupy. Znovu zkontrolujte manuál.
Následuje odpověď společnosti Maximillian Laumeister:
Unixové nástroje posílají obecné zprávy stdout a chybové zprávy stderr , takže pokud chceme vidět pouze chybové zprávy, stačí potlačit stdout tak, abypouze stderr získá výstup do konzoly.
Cesta k tomu( bash a fish ) je připojit & gt;/dev/ null k příkazu. Tato potrubí stdout do nicoty, ale stderr ( s chybovými zprávami) stále přichází do konzoly.
Takže například:
Příkaz echo 1 & gt;/dev/ null nevytiskne nic, protože normální stdout výstup je potlačen a nic nebylo zapsáno do stderr .
Příkaz man doesnotexist & gt;/dev/ null vytiskne chybovou zprávu, protože píše své chybové hlášení stderr .
Musíte něco přidat k vysvětlení?Zní to v komentářích. Chcete se dozvědět více odpovědí od ostatních uživatelů technologie Stack Exchange? Podívejte se na celý diskusní příspěvek zde.