If-Koubou

Kā jūs palaižat komandu fonā bez izejas, ja vien nav kļūda?

Kā jūs palaižat komandu fonā bez izejas, ja vien nav kļūda? (Kā)

Ja esat aizņemts cilvēks, tad viss, kas jums nepieciešams, ir jāuztraucas ar milzīgu daudzumu "bezjēdzīgu" paziņojumu, tad kā jūs varat nomierināt lietas? Šodienas SuperUser Q & A ziņai ir dažas lieliskas atbildes, lai palīdzētu lasītājam samazināt produkcijas apjomu.

Šodienas jautājumu un atbilžu sesija mums priecājas par SuperUser - Stack Exchange dalību, kas ir kopienas vadīta Q & A tīmekļa vietņu grupa.

Jautājums

SuperUser lasītājs Xster vēlas zināt, kā palaist komandu fonā bez izejas, ja vien nav kļūda:

Kā jūs pārtraucat komandas izvadi, bet parādīsiet, vai komandas izeja kodē kļūdu?

Kā jūs saņemat komandu palaist fonā bez izejas, ja vien nav kļūda?

Atbilde

SuperUser autori Bobs un Maximillian Laumeister ir atbildīgi par mums. Pirmkārt, Bobs:

Diemžēl pieņēmums, ka stderr tiek izmantots tikai kļūdas rezultātu ne vienmēr ir pareizi. Drīzāk stderr bieži vien tiek izmantots jebkurai un jebkurai interaktīvai produkcijai un diagnostikai (t.i., produkcijai, kas paredzēta lietotājam lasīšanai interaktīvā uzvednē).(1) wget un dd ir labi zināmi piemēri.

Dažas komandas nodrošinās karodziņu (t.i. -veikts vai -silentīgs), lai novērstu kļūdu bez kļūdām. Izlasiet viņu vīriešu lapas, lai redzētu, vai tā pastāv.

Vēl viena konvencija, kas notiek biežāk, ir izejas kods, programma atgriež izejas kodu, kad tā iziet. Parasti(2), izejas kods 0 norāda uz panākumiem, un jebkurš cits izslēgšanas kods norāda kļūdu.

Ar bash, jūs varat iegūt pēdējās komandas izejas kodu no $? mainīgais. In zivis, izmantojiet $ statuss mainīgais. Tu vari cauruties stderr uz pagaidu failu un to izdrukā tikai tad, ja rodas kļūda. Piemēram (zivis):

Jūs varat izmantot arī dažus īsceļus, ja neesat ķēdes komandu:

Vai arī:

Jūs varat arī cauruties stdout uz to pašu buferi, izmantojot 2> & 1> / tmp / outputbuffer.

(Piezīme: Es patiesībā nezina zivis, tādēļ es konceptu pielāgoju to, ko var atrast dokumentācijā. Sintakse var būt nedaudz nepareiza. Arī jūs varat izmantot mktemp lai radītu unikālu pagaidu failu. Palaidiet to un ierakstiet faila nosaukumu mainīgā.)

Ja jums jāpārvieto visa lieta čaulas fonā, kuru jūs vienlaicīgi izmantojat arī interaktīvā veidā, tad jums ir labāk rakstīt skriptu, lai apstrādātu izvades slēpšanu un darbinātu šo skriptu fonā ar standarta metodēm (zivis) Heck, jūs varat ievietot kaut ko līdzīgu šādai funkcijai ~ / .config / fish / config.fish:

Zvanīt ar run-silent somecommand & (kur beidzas & liek tai darboties fonā)

Ņemiet vērā, ka tas norij sākotnējo izejas kodu un atteiks abus stdout un stderr ja rodas neveiksme. Varat to pielāgot, ja nepieciešams.

(1) Nav garantijas, ka kļūdas izlaide netiks parādīta stdout, dažas programmas visās produkcijās nojauc to!

(2) Diemžēl tas vēl ne vienmēr ir. Programmu pilnībā pārrauga izejas kodu, un daži norāda veiksmes nosacījumus ar nulles izejām. Atkal pārbaudiet rokasgrāmatu.

Seko Maximillian Laumeister atbilde:

Unix komunālie pakalpojumi sūta vispārīgus ziņojumus uz stdoutun kļūdas ziņojumus uz stderr, tāpēc, ja mēs tikai vēlamies redzēt kļūdas ziņojumus, tad to būs pietiekami, lai izslēgtu stdout tā tikai tikai stderr izvada konsole.

Veids, kā to izdarīt (abos bash un zivis) ir jāpievieno > / dev / null uz komandu. Šīs caurules stdout netikumā, bet stderr (ar jūsu kļūdas ziņojumiem) joprojām tiek rādīta konsole.

Piemēram:

Komanda echo 1> / dev / null neko nedrukā, jo tas ir normāls stdout izlaide ir nomākta, un nekas netika rakstīts stderr.

Komanda man doesnotexist> / dev / null izdrukā kļūdas ziņojumu, jo cilvēks raksta savu kļūdas ziņojumu stderr.

Vai kaut ko pievienot paskaidrojumam? Skatieties komentāros. Vēlaties lasīt citas atbildes no citiem tehnoloģiju savvy Stack Exchange lietotājiem? Šeit skatiet pilnu diskusiju pavedienu.