Stdout නොව, stderr නල කරන්නේ කෙසේද?


1001

මම තොරතුරු කියවීම කරන වැඩපිළිවෙලක් stdoutසහ stderr, සහ මට අවශ්ය grepපැමිණෙන දේ හරහා stderr නොසලකා හරිමින් අතර, stdout .

මට එය පියවර 2 කින් කළ හැකිය:

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

නමුත් තාවකාලික ලිපිගොනු නොමැතිව මෙය කිරීමට මම කැමැත්තෙමි. ස්මාර්ට් පයිප්ප උපක්‍රම තිබේද?


1
ඒ හා සමාන ප්‍රශ්නයක්, නමුත් stdout
joeytwiddle

මෙම ප්‍රශ්නය බාෂ් සඳහා වූ නමුත් බෝර්න් / ඇල්ම්ක්විස්ට් ෂෙල් සඳහා මෙම අදාළ ලිපිය සඳහන් කිරීම වටී .
ස්ටීවන් නීඩ්සෙල්ස්කි

11
මම මේ වගේ දෙයක් බලාපොරොත්තු වුණා : command 2| othercommand. බාෂ් කෙතරම් පරිපූර්ණද යත් 1982 දී සංවර්ධනය අවසන් විය, එබැවින් අපි එය කිසි විටෙකත් නොදකිනු ඇත.
රොල්ෆ්

Answers:


1214

පළමුව stderr stdout වෙත හරවා යැවීම - නළය; ඉන්පසු stdout වෙත හරවා යවන්න /dev/null(stderr යන්නේ කොතැනටද යන්න වෙනස් නොකර):

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

I / O යළි හරවා යැවීම පිළිබඳ සියලු විස්තර සඳහා , Bash යොමු අත්පොතේ යළි-යොමුවීම් පිළිබඳ පරිච්ඡේදය බලන්න .

I / O යළි-යොමුවීම් අනුක්‍රමය වමේ සිට දකුණට අර්ථ නිරූපණය කරන බව සලකන්න, නමුත් I / O යළි-යොමුවීම් අර්ථ නිරූපණය කිරීමට පෙර පයිප්ප සකසා ඇත. 1 සහ 2 වැනි ගොනු විස්තර කරන්නන් විවෘත ගොනු විස්තර සඳහා යොමු කිරීම් වේ. මෙම ක්‍රියාව 2>&1මඟින් ගොනු විස්තර කරන්නා 2 aka stderr එකම විවෘත ගොනු විස්තරය ගොනු විස්තර කරන්නා 1 aka stdout දැනට යොමු කරයි (බලන්න dup2()සහ open()). මෙහෙයුම >/dev/nullපසුව ගොනු විස්තරය 1 වෙනස් කරයි, එමඟින් එය විවෘත ගොනු විස්තරයක් සඳහා යොමු කරයි /dev/null, නමුත් ගොනු විස්තර කරන්නා 2 යන්නෙන් අදහස් කරන්නේ විවෘත ගොනු විස්තරයයි.


45
මම අනෙක් දවසේ / dev / stdout / dev / stderr / dev / stdin හරහා පැකිලී ගියෙමි, ඒවා එකම දේ කිරීමට හොඳ ක්‍රමයක් දැයි මට කුතුහලයක් ඇති විය? මම නිතරම සිතුවේ 2> & 1 ටිකක් අපැහැදිලි බවයි. ඉතින් මෙවැනි දෙයක්: command 2> /dev/stdout 1> /dev/null | grep 'something'
මයික් ලියොන්ස්

