Stdr deyil, stdout-a necə qoşulmaq olar?

stdoutstderr üçün məlumat yazan bir proqramım var və stderr diqqət etmədən stderrə gedirik.

Əlbəttə, bunu 2 addımda edə bilərəm:

 command > /dev/null 2> temp.file grep 'something' temp.file 

ancaq müvəqqəti fayllar olmadan bunu edə biləcəyimi düşünürəm. Heç bir ağıllı fəndlər varmı?

818
26 февр. 26 fevral tarixində user80168 tərəfindən təyin olundu 2010-02-26 18:53 '10 at 18:53 2010-02-26 18:53
@ 11 cavab

İlk stdrr stdout boruya istiqamətləndirmək; sonra stdout'u /dev/null null'a yönləndirin (stderrın meydana gəldiyi yeri dəyişdirmədən):

 command 2> >/dev/null | grep 'something' 

I / O-nın bütün müxtəlifliyinə yönəldilməsi ilə bağlı ətraflı məlumat üçün, Bash istinad manualinin Redirections bölümünə baxın.

I / O reassignment ardıcıllığının soldan sağa doğru şərh edildiyini nəzərə alsaq, kanallar I / O şərhindən əvvəl tənzimlənir. 1 və 2 kimi fayl təsvirləri açıq fayl təsvirlərinə istinad edir. Əməliyyat 2>> fayl descriptorunu 2 açıqlayır, eyni zamanda fayl dup2() kimi eyni açıq fayl təsviri ilə istinad edir (hazırda dup2()open() )). >/dev/null əməliyyatında >/dev/null üçün açıq fayl təsvirinə istinadən fayl identifikatorunu 1 dəyişir, lakin bu, fayl təsvirçisinin 2 fayl təsvirçisinin ilk göstərildiyi açıq faylın təsvirinə istinad etməməsi faktını dəyişmir yəni boru.

972
26 февр. 26 Fevralda Jonathan Lefflerə cavab verin 2010-02-26 18:55 '10 at 18:55 2010-02-26 18:55

Və ya istifadə üçün stderr və stdout çıxışı: -

 command 3> 1> 2>> 
border=0

Bu yeni bir fayl təsvirçisi (3) yaradır və 1 (stdout) kimi eyni yerə təyin edir, sonra fd 1 (stdout) fd 2 (stderr) ilə eyni yerə verilir və nəhayət fd 2 (stderr) fd 3 (standart çıxış) ilə eyni yer. Stderr indi stdout olaraq mövcuddur və köhnə stdout stderr saxlanılır. Bu lazımsız ola bilər, amma ümid edirəm ki, bash fayl descriptorları haqqında ətraflı məlumat verəcəkdir (hər bir proses üçün 9 mövcuddur).

322
04 марта '10 в 21:18 2010-03-04 21:18 Cavab Kramish tərəfindən 04 Mart 2010 ' da 21:18' də verildi. 2010-03-04 21:18

Bash-da, prosesi əvəz etməklə bir subshell üçün yönləndirə bilərsiniz:

 command > >(stdlog pipe) 2> >(stderr pipe) 

Bu vəziyyətdə:

 command 2> >(grep 'something') >/dev/null 
184
09 февр. Cavab 09 fevralda Rich Johnson tərəfindən verilir. 2012-02-09 22:14 '12 at 10:14 pm 2012-02-09 22:14

Əgər bu cür cavabları ən yaxşı şəkildə birləşdirsəniz:

command 2> >(grep -v something 1>>

... bütün stdout stdout olaraq saxlanılır bütün stderr stderr kimi saxlanılır, ancaq "bir şey" simli olan stderr xəttlərini görməyəcəksiniz.

Bu stdout və stderr dəyişdirmək və ya aradan qaldırılması, onları birləşdirmək və müvəqqəti faylları istifadə etməyin ki, unikal üstünlüyü var.

154
11 апр. Cavab 11 aprel tarixində Pinko tərəfindən verilir. 2013-04-11 00:05 '13 'da 0:05 2013-04-11 00:05

Həqiqətən, "redirection" və "pipes" ilə nə baş verdiyini düşünsəniz, şeyi görselleştirmek çox asandır. Başdakı redirections və kanallar bir şey: proses fayl təsvirləri 0, 1 və 2 nöqtəsi (bax / Proc / [pid] / fd / * bax) dəyişin.

Boru və ya "|" ifadəsi komanda xəttində mövcuddur, baş verən ilk şey bash fifo yaradır və sol komanda əmrini FD 1-ə bu fifo'ya verir və FD 0-un sağ tərəfi əmrini eyni fifo'ya verir.

Bundan əlavə, hər bir tərəf üçün yönlendirme ifadələri soldan sağa dəyərləndirilir və cari göstəricilər bir təsvirin çoğaltıldığı zaman istifadə olunur. Bu, vacibdir, çünki kanal əvvəlcədən konfiqurasiya olunduqdan sonra, FD1 (sol tərəf) və FD0 (sağ tərəf) artıq ola biləcək şeylərdən dəyişdirilir və bunların hər hansı təkrarlanması bu həqiqəti əks etdirəcəkdir.

Buna görə də, aşağıdakı kimi bir şeyə daxil olduqda:

 command 2> >/dev/null | grep 'something' 

İşdə nə olar?

  • bir boru yaradılıb (fifo). Bu kanalda "FD1 əmri" göstərilir. "grep FD0" həmçinin bu boru kəmərinə aiddir.
  • "FD2 komandası" hazırda "FD1 komandası" nı göstərdiyini göstərir (boru)
  • / Dev / null'da göstərilən "FD1 komanda"

Beləliklə, "komanda" FD 2 (stderr) yazdığı bütün çıxış boruya doğru yola çıxır və digər tərəfdən "grep" oxuyur. "Əmr" FD 1-ə (stdout) yazdıqları bütün çıxış, / dev / null-a çatır.

Əvəzinə aşağıdakıları yerinə yetirirsinizsə:

 command >/dev/null 2> | grep 'something' 

İşdə nə baş verir?

  • bir boru yaradılıb və "FD 1 komanda" və "grep FD 0" göstərilmişdir
  • "FD 1 komutu" / dev / null'da göstərilir
  • "FD 2 əmri" FD 1-in hazırda göstərdiyini göstərir (/ dev / null)

Belə ki, "komanda" dan gələn bütün stdout və stderr / dev / null gedir. Boruda heç bir şey olmaz, beləliklə "grep" ekranda heç bir şey göstərmədən bağlanacaq.

Ayrıca redirections (fayl tanımlayıcıları) yalnız oxumaq (<), yalnız yazmaq (>) və ya oxumaq-yazmaq (<>).

Son qeyd. Proqramın FD1 və ya FD2-ə bir şey yazdığına baxmayaraq, proqramçıya tamamilə asılıdır. Yaxşı bir proqramlaşdırma təcrübəsi, səhv mesajların FD 2-də və FD-1-də normal çıxışa keçməsini tələb edir, ancaq siz tez-tez iki tərəfi qarışdırır və ya konvensiyanı gözardı edirsiniz.

89
20 авг. Cavab Michael Martinez 20 Avqust 2013-08-20 21:09 '13 at 21:09 2013-08-20 21:09

Bash istifadə edirsiniz? Əgər bəli:

 command >/dev/null | grep "something" 

http://www.gnu.org/software/bash/manual/bashref.html#Pipelines

28
19 апр. 19 Aprel tarixində Ken Sharp tərəfindən verilmiş cavab 2014-04-19 00:56 '14 'də 0:56 2014-04-19 00:56

Stdout və stderr-ı əbədi yönəldmək istəyənlər üçün, gred-dən stderr, ancaq tty-də mesaj yazmaq üçün stdout saxlaya bilərsiniz:

 # save tty-stdout to fd 3 exec 3> # switch stdout and stderr, grep (-v) stderr for nasty messages and append to files exec 2> >(grep -v "nasty_msg" >> std.err) >> std.out # goes to the std.out echo "my first message" > # goes to the std.err echo "a error message" > # goes nowhere echo "this nasty_msg won't appear anywhere" > # goes to the tty echo "a message on the terminal" >> 
9
14 нояб. Cavab JBD 14 noyabrda verilir . 2012-11-14 11:59 '12 at 11:59 2012-11-14 11:59

Bu command1 stderr command2 stdin-ə yönəldiləcək və command1 stdout-u buraxır.

 exec 3> command1 2> > 3> | command2 3> exec 3>> 

LDP- dən götürülmüşdür

5
07 окт. CavabDolphin tərəfindən verilir 07 oktyabr 2014-10-07 10:39 '14 at 10:39 2014-10-07 10:39

Mən stdout bir stderrstderr adlandırılmış borulardan istifadə stderr üçün göndərdim.

İşdə.

 mkfifo stdout-target mkfifo stderr-target cat < stdout-target | command-for-stdout  cat < stderr-target | command-for-stderr  main-command 1>stdout-target 2>stderr-target 

Daha sonra adlandırılan boruları silmək yaxşı bir fikirdir.

1
09 авг. Tripp Kinetics tərəfindən verilən cavabı 09 Avqust. 2018-08-09 21:35 '18 saat 21:35 'da 2018-08-09 21:35

Mən kimi şeylər etməyə çalışıram

kompozitor və >> / tmp / bob test vim / tmp / bob rm / tmp / bob

0
15 янв. Cavab 15 yanvar tarixində djfm verilir 2019-01-15 22:42 '19 saat 10:42 'da 2019-01-15 22:42

Mən də əməl etməyə çalışıram, işə dəvət edirəm,

 command > /dev/null 2> | grep 'something' 
-3
11 апр. Cavab sona çatdı 11 Aprel 2014-04-11 06:27 '14 at 06:27 2014-04-11 06:27

Tags haqqında suallar və ya bir sual