19Aug

Hogyan futtatunk egy parancsot a háttérben, ha nincs kimenet, hacsak nincs hiba?

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.