17
ඔබට /dev/stdoutet al හෝ භාවිතා කළ හැකිය /dev/fd/N. කවචය ඒවා විශේෂ අවස්ථා ලෙස සලකන්නේ නැත්නම් ඒවා සුළු වශයෙන් කාර්යක්ෂම වේ. පිරිසිදු සංඛ්‍යාත්මක අංකනය මඟින් නමින් ලිපිගොනු වෙත ප්‍රවේශ වීම ඇතුළත් නොවේ, නමුත් උපාංග භාවිතා කිරීම යන්නෙන් අදහස් වන්නේ ගොනු නාම සෙවීමකි. ඔබට එය මැනිය හැකිද යන්න විවාදාත්මක ය. සංඛ්‍යාත්මක අංකනයෙහි සංක්ෂිප්තභාවයට මම කැමතියි - නමුත් මම එය මෙතරම් කාලයක් තිස්සේ භාවිතා කර ඇත්තෙමි (ශතවර්ෂ හතරකට වැඩි කාලයක්; ඕච්!) නූතන ලෝකයේ එහි ගුණාංග විනිශ්චය කිරීමට මට සුදුසුකම් නැත.
ජොනතන් ලෙෆ්ලර්

23
On ජොනතන් ලෙෆ්ලර්: ඔබේ සරල පෙළ පැහැදිලි කිරීම සමඟ මම කුඩා ප්‍රශ්නයක් සලකා බලමි. පසුව / dev / null වෙත යොමු කරන්න' - යමෙකුට දකුණෙන් වමට හරවා යැවීමේ දාම කියවිය යුතු බැවින් (වමේ සිට දකුණට), අපි අපගේ සරල පෙළ පැහැදිලි කිරීම ද මෙයට අනුගත විය යුතුය: 'stdout / dev / null වෙත හරවා යවා, පසුව stdout භාවිතා කළ ස්ථානයට stderr කරන්න' .
කර්ට් ෆීෆල්

118
Urt කර්ට්ෆීෆල්: au contraire! යමෙකු යළි හරවා යැවීමේ දාමය වමේ සිට දකුණට කියවිය යුතුය. පළමු මෙහෙයුම වන්නේ 2>&1, 'stdout දැනට යන ගොනු විස්තරයට stderr සම්බන්ධ කරන්න' යන්නයි. දෙවන මෙහෙයුම වන්නේ 'stdout වෙනස් කිරීම' යන්නයි/dev/null ', stderr මුල් stdout වන පයිප්පයට යයි. කවචය මුලින්ම පයිප්ප සංකේතයේ ඇති දේ බෙදයි, එබැවින් නල නැවත හරවා යැවීම සිදුවන්නේ 2>&1හෝ >/dev/nullහරවා යැවීමට පෙරය , නමුත් එපමණයි; අනෙක් මෙහෙයුම් වමේ සිට දකුණට වේ. (දකුණේ සිට වමට වැඩ කරන්නේ නැත.)
ජොනතන් ලෙෆ්ලර්

14
මේ ගැන මා මවිතයට පත් කරන කාරණය නම් එය වින්ඩෝස් වලද /dev/nullක්‍රියා කිරීමයි (වින්ඩෝස් සමාන ලෙස නම් කිරීමෙන් පසුව nul).
මයිකල් බර්

366

නැතහොත් සම්මත දෝෂයෙන් සහ සම්මත ප්‍රතිදානයෙන් ප්‍රතිදානය මාරු කිරීමට, භාවිතා කරන්න:

command 3>&1 1>&2 2>&3

මෙය නව ගොනු විස්තරයක් (3) නිර්මාණය කර එය 1 (සම්මත ප්‍රතිදානය) ලෙස එකම ස්ථානයට පවරයි, ඉන්පසු fd 1 (සම්මත ප්‍රතිදානය) fd 2 (සම්මත දෝෂය) ලෙස එකම ස්ථානයට පවරන අතර අවසානයේ fd 2 (සම්මත දෝෂය) ) fd 3 (සම්මත ප්‍රතිදානය) ලෙස එකම ස්ථානයට.

සම්මත දෝෂය දැන් සම්මත ප්‍රතිදානය ලෙස ලබා ගත හැකි අතර පැරණි සම්මත ප්‍රතිදානය සම්මත දෝෂයකින් ආරක්ෂා වේ. මෙය අතිරික්තයක් විය හැකි නමුත්, එය Bash ගොනු විස්තර කරන්නන් පිළිබඳ වැඩි විස්තර ලබා දෙයි (එක් එක් ක්‍රියාවලියට නවයක් ඇත).


103
අවසාන වෙනස් කිරීමක් වනුයේ 3>&-ඔබ stdout වෙතින් නිර්මාණය කළ අමතර විස්තරය වසා දැමීමයි
ජොනතන් ලෙෆ්ලර්

1
අපි ඇති බව ගොනුව descriptor නිර්මාණය කළ හැකි stderrසංයෝජන ඇති බව හා තවත් stderrහා stdout? වෙනත් වචන වලින් කිවහොත් stderrඑකවර වෙනස් ගොනු දෙකකට යා හැකිද?
ස්ටුවර්ට්

පහත දැක්වෙන්නේ stdout වෙත දෝෂ මුද්‍රණය කිරීමයි. මට නැති වී ඇත්තේ කුමක්ද? ls -l not_a_file 3> & 1 1> & 2 2 & & 3> error.txt
user48956

1
@ ජොනාස් ඩෝල්බක්: කරකැවීම මූලික වශයෙන් පිළිවෙලට ඇති කාරණයකි. සැබවින්ම චාම් අවස්ථාවන්හිදී, එය ක්‍රියාවලියක් ඊඕඑෆ් හඳුනා නොගැනීම සහ හඳුනා නොගැනීම අතර වෙනස ඇති කළ හැකි නමුත් ඒ සඳහා ඉතා සුවිශේෂී තත්වයන් අවශ්‍ය වේ.
ජොනතන් ලෙෆ්ලර්

1
අවවාදයයි : මෙය උපකල්පනය කරන්නේ එෆ්ඩී 3 දැනටමත් භාවිතයේ නොමැති බවත්, එය වසා නොදමන බවත්, ගොනු විස්තර 1 සහ 2 හුවමාරු කිරීම අහෝසි නොකරන බවත් ය, එබැවින් ඔබට මෙය වෙනත් විධානයකට යොමු කළ නොහැක. වැඩි විස්තර සහ වැඩ කිරීම සඳහා මෙම පිළිතුර බලන්න . {Ba, z} sh සඳහා වඩා පිරිසිදු වාක්‍ය ඛණ්ඩයක් සඳහා, මෙම පිළිතුර බලන්න .
ටොම් හේල්

220

Bash හි, ක්‍රියාවලි ආදේශනය භාවිතයෙන් ඔබට උප කුලකයක් වෙත හරවා යැවිය හැකිය :

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

පවතින නඩුව සඳහා:

command 2> >(grep 'something') >/dev/null

1
තිරයට ප්‍රතිදානය සඳහා ඉතා හොඳින් ක්‍රියා කරයි. මම grep ප්‍රතිදානය ගොනුවකට හරවා යැවුවහොත් නොකැඩූ අන්තර්ගතය නැවත දිස්වන්නේ මන්දැයි ඔබට යම් අදහසක් තිබේද? පසු command 2> >(grep 'something' > grep.log)grep.log එම නිමවුම් ungrepped.log සමාන අඩංගුcommand 2> ungrepped.log
ටිම්

9
භාවිතා කරන්න 2> >(stderr pipe >&2). එසේ නොමැතිනම් "stderr පයිප්පයේ" ප්‍රතිදානය "stdlog නළය" හරහා ගමන් කරයි.
ceving

ඔව්!, 2> >(...)වැඩ, මම උත්සාහ කළ 2>&1 > >(...)නමුත් එය එසේ නොවීය
datdinhquoc

ඊළඟ වතාවේ මෙය සිදු කරන්නේ කෙසේදැයි සොයා බැලීමේදී මට උපකාර කළ හැකි කුඩා උදාහරණයක් මෙන්න. පහත සඳහන් කරුණු සලකා බලන්න ... awk -f /new_lines.awk <in-content.txt > out-content.txt 2> >(tee new_lines.log 1>&2 ) මේ අවස්ථාවේ දී මගේ කොන්සෝලයෙහි දෝෂ ලෙස එළියට එන දේ බැලීමට මට අවශ්‍ය විය . නමුත් STDOUT යන්නේ ප්‍රතිදාන ගොනුව වෙතය. එබැවින් උප කවචය තුළ, වරහන් තුළ ඔබ එම STDOUT නැවත STDERR වෙත හරවා යැවිය යුතුය. එය ක්‍රියාත්මක වන අතර, ගොනුවේ අවසානයේ වින්ඩ්ස් tee-අප් විධානයෙන් STDOUT ප්‍රතිදානය out-content.txt. එය මට නොගැලපෙන බව පෙනේ.
ඇත

atdatdinhquoc මම එය කෙසේ හෝ කළා2>&1 1> >(dest pipe)
Alireza Mohamadi

198

ඔබ එසේ කරන්නේ නම්, මෙම පිළිතුරු වලින් හොඳම දේ ඒකාබද්ධ කිරීම:

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

... අනතුරුව සියලු stdout stdout ලෙස සංරක්ෂණය කෙරේ හා සියලුම stderr stderr ලෙසත් සංරක්ෂණය කර ඇත, නමුත් "යමක්" යන නූල අඩංගු stderr හි කිසිදු පේළියක් ඔබට නොපෙනේ.

Stdout සහ stderr ආපසු හැරවීම හෝ ඉවත දැමීම හෝ ඒවා එකට දුම් දැමීම හෝ තාවකාලික ලිපිගොනු භාවිතා නොකිරීමේ සුවිශේෂී වාසිය මෙයට ඇත.


නැත command 2> >(grep -v something)(තොරව 1>&2එම)?
ෆ්‍රැන්චෙස් රොසාස්

11
නැත, එසේ නොමැතිව, පෙරහන් කරන ලද stderr අවසන් වන්නේ stdout වෙත ය.
පිංකෝ

1
මට අවශ්‍ය වූයේ මෙයයි - සෑම විටම නාමාවලියක් සඳහා තාර ප්‍රතිදානය "ගොනුව අප කියවන විට වෙනස් විය", එබැවින් එම පේළිය පෙරීමට අවශ්‍ය නමුත් වෙනත් දෝෂ සිදුවී ඇත්දැයි බලන්න. එබැවින් tar cfz my.tar.gz mydirectory/ 2> >(grep -v 'changed as we read it' 1>&2)වැඩ කළ යුතුය.
කඩා දැමුවා

"නූලෙන් පටන් ගන්න" යැයි පැවසීම වැරදිය. ඉදිරිපත් කරන ලද grep හි වාක්‍ය ඛණ්ඩය ගැන කිසිවක් නොමැති අතර එමඟින් ලබා දී ඇති නූලෙන් ආරම්භ වන රේඛා පමණක් බැහැර කරනු ඇත. ලබා දී ඇති නූල් ඒවායේ කොතැනක හෝ තිබේ නම් රේඛා බැහැර කරනු ලැබේ.
මයික් නකිස්

Ike මයික්නකිස් ස්තූතියි - ස්ථාවරයි! (එය මගේ මුල් පිළිතුරු කෙටුම්පතෙන් ඉතුරු වූ අතර එය අර්ථවත් විය ...)
පිංකෝ

104

“යළි-යොමුවීම්” සහ “පයිප්ප” සමඟ සැබවින්ම සිදුවන්නේ කුමක්ද යන්න ගැන ඔබ සිතන්නේ නම් දේවල් දෘශ්‍යමාන කිරීම වඩා පහසුය. යළි-යොමුවීම් සහ පයිප්ප එක් දෙයක් කරයි: ක්‍රියාවලි ගොනු විස්තර කරන්නන් 0, 1, සහ 2 වෙත යොමු වන ස්ථානය වෙනස් කරන්න (බලන්න / proc / [pid] / fd / * බලන්න).

පයිප්පයක් විට හෝ "|" විධාන රේඛාවේ ක්‍රියාකරු සිටින අතර, මුලින්ම සිදුවිය යුත්තේ බාෂ් විසින් ෆිෆෝ එකක් සාදා වම් පැත්තේ විධානයේ එෆ්ඩී 1 මෙම ෆිෆෝ වෙත යොමු කර දකුණු පැත්තේ විධානයේ එෆ්ඩී 0 එකම ෆිෆෝ වෙත යොමු කිරීමයි.

ඊළඟට, එක් එක් පැත්ත සඳහා යළි-යොමුවීම් ක්‍රියාකරුවන් වමේ සිට දකුණට ඇගයීමට ලක් කෙරේ ලබන අතර, විස්තර කරන්නාගේ අනුපිටපතක් සිදු වූ සෑම අවස්ථාවකම වත්මන් සැකසුම් භාවිතා වේ. මෙය වැදගත් වන්නේ නළය මුලින්ම සකසා ඇති බැවින්, FD1 (වම් පැත්ත) සහ FD0 (දකුණු පැත්ත) දැනටමත් තිබූ තත්වයට වඩා දැනටමත් වෙනස් වී ඇති අතර, මේවායේ ඕනෑම අනුපිටපතක් එම කරුණ පිළිබිඹු කරයි.

එමනිසා, ඔබ පහත සඳහන් දේ ටයිප් කරන විට:

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

පිළිවෙලින් සිදුවන්නේ කුමක්ද:

  1. පයිප්පයක් (ෆිෆෝ) සාදනු ලැබේ. "FD1 විධානය" මෙම නලයට යොමු කර ඇත. "grep FD0" ද මෙම නලයට යොමු කර ඇත
  2. "විධානය FD2" පෙන්වා ඇත්තේ "FD1 විධානය" දැනට පෙන්වා ඇති ස්ථානයට (නළය)
  3. "FD1 විධානය" / dev / null වෙත යොමු කෙරේ

එබැවින්, "විධානය" එහි FD 2 (stderr) වෙත ලියන සියලුම ප්‍රතිදානය පයිප්පයට යන අතර අනෙක් පැත්තෙන් "grep" මඟින් කියවනු ලැබේ. "විධානය" එහි FD 1 (stdout) වෙත ලියන සියලුම ප්‍රතිදානය / dev / null වෙත ගමන් කරයි.

ඒ වෙනුවට, ඔබ පහත සඳහන් දෑ ක්‍රියාත්මක කරයි:

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

සිදුවන්නේ කුමක්ද:

  1. පයිප්පයක් සාදනු ලබන අතර "FD 1 විධානය" සහ "grep FD 0" ඒ වෙත යොමු කෙරේ
  2. "FD 1 විධානය" / dev / null වෙත යොමු කෙරේ
  3. "FD 2 විධානය" FD 1 දැනට පෙන්වා ඇති ස්ථානයට පෙන්වා ඇත (/ dev / null)

එබැවින්, "විධානය" වෙතින් සියලුම stdout සහ stderr / dev / null වෙත යන්න. කිසිවක් පයිප්පයට නොයන අතර තිරය මත කිසිවක් ප්‍රදර්ශනය නොකර "grep" වසා දමනු ඇත.

යළි-යොමුවීම් (ගොනු විස්තර කරන්නන්) කියවීමට පමණක් (<), ලිවීමට පමණක් (>) හෝ කියවීමට-ලිවීමට (<>) විය හැකි බව සලකන්න.

අවසාන සටහනක්. වැඩසටහනක් FD1 හෝ FD2 වෙත යමක් ලියන්නේද යන්න සම්පූර්ණයෙන්ම ක්‍රමලේඛකයා සතුය. හොඳ ක්‍රමලේඛන පුහුණුව මඟින් දෝෂ පණිවිඩ FD 2 හා සාමාන්‍ය ප්‍රතිදානය FD 1 වෙත යා යුතු බව නියම කරයි, නමුත් බොහෝ විට ඔබ දෙදෙනා මිශ්‍ර කරන හෝ සම්මුතිය නොසලකා හරින අලස වැඩසටහන් සොයා ගනු ඇත.


6
ඇත්තෙන්ම හොඳ පිළිතුරක්. මගේ එක් යෝජනාවක් වනුයේ ඔබ විසින් "ෆිෆෝ" හි පළමු භාවිතය "ෆිෆෝ" (නම් කරන ලද පයිප්පයක්) වෙනුවට ආදේශ කිරීමයි. මම කලක සිට ලිනක්ස් භාවිතා කර ඇති නමුත් කෙසේ හෝ එය කිසි විටෙකත් ඉගෙන ගැනීමට නොහැකි විය. මෙය සොයා බැලීමෙන් මා බේරා ගනු ඇත, නමුත් පසුව මම එය සොයාගත් විට මා දුටු අනෙක් දේවල් ඉගෙන නොගනු ඇත!
මාර්ක් එඩින්ටන්

3
Ark මාක් එඩින්ටන් පයිප්ප සහ අයිපීසී සන්දර්භය තුළ නම් කරන ලද නල සඳහා FIFO යනු තවත් යෙදුමක් පමණක් බව කරුණාවෙන් සලකන්න . වඩාත් පොදු සන්දර්භයක් තුළ, FIFO යන්නෙන් අදහස් කරන්නේ පළමුවෙන්ම, පළමුවෙන්ම, එය පෝලිම් දත්ත ව්‍යුහයකින් ඇතුළත් කිරීම සහ ඉවත් කිරීම විස්තර කරයි.
ලූම්චයිල්ඩ්

5
ඇත්තෙන්ම ලොම්චයිල්ඩ්. මගේ අදහස් දැක්වීමේ කාරණය වූයේ පළපුරුදු සංවර්ධකයෙකු ලෙස වුවද නම් කරන ලද පයිප්පයේ සමාන පදයක් ලෙස FIFO භාවිතා කිරීම මා දැක නැත . වෙනත් වචන වලින් කිවහොත්, මම මෙය දැන සිටියේ නැත: en.wikipedia.org/wiki/FIFO_(computing_and_electronics)# පයිප්ප - පිළිතුරෙන් පැහැදිලි කිරීමෙන් මට කාලය ඉතිරි වනු ඇත.
මාර්ක් එඩින්ටන්

41

ඔබ Bash භාවිතා කරන්නේ නම්, භාවිතා කරන්න:

command >/dev/null |& grep "something"

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


4
නැත, stdout සහ stderr ඒකාබද්ධ කරන |&සමාන වේ 2>&1. ප්රශ්නය පැහැදිලිවම stdout නොමැතිව ප්රතිදානය ඉල්ලා ඇත .
Profpatsch

3
| '| &' භාවිතා කරන්නේ නම්, විධාන 1 හි සම්මත දෝෂය පයිප්ප හරහා විධාන 2 හි සම්මත ආදානයට සම්බන්ධ වේ; එය 2> & 1 | සඳහා කෙටිමං වේ ඔබේ සබැඳියේ හතරවන ඡේදයෙන් වාචික වචන ගන්න.
Profpatsch

9
RoProfpatsch: කෙන්ගේ පිළිතුර නිවැරදියි, බලන්න ඔහු stdout සහ stderr ඒකාබද්ධ කිරීමට පෙර stdout ශුන්‍යයට හරවා යවන බව බලන්න, එවිට ඔබට නල මාර්ගයට පිවිසෙන්නේ stderr පමණි, මන්ද stdout මීට පෙර / dev / null වෙත පහත වැටී ඇති බැවිනි.
ලුසියානෝ

3
නමුත් මම තවමත් ඔබගේ පිළිතුර වැරදියි, >/dev/null |&පුළුල් කරන්න >/dev/null 2>&1 | සහ අදහස් කරන්නේ stdout ඉනෝඩය පයිප්පයට හිස් බැවින් කිසිවෙකු (# 1 # 2 දෙකම / dev / null inode සමඟ බැඳී ඇත) stdout ඉනෝඩයට බැඳී නැති නිසාය (උදා: ls -R /tmp/* >/dev/null 2>&1 | grep iහිස් ls -R /tmp/* 2>&1 >/dev/null | grep iවනු ඇත , නමුත් # 2 stdout inode සමඟ බැඳී ඇති නල මාර්ගයක් වනු ඇත).
පළතුරු

3
කෙන් ෂාප්, මම පරීක්‍ෂා කළ අතර ( echo out; echo err >&2 ) >/dev/null |& grep "."ප්‍රතිදානයක් ලබා නොදේ (අපට "වැරදි" අවශ්‍ය තැන). man bashකියනවා නම් | & භාවිතා කරන්නේ නම්… 2> & 1 | සඳහා කෙටිමං වේ. සම්මත දෝෂය සම්මත ප්‍රතිදානය වෙත හරවා යැවීම මෙම විධානය මඟින් නිශ්චිතව හරවා යැවීමෙන් පසුව සිදු කෙරේ. එබැවින් පළමුව අපි විධානයේ FD1 ශුන්‍යයට හරවා යමු, ඉන්පසු අපි FD1 පෙන්වා ඇති ස්ථානයට විධානයෙහි FD2 යළි හරවා යමු. ශුන්‍යයි, එබැවින් grep හි FD0 ට කිසිදු ආදානයක් නොලැබේ. වඩාත් ගැඹුරු පැහැදිලි කිරීමක් සඳහා stackoverflow.com/a/18342079/69663 බලන්න .
unhammer

11

Stdout සහ stderr ස්ථිරවම ලිපිගොනු වෙත හරවා යැවීමට කැමති අය සඳහා, stderr මත grep කරන්න, නමුත් tty එකකට පණිවිඩ ලිවීමට stdout තබා ගන්න:

# save tty-stdout to fd 3
exec 3>&1
# 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" >&1
# goes to the std.err
echo "a error message" >&2
# goes nowhere
echo "this nasty_msg won't appear anywhere" >&2
# goes to the tty
echo "a message on the terminal" >&3

6

මෙය command1 stdr විධාන 2 stdin වෙත හරවා යවන අතර command1 stdout එලෙසම තබයි.

exec 3>&1
command1 2>&1 >&3 3>&- | command2 3>&-
exec 3>&-

එල්ඩීපී වෙතින් ගනු ලැබේ


2

stdoutඑක් විධානයකට සහ stderrතවත් විධානයකට නම් කරන ලද පයිප්ප භාවිතා කිරීම සඳහා මම විසඳුමක් ඉදිරිපත් කළෙමි .

මෙන්න යනවා.

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

පසුව නම් කරන ලද පයිප්ප ඉවත් කිරීම හොඳ අදහසකි.


0

ඔබට rc shell භාවිතා කළ හැකිය .

පළමුව පැකේජය ස්ථාපනය කරන්න (එය 1 MB ට වඩා අඩුය).

ඔබට මෙය සම්මත ප්රතිදානය හා නළ මාර්ග සම්මත දෝෂයක් ඉවත කරන ආකාරය පිළිබඳ උදාහරණයක් grep දී rc:

find /proc/ >[1] /dev/null |[2] grep task

බාෂ් අතහැර නොයා ඔබට එය කළ හැකිය:

rc -c 'find /proc/ >[1] /dev/null |[2] grep task'

ඔබ දැක ඇති පරිදි, පයිප්පයෙන් පසු වරහන් භාවිතා කිරීමෙන් ඔබට පයිප්ප අවශ්‍ය වන්නේ කුමන ගොනු විස්තර කරන්නද යන්න නියම කළ හැකිය.

සම්මත ගොනු විස්තර කරන්නන් පහත පරිදි ගණනය කර ඇත:

  • 0: සම්මත ආදානය
  • 1: සම්මත ප්‍රතිදානය
  • 2: සම්මත දෝෂයකි

-3

මම අනුගමනය කිරීමට උත්සාහ කරමි, එය ද ක්‍රියාත්මක වන බව සොයා ගන්න,

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

වැඩ කරන්නේ නැහැ. එය පර්යන්තයට stderr යවයි. නළය නොසලකා හරියි.
ට්‍රිප් චාලක විද්‍යාව
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.