Hogyan futtathat parancsot a háttérben, nincs kimenet, hacsak nincs hiba?
Ha elfoglalt személy vagy, akkor az utolsó dolog, amire szükséged van, hogy hatalmas mennyiségű "haszontalan" értesítéssel zavarjon, így hogyan lelassítod a dolgokat? A mai SuperUser Q&A posztnak nagyszerű válaszai vannak, amelyek segítenek az olvasónak, hogy lelassítsa a kimenet mennyiségét.
A mai Kérdések és válaszok munkamenet a Jóvagyon - a Stack Exchange alosztályának, a közösség által vezérelt Q&A webhelyek csoportjának köszönhetően..
A kérdés
A SuperUser olvasó Xster szeretné tudni, hogyan kell futtatni egy parancsot a háttérben, ha nincs hiba:
Hogyan utasíthatja el a parancs kimenetét, de mutassa meg, ha a parancs kilépési kódjai hibásak?
Hogyan kap egy parancsot a háttérben futó futtatás nélkül, hacsak nincs hiba?
A válasz
A SuperUser közreműködői Bob és Maximillian Laumeister válaszolnak számunkra. Először fel, Bob:
Sajnos, az a feltételezés, hogy stderr csak a hibakimenetnél használatos, nem mindig helyes. Inkább, stderr gyakran használják minden és minden interaktív kimenethez és diagnosztikához (azaz olyan kimenethez, amelyet a felhasználó egy interaktív üzenetben olvashat).(1) wget és dd jól ismert példák.
Egyes parancsok jelzést adnak (azaz a. -csendes vagy -csendes) a nem hiba kimenet elnyomása. Olvassa el a man oldalakat, hogy lássa, van-e ilyen.
Egy másik, gyakrabban megtartott egyezmény a kilépési kód, egy program kilépési kódot ad vissza, amikor kilép. tipikusan(2), kilépési kód 0 jelzi a sikert, és bármely más kilépési kód hibát jelez.
Val vel bash, az utolsó parancs kimeneti kódját a $? változó. Ban ben hal, használja a $ status változó. Lehet cső stderr ideiglenes fájlba, és csak akkor kerül nyomtatásra, ha hiba történik. Például (hal):
Néhány parancsikont akkor is használhat, ha nem parancsolja a parancsokat:
Vagy:
Ön is cső stdout ugyanazt a puffert használva 2> & 1> / tmp / kimeneti puffer.
(Jegyzet: Nem tudom hal, így a koncepciót a dokumentációmban található dolgokhoz igazítom. A szintaxis kissé rossz. Használhatja azt is mktemp egyedi ideiglenes fájl létrehozásához. Futtassa és rögzítse a fájl nevét egy változóban.)
Ha az egészet futtatni kell egy olyan shell hátterében, amelyet egyidejűleg interaktívan is használ, akkor jobb, ha írsz egy parancsfájlt a kimeneti elrejtés kezeléséhez és a parancsfájl futtatásához a háttérben a szokásos technikákkal (hal). Heck, akkor beilleszthetünk valamit, mint a következő funkció ~ / .Config / hal / config.fish:
Hívd fel néha csendes (ahol a hát & a háttérben fut)
Ne feledje, hogy ez lenyeli az eredeti kilépési kódot, és mindkettőt eldobja stdout és stderr meghibásodás esetén. Szükség szerint testre szabhatja.
(1) Nincs garancia arra, hogy a hiba kimenete nem jelenik meg stdout, egyes programok az összes kimenetet eldobják!
(2) Sajnos ez még mindig nem így van. A kilépési kódot a program teljesen ellenőrzi, és néhányan jeleznek néhány sikeres feltételet a nem nulla kilépésekkel. Ismét ellenőrizze a kézikönyvet.
Ezt követi a válasz: Maximillian Laumeister:
A Unix segédprogramok általános üzeneteket küldnek stdout, és hibaüzenetek stderr, így ha csak hibaüzeneteket akarunk látni, akkor elegendő lesz elnyomni stdout így csak stderr a kimenet a konzolra kerül.
Ennek módja (mindkettőben bash és hal) hozzá kell adni > / Dev / null a parancshoz. Ez a csövek stdout semmibe, de stderr (a hibaüzenetekkel együtt) még mindig a konzolra jut.
Így például:
A parancs echo 1> / dev / null semmit sem nyomtat, mert a normális stdout a kimenet el van nyomva, és semmit sem írtak stderr.
A parancs az ember doesnotexist> / dev / null kinyomtat egy hibaüzenetet, mert Férfi írja a hibaüzenetet stderr.
Van valami, amit hozzá kell adni a magyarázathoz? Kikapcsolja a megjegyzéseket. Szeretne további válaszokat olvasni más tech-savvy Stack Exchange felhasználóktól? Nézze meg a teljes beszélgetés szálát itt.