19Aug

Jak spustíte příkaz na pozadí bez výstupu, pokud nedojde k chybě?

click fraud protection

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.

instagram viewer

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.