ප්‍රතිදානය ගොනුවකට හරවා ගන්නේ කෙසේද සහ stdout


1030

බාෂ් වලදී, ඇමතීමෙන් fooඑම විධානයෙන් ඕනෑම ප්‍රතිදානයක් stdout හි පෙන්වනු ඇත.

ඇමතීමෙන් foo > outputඑම විධානයෙන් ඕනෑම ප්‍රතිදානයක් නිශ්චිත ගොනුව වෙත හරවා යවනු ලැබේ (මේ අවස්ථාවේ දී 'ප්‍රතිදානය').

ගොනුවකට යළි-යොමුවීම් ප්රතිදානය සඳහා ක්රමයක් පවතින හා එය stdout මත පෙන්වීමට ද?


3
යමෙකු ගොනුව සඳහා දෝෂ ප්‍රතිදානය ග්‍රහණය කර ගැනීම සඳහා මෙහි පැමිණියේ නම්, බලන්න - unix.stackexchange.com/questions/132511/…
මර්ෆි

3
පාරිභාෂික ශබ්ද මාලාව පිළිබඳ සටහනක්: ඔබ ක්රියාත්මක කරන විට foo > outputදත්ත ඇත stdout කිරීමට ලිඛිත හා stdout වේ නම් ගොනුව output. ඒ ගොනුව ලියමින් ය ඇත stdout වෙත ලිඛිතව. ඔබ අසන්නේ stdout සහ පර්යන්තය යන දෙකම ලිවිය හැකිද යන්නයි.
විලියම් පර්සෙල්

2
Ill විලියම්පර්සෙල් ඔබේ පැහැදිලි කිරීම මඟින් දේවල් වැඩිදියුණු වන බව මට විශ්වාස නැත :-) මේ ගැන: OP විමසනුයේ , කැඳවනු ලැබූ වැඩසටහනේ stdout ගොනුවකට සහ ඇමතුම් වැඩසටහනේ stdout දෙකටම යොමු කළ හැකිද යන්නයි. විශේෂ කිසිවක් සිදු නොකළේ නම් උරුම වන්න; එනම් ටර්මිනලය, ඇමතුම් වැඩසටහන අන්තර්ක්‍රියාකාරී බැෂ් සැසියක් නම්). සමහර විට ඔවුන්ට ඒ හා සමානවම හැඳින්වෙන ක්‍රමලේඛයේ stderr යොමු කිරීමට අවශ්‍ය වනු ඇත (“ එම විධානයෙන් ලැබෙන ඕනෑම ප්‍රතිදානයක්” stderr ද ඇතුළුව අර්ථ දැක්වීම සඳහා සාධාරණ ලෙස අර්ථ දැක්විය හැකිය).
දොන් හැච්

Answers:


1447

ඔබට අවශ්‍ය විධානය නම් කර ඇත tee:

foo | tee output.file

උදාහරණයක් ලෙස, ඔබ stdout ගැන පමණක් සැලකිලිමත් වන්නේ නම්:

ls -a | tee output.file

ඔබට stderr ඇතුළත් කිරීමට අවශ්‍ය නම්, කරන්න:

program [arguments...] 2>&1 | tee outfile

2>&1නාලිකා 2 (stderr / standard error) නාලිකා 1 (stdout / standard output) වෙත හරවා යවයි. එය teeවිධානය අනුව ලබා දී ඇති ප්‍රතිදාන ගොනුවට ද යොමු කෙරේ .

තවද, ඔබට ලොග් ගොනුවට එකතු කිරීමට අවශ්‍ය නම් , පහත පරිදි භාවිතා කරන්න tee -a:

program [arguments...] 2>&1 | tee -a outfile

176
OP ට "සියලු ප්‍රතිදානය" යළි හරවා යැවීමට අවශ්‍ය නම්, ඔබ ද stderr අල්ලා ගත යුතුය: "ls -lR / 2> & 1 | te output.file"
ජේම්ස් බ්‍රැඩි

47
@evanmcdonnal පිළිතුර වැරදියි, එය ප්‍රමාණවත් තරම් නිශ්චිත නොවිය හැකිය, නැතහොත් ඔබේ අවශ්‍යතා අනුව සම්පූර්ණයි. ප්‍රතිදානය ගොනුවකට සුරැකීමේ කොටසක් ලෙස ඔබට stderr අවශ්‍ය නොවන කොන්දේසි නිසැකවම තිබේ. මීට වසර 5 කට පෙර මම මෙයට පිළිතුරු දුන් විට, උපකල්පනය කළේ, තනතුරට විෂයය පිළිබඳ stdout සඳහන් කර ඇති හෙයින්, OP හට අවශ්‍ය වන්නේ stdout පමණක් බවයි.
Zoredache

3
සමාවෙන්න, මම ටිකක් ව්‍යාකූල වන්නට ඇත. මම එය උත්සාහ කළ විට මට ප්‍රතිදානයක් ලැබුනේ නැත, සමහර විට ඒ සියල්ල stderr වෙත යනු ඇත.
evanmcdonnal

38
අන්තර්ගතය නැවත -ateeoutput.filels -lR / | tee -a output.file
ලිවීම

17
ඔබ $?පසුව භාවිතා කරන්නේ නම් tee, එය ඔබට අවශ්‍ය දේ නොවන තත්ව කේතය නැවත ලබා දෙනු ඇත . ඒ වෙනුවට, ඔබට භාවිතා කළ හැකිය ${PIPESTATUS[0]}.
ලාගුට්

506
$ program [arguments...] 2>&1 | tee outfile

2>&1stderr සහ stdout ධාරාවන් දමයි. tee outfileඑය ලබා ගන්නා ධාරාව ගෙන එය තිරයට සහ "outfile" ගොනුවට ලියයි.

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

ගැටළුව (විශේෂයෙන් stdout සහ stderr ධාරාවන් මිශ්‍ර කිරීමේදී) වැඩසටහන මඟින් ගලා යන ධාරාවන් මත රඳා පැවතීමයි. නිදසුනක් ලෙස, stdout වෙත ලියන ලද සියලුම ලිවීම් ෆ්ලෂ් කර නොමැති නම් , නමුත් stderr වෙත ලියන ලද සියලුම ලිවීම් ෆ්ලෂ් කර තිබේ නම් , ඒවා ප්‍රතිදාන ගොනුවේ සහ තිරයේ කාලානුක්‍රමික අනුපිළිවෙලින් අවසන් වේ.

ප්‍රගතිය වාර්තා කිරීම සඳහා වැඩසටහන සෑම මිනිත්තු කිහිපයකට වරක් පේළි 1 ක් හෝ 2 ක් පමණක් ප්‍රතිදානය කරයි නම් එය ද නරක ය. එවැනි අවස්ථාවකදී, වැඩසටහන මඟින් ප්‍රතිදානය ගලා නොගියහොත්, පරිශීලකයා පැය ගණනක් තිරය මත කිසිදු ප්‍රතිදානයක් නොදකිනු ඇත, මන්ද ඒ කිසිවක් පැය ගණනක් නළය හරහා තල්ලු නොවන බැවිනි.

යාවත්කාලීන කිරීම: පැකේජයේ unbufferකොටසක් වන වැඩසටහන මඟින් expectබෆරින් ගැටළුව විසඳනු ඇත. මෙය stdout සහ stderr තිරය වෙත ලිවීමට සහ වහාම ගොනු කිරීමට සහ ඒකාබද්ධ කර නැවත හරවා යැවීමේදී ඒවා සමමුහුර්තව තබා ගැනීමට හේතු teeවේ. උදා:

$ unbuffer program [arguments...] 2>&1 | tee outfile

7
Osx සඳහා 'unfuffer' එකක් ගැන කවුරුන් හෝ දන්නවාද?
ජෝන් මී

7
ඔබට unbuffer භාවිතා කළ නොහැකි නම්, GNU coreutils හි stdbuff නම් මෙවලමක් ඇතුළත් වන අතර එමඟින් නිමැවුම් බෆරින් වැළැක්වීම සඳහා භාවිතා කළ හැකිය$ stdbuf -o 0 program [arguments...] 2>&1 | tee outfile
පීටර්

1
ඔබ OS X භාවිතා කරන්නේ නම්, ඔබ ක්‍රියාත්මක වන විධානයට සං als ා යැවීමට අවශ්‍ය නොවුවද, බොහෝ අවස්ථාවලදී unbuffer භාවිතා කිරීම සුළු වශයෙන් පහසුය. මගේ අදහස වඩාත් අරමුණු කර ඇත්තේ ලිනක්ස් හි සිටින පරිශීලකයින් වෙත වන අතර, පෙරනිමියෙන් කෝරියුටිල්ස් ස්ථාපනය කර ඇත. @ ඊතන්, ඔබ stdbuf syntax ගැන ව්‍යාකූල නම් මෙම පිළිතුර බලන්න: stackoverflow.com/a/25548995/942781
පීටර්

3
ප්‍රතිදානය මුදාහරින pythonවිකල්පයක් -uඇති බව සලකන්න .
fabian789

1
මට අතිරේක කේතයකින් තොරව ලොග් වීමට අවශ්‍ය එම්එල් මාදිලි පුහුණු කිරීම සඳහා නිරපේක්ෂ ජීවිතාරක්ෂකය පමණක් නොව එය ක්‍රියාත්මක වීමට ගතවන පැය / දින තුළ ප්‍රතිදානය ද බලන්න, ස්තූතියි!
රොකෝකෝ

131

මට වැඩ කරන තවත් ක්‍රමයක් නම්,

<command> |& tee  <outputFile>

gnu bash අත්පොතෙහි පෙන්වා ඇති පරිදි

උදාහරණයක්:

ls |& tee files.txt

'| &' භාවිතා කරන්නේ නම්, විධාන 1 හි සම්මත දෝෂය , එහි සම්මත ප්‍රතිදානයට අමතරව , පයිප්ප හරහා විධාන 2 හි සම්මත ආදානයට සම්බන්ධ වේ; එය 2> & 1 | සඳහා කෙටිමං වේ . සම්මත දෝෂය සම්මත ප්‍රතිදානය වෙත හරවා යැවීම මෙම විධානය මඟින් නිශ්චිතව හරවා යැවීමෙන් පසුව සිදු කෙරේ.

වැඩි විස්තර සඳහා, යළි හරවා යැවීම බලන්න


10
ඔබ $?පසුව භාවිතා කරන්නේ නම් tee, එය ඔබට අවශ්‍ය දේ නොවන තත්ව කේතය නැවත ලබා දෙනු ඇත . ඒ වෙනුවට, ඔබට භාවිතා කළ හැකිය ${PIPESTATUS[0]}.
ලාගුට්

1
මෙම ක්‍රමය වර්ණ කොන්සෝල ප්‍රතිදානය ඉවතලයි, කිසියම් අදහසක් තිබේද?
shakram02

උත්සාහ කරන්න: unbuffer ls -l --color = auto | tee files.txt
ලුසියානෝ ඇන්ඩ්‍රස් මාටිනි

18

ඔබට මූලික වශයෙන් Zoredache විසඳුම භාවිතා කළ හැකිය , නමුත් ප්‍රතිදාන ගොනුව නැවත ලිවීමට ඔබට අවශ්‍ය නැතිනම් පහත දැක්වෙන පරිදි -a විකල්පය සමඟ ටී ලිවිය යුතුය:

ls -lR / | tee -a output.file

12

එකතු කිරීමට යමක් ...

පැකේජය මුදා හැරීම ෆෙඩෝරා සහ රෙඩ්හැට් යුනික්ස් නිකුතු යටතේ ඇති සමහර පැකේජ සමඟ ආධාරක ගැටළු ඇත.

කරදර පසෙකට දමන්න

පහත දැක්වෙන්නේ මා වෙනුවෙන් වැඩ කිරීමයි

bash myscript.sh 2>&1 | tee output.log

ඔබට ස්තුතියි ScDF සහ මතෙව් ඔබේ යෙදවුම් ගොඩක් කාලය මට ගැලවීම ..



3

මෙම භාවිත අවස්ථාවෙන් ප්‍රසාද පිළිතුර මා මෙහි ගෙන ආවේ:

වෙනත් පරිශීලකයෙකු ලෙස ඔබට මෙය කිරීමට අවශ්‍ය අවස්ථාවෙහිදී

echo "some output" | sudo -u some_user tee /some/path/some_file

ඔබ සහ ගොනු ලිවිම "some_user" ලෙස සිදු කරනු ඇත ලෙස වෙන දේ ගත්තේ echo සිදු කරන බව සටහන නොවේ ඔබ "some_user" ලෙස සුප්රසිද්ධ echo විධානය ක්රියාත්මක කර >> "some_file" සමග ප්රතිදානය හරවා ගොනුව යළි-යොමුවීම් සිදු වනු ඇත නිසා නම් වැඩ ඔබ වගේ.

ඉඟිය: -a ධජය සමඟ එකතු කිරීම සඳහා ටී ද සහාය දක්වයි, ඔබට ගොනුවක පේළියක් වෙනත් පරිශීලකයෙකු ලෙස ප්‍රතිස්ථාපනය කිරීමට අවශ්‍ය නම් ඔබට අවශ්‍ය පරිශීලකයා ලෙස sed ක්‍රියාත්මක කළ හැකිය.


2

< command > |& tee filename # මෙය අන්තර්ගතයක් ලෙස විධාන තත්ත්වය සහිත "ගොනු නාමයක්" ගොනුවක් සාදනු ඇත, ගොනුවක් දැනටමත් තිබේ නම් එය පවතින අන්තර්ගතය ඉවත් කර විධාන තත්ත්වය ලියයි.

< command > | tee >> filename # මෙය ගොනුවට තත්වය එකතු කරනු ඇති නමුත් එය විධාන තත්ත්වය standard_output (තිරය) මත මුද්‍රණය නොකරයි.

තිරය ​​මත "echo" භාවිතා කර යමක් මුද්‍රණය කර එම ප්‍රතිරාවය දත්ත ගොනුවකට එකතු කිරීමට මට අවශ්‍යය

echo "hi there, Have to print this on screen and append to a file" 

2

ඔබේ පිටපත ආරම්භයේ දී එවැනි දෙයක් භාවිතා කිරීමෙන් ඔබේ මුළු පිටපත සඳහාම එය කළ හැකිය:

#!/usr/bin/env bash

test x$1 = x$'\x00' && shift || { set -o pipefail ; ( exec 2>&1 ; $0 $'\x00' "$@" ) | tee mylogfile ; exit $? ; }

# do whaetever you want

මෙය මේ ලිපිෙගොනුව stderr හා stdout ප්රතිදානයන් දෙකම හරවා mylogfile හා සියල්ල stdout යයි ඉඩ එම අවස්ථාවේ දී .

එය මෝඩ උපක්‍රම කිහිපයක් භාවිතා කරයි:

  • භාවිතය execපිහිටුවීම් redirections කිරීමට අණ තොරව,
  • teeප්‍රතිදානයන් අනුපිටපත් කිරීමට භාවිතා කරන්න,
  • අවශ්‍ය යළි-යොමුවීම් සමඟ ස්ක්‍රිප්ට් නැවත ආරම්භ කරන්න,
  • ස්ක්‍රිප්ට් එක නැවත ආරම්භ කර ඇති බව සඳහන් කිරීමට විශේෂ පළමු පරාමිතියක් ( විශේෂ බැෂ් අංකනයෙන් NULනියම කර ඇති සරල අක්ෂරයක් $'string') භාවිතා කරන්න (ඔබේ මුල් කෘතියට සමාන පරාමිතියක් භාවිතා කළ නොහැක),
  • pipefailවිකල්පය භාවිතා කර ස්ක්‍රිප්ට් නැවත ආරම්භ කිරීමේදී මුල් පිටවීමේ තත්වය ආරක්ෂා කිරීමට උත්සාහ කරන්න .

සමහර අවස්ථාවන්හිදී මට කැත නමුත් ප්‍රයෝජනවත් වේ.


-13

ටී මේ සඳහා පරිපූර්ණයි, නමුත් මෙයද කාර්යය ඉටු කරනු ඇත

ls -lr / > output | cat output

10
ප්‍රතිදානය දැනටමත් නොපවතින අතර එය ඔබට අවශ්‍ය දේ නොකරන්නේ නම් එය දෝෂයකි, සමස්තයක් ලෙස එය විකාරයකි. සමහර විට ඔබ අදහස් කළේ ";" "|" වෙනුවට ?
රොබට් ගැම්බල්

6
ඔබ a භාවිතා කළත්, ;මන්දගාමී විධානයක් තුළ ප්‍රතිදානය ප්‍රමාද වනු ඇත.
බ්‍රැඩ් කොච්
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.