19Aug

Kako izvajate ukaz v ozadju brez izhoda, razen če je prišlo do napake?

Če ste zasedeni oseba, potem zadnja stvar, ki jo potrebujete, je, da se z velikim številom "neuporabnih" obvestil z motnjami, zato, kako naj počakate stvari navzdol? Današnji SuperUser Q & Objava ima nekaj odličnih odgovorov, ki bi bralcu pomirili znesek proizvodnje.

Današnje vprašanje &S sejo odgovora prihaja uporaba SuperUserja, ki je razdeljena na Stack Exchange, skupinsko spletno stran Q & A.

Vprašalnik

SuperUser čitalec Xster želi vedeti, kako zagnati ukaz v ozadju brez izhoda, razen če je prišlo do napake:

Kako zatiskate izhod ukaza, vendar ga pokažite, če je ukaz za izhod v kodo napaka?

Kako dobite ukaz za zagon v ozadju brez izhoda, razen če pride do napake?

Odgovor za

SuperUser, ki je odgovoril za nas, sta Bob in Maximillian Laumeister. Najprej navzgor, Bob:

Na žalost se domneva, da se stderr uporablja le za izhod napake, ni vedno pravilna. Nasprotno, stderr se pogosto uporablja za vse interaktivne izhode in diagnostiko( to je izhod, namenjen uporabniku, da se prebere v interaktivnem pozivu).( 1) wget in dd so dobro znani primeri.

Nekateri ukazi bodo zagotovili zastavo( npr. -vse ali -senzor ), da bi preprečili izhod brez napak. Preberite njihove manjše strani, če želite videti, ali obstaja.

Druga konvencija, ki pogosteje drži, je izhodna koda , program ob izhodu vrne izhodno kodo. Običajno ( 2) , izhodna koda 0 označuje uspeh, druga katera koli izhodna koda pa pomeni napako.

Z bash lahko dobite izhodno kodo zadnjega ukaza iz $?Spremenljivka .V ribi uporabite spremenljivko status $.Strežnik stderr lahko vstavite v začasno datoteko in ga natisnete samo, če pride do napake. Na primer( ribe ):

Uporabite lahko tudi nekatere bližnjice, če niste ukazi za veriženje:

Ali:

Stedno stdout lahko tudi vstavite v isti medpomnilnik z uporabo 2 & gt; & 1 & gt;/tmp/ izhodni bobnik .

( Opomba: Pravzaprav ne poznam ribe , zato prilagodim koncept na to, kar lahko najdem v dokumentaciji. Sintaksa je lahko nekoliko napačna. Poleg tega lahko mktemp uporabite za ustvarjanje edinstvenega začasnegadatoteko. Zaženite to in zapišite ime datoteke v spremenljivki.)

Če morate celotno stvar zagnati v ozadju lupine, ki jo hkrati uporabljate interaktivno, potem je bolje, če pisate skript za ravnanjeizhod-skrivanje in vodenje tega skripta v ozadju s standardnimi tehnikami( riba ).Heck, v ~ /.config/fish/ config.fish lahko postavite nekaj takega kot :

Klic z -om, ki je tiho zaustavljen somecomand &( kjer sledi in povzroči, da teče v ozadju)

Upoštevajte, da bo to poglilo prvotno izhodno kodo in bo v primeru okvare padlo tako stdout kot stderr .Po potrebi ga lahko prilagodite.

( 1) Ni nobenega zagotovila, da se izhod napake ne prikaže na stdout , nekateri programi bodo izpustili vse rezultate tam!

( 2) Na žalost to še vedno ni vedno tako. Izhodno kodo je popolnoma nadzorovano s programom, nekateri pa bodo pokazali nekatere pogoje uspeha z ničelnimi izhodi. Spet preverite priročnik.

Sledi odgovor Maximillian Laumeister:

Unix utilities pošiljajo splošna sporočila stdout in sporočila o napakah stderr , zato, če želimo samo prikazati sporočila o napakah, zadostuje, da zataknete stdout , tako dasamo stderr dobi izhod na konzolo.

Način za to( v obeh bash in rib ) je dodati & gt;/dev/ null v ukaz. Ta cevi stdout v nič, ampak stderr ( s sporočili o napakah) še vedno pride do konzole.

Tako na primer:

Ukaz echo 1 & gt;/dev/ null nič ne natisne, ker je normalen stdout izklopljen in nič ni bilo napisano v stderr .

Ukaz človek doesnotexist & gt;/dev/ null natisne sporočilo o napaki, ker človek napiše sporočilo o napaki stderr .

Ali želite dodati nekaj pojasnila? Zvok v komentarjih.Želite prebrati več odgovorov od drugih uporabniških članov stack Exchange? Oglejte si celotno temo za razpravo tukaj.