19Aug
Ha elfoglalt ember vagy, akkor az utolsó dolog, amire szükséged van, óriási "haszontalan" értesítésekkel kell megküzdeni, így hogyan csendesd le a dolgokat? A mai SuperUser Q & A bejegyzésnek nagyszerű válaszai vannak annak érdekében, hogy az olvasó csökkentse a kimeneti mennyiséget.
A mai kérdés &A válaszüzenet a SuperUser - a Stack Exchange megosztottságának köszönhetően - a Q & A webhelyek közösségi szintű csoportosítása.
A kérdés
SuperUser olvasó Xster szeretné tudni, hogyan kell futtatni egy parancsot a háttérben, ha nincs hiba, ha nincs hiba:
Hogyan szünteti meg a parancs kimenetét, de megmutatja, ha a parancs kilépési kódja hiba?
Hogyan kaphat parancsot a háttérben történő futtatáshoz, ha nincs kimenet, hacsak nincs hiba?
A válasz
A SuperUser szerzői Bob és Maximillian Laumeister válaszolnak ránk. Először is, Bob:
Sajnos az a feltételezés, hogy az stderr csak hibás kimenetre használható, nem mindig helyes. Inkább, az stderr gyakran használatos minden interaktív kimenetre és diagnosztikára( vagyis arra a kimenetre, amelyet a felhasználónak interaktív promptban kell olvasnia).
( 1) wget és dd jól ismert példák.Egyes parancsok jelzőt( azaz -quiet vagy -silent ) jeleznek a nem hibás kimenet elnyomásához. Olvassa el a man oldalakat, hogy lássa, létezik-e.
Egy másik, gyakrabban megtartott egyezmény az kilépési kód , a program kilépési kódot ad vissza kilépéskor. Jellemzően ( 2) , az 0 kimenő kódja jelzi a sikert, és minden más kilépési kód hibát jelez.
Az bash paranccsal megkaphatja az utolsó parancs kilépési kódját a $ -ból? változó.Az halban , használd a $ állapotú változót. Csatolhatja az ideiglenes fájlt az stderr fájlba, és csak akkor nyomtathatja ki, ha hiba történik. Például( hal ):
Néhány parancsikont is használhat, ha nem láncolási parancsok:
Vagy:
Az stdout csomópontot 2 & 1 & gt;/tmp/ kimeneti puffer .
( Megjegyzés: Nem igazán tudom halat , ezért a koncepciót hozzáigazítom ahhoz a dokumentumhoz, amit a dokumentációban találok, a szintaxis kissé rossz lehet, és a mktemp Futtassa le, és rögzítse a fájl nevét egy változóban.)
Ha az egészet egy olyan shell shell-ként kell futtatnia, amelyet ugyanakkor interaktív módon is használ, akkor jobb, ha egy scriptet írsza kimenet elrejtése és a parancsfájl háttérben való futtatása a standard technikákkal( hal ).Heck, az ~ /.config/fish/ config.fish ~ /.config/fish/ konfigurációban :
Hívás futás-csendes valamilyen parancssal &( ahol a háttérben futó & )
Vegye figyelembe, hogy ez lenyeli az eredeti kilépési kódot, és meghibásodás esetén mind az stdout , mind az stderr -t eldobja. Szükség szerint testre szabhatja.
( 1) Nincs garancia arra, hogy a hiba kimenet nem jelenik meg a stdout alatt, egyes programok az összes kimenetet eldobják!
( 2) Sajnos ez még mindig nem mindig így van. A kilépési kódot teljes mértékben a program vezérli, és néhányan néhány sikerteljesítményt jeleznek a nullától eltérõ kimenetekkel. Ismét ellenőrizze a kézikönyvet.
Maximálisan Laumeister válasza:
A Unix segédprogramok általános üzeneteket küldenek a stdout -nak, és a hibaüzenetek a stderr -re, tehát ha csak hibaüzeneteket szeretnénk látni, elég lesz a stdout csak a stderr kapja a kimenetet a konzolhoz.
Ennek módja( bash és hal ) az & gt;/dev/ null a parancshoz. Ez a csövek stdout -t semmi sem, de az stderr ( a hibaüzenetekkel együtt) még mindig átjut a konzolra.
Például:
Az parancs echo 1 & gt;/dev/ null Az nem nyomtat semmit, mert a normál stdout kimenet el van nyomva, és semmit sem írtak az stderr -re.
Az parancs man doesnotexist & gt;/dev/ null kinyomtat egy hibaüzenetet, mert man írja a hibaüzenetet az stderr -re.
Van valami, amit hozzá lehet adni a magyarázathoz? Hangzik ki a megjegyzésekben. Szeretne többet válaszolni a többi technikus-tudós Stack Exchange felhasználóiról? Nézze meg a teljes vitafonalat itt.