Jak spustit příkaz na pozadí bez výstupu, pokud se neobjeví chyba?
Pokud jste zaneprázdněná osoba, pak je poslední věc, kterou potřebujete, být obtěžována obrovským množstvím "zbytečných" upozornění, tak jak to utišujete? Dnešní příspěvek SuperUser Q & A obsahuje několik skvělých odpovědí, které pomáhají čtenáři ztišit množství výstupu.
Dnešní zasedání Otázky a odpovědi nás přichází s laskavým svolením SuperUser - podřízené rozdělení Stack Exchange, které je založeno na komunitě prostřednictvím skupin webových stránek.
Otázka
Čtečka SuperUser Xster chce vědět, jak spustit příkaz na pozadí bez výstupu, pokud se neobjeví chyba:
Jak potlačujete výstup příkazu, ale ukažte, že pokud příkaz ukončí chybu?
Jak dostanete příkaz k běhu na pozadí bez výstupu, pokud nedojde k chybě?
Odpověď
Uživatelé SuperUser Bob a Maximillian Laumeister mají pro nás odpověď. První, Bob:
Bohužel, předpoklad, že stderr se používá pouze pro chybový výstup, který není vždy správný. Spíše, stderr se často používá 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. -klid nebo -tichý) pro 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 exit code, program vrátí při ukončení výstupní kód. Typicky(2), výstupní kód 0 označuje úspěch a jakýkoli jiný kód ukončení indikuje chybu.
S bash, můžete získat kód ukončení posledního příkazu z $? proměnná. v Ryba, použijte $ status proměnná. Můžete potrubí stderr do dočasného souboru a vytiskněte jej pouze v případě, že dojde k chybě. Například (Ryba):
Můžete také použít některé klávesové zkratky, pokud nejste řetězové příkazy:
Nebo:
Můžete také potrubí stdout do stejné vyrovnávací paměti pomocí 2> & 1> / tmp / outputbuffer.
(Poznámka: Vlastně nevím Ryba, takže přizpůsobím koncept tomu, co mám najít ve své dokumentaci. Syntaxe může být mírně špatná. Můžete také použít mktemp generovat jedinečný dočasný soubor. Spusťte jej a zaznamenávejte název souboru v proměnné.)
Pokud potřebujete spustit celou věc na pozadí prostředí, ve kterém současně pracujete interaktivně, je lepší psát skript pro zpracování skrytí výstupu a spuštění daného skriptu na pozadí pomocí standardních technik (Ryba). Sakra, můžete vložit něco jako následující funkce ~ / .config / fish / config.fish:
Zavolejte run-silent somecommand & (kde je koncovka A & způsobuje to, že běží na pozadí)
Všimněte si, že toto bude pohlcovat původní kód ukončení a obojího vyskočí stdout a stderr v případě selhání. Můžete jej upravit podle potřeby.
(1) Neexistuje žádná záruka, že se chybový výstup nezobrazí stdout, některé programy vypaří všechny výstupy tam!
(2) Bohužel to stále není vždycky. Kód výstupu je zcela řízen programem a některé ukazují některé podmínky úspěšnosti s nenulovými výstupy. Znovu zkontrolujte příručku.
Následuje odpověď od Maximilliana Laumeistera:
Pomůcky Unixu posílají obecné zprávy stdout, a chybových zpráv stderr, takže pokud budeme chtít vidět pouze chybové zprávy, stačí to potlačit stdout tak to jen stderr dostane výstup do konzoly.
Způsob, jak to udělat (v obou bash a Ryba) je připojit > / dev / null k příkazu. Toto potrubí stdout do nicoty, ale stderr (s chybovými zprávami) stále přichází do konzoly.
Tak například:
Příkaz echo 1> / dev / null nevytiskne nic, protože normální stdout výstup je potlačen a nebylo zapsáno nic stderr.
Příkaz člověk nenapsuje> / dev / null vytiskne chybovou zprávu, protože muž píše své chybové hlášení stderr.
Musíte něco přidat k vysvětlení? Vyjměte 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.