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


843

විධානයක ප්‍රතිදානය ගොනුවකට සුරැකෙන්නේ කෙසේද?

කිසිදු මෘදුකාංගයක් භාවිතා නොකර ක්‍රමයක් තිබේද? මම කොහොමද කියලා දැනගන්න කැමතියි.

Answers:


959

ඔව් එය කළ හැකි ය, ප්‍රතිදානය ගොනුවකට හරවා යවන්න:

SomeCommand > SomeFile.txt  

නැතහොත් ඔබට දත්ත එකතු කිරීමට අවශ්‍ය නම්:

SomeCommand >> SomeFile.txt

ඔබට අවශ්‍ය නම් stderrමෙයද භාවිතා කරන්න:

SomeCommand &> SomeFile.txt  

හෝ මෙය එකතු කිරීමට:

SomeCommand &>> SomeFile.txt  

ඔබට දෙකම stderrසහ ප්‍රතිදානය කොන්සෝලයෙහි සහ ගොනුවක ප්‍රදර්ශනය කිරීමට අවශ්‍ය නම් මෙය භාවිතා කරන්න:

SomeCommand 2>&1 | tee SomeFile.txt

(ඔබට ප්‍රතිදානය පමණක් අවශ්‍ය නම්, 2ඉහත සඳහන් දෑ අතහරින්න )


21
බව සටහන someCommand 2> someFile.txtහා someCommand 2>> someFile.txtද යළි-යොමුකරයි stterrsomeFile.txt කිරීමට
Slothworks

මම මෙය gcc විධානයෙන් කිරීමට උත්සාහ කළද එය ක්‍රියාත්මක නොවේ. එය වෙනත් විධානයන් සමඟ ක්‍රියා කරයි, නමුත් මෙය නොවේ. එය හුදෙක් ප්‍රතිදාන ගොනුව තුළ කිසිවක් නොමැතිව නිර්මාණය කරයි.
නිකොස්

Ik Nik-Lz බොහෝ විට මෙයට හේතුව වන්නේ විධානය එහි සියලු ප්‍රතිදානයන් stderr වෙත යවන බැවිනි. Gcc වැරදි පණිවිඩ ජනනය කරන්නේ නම්, මෙය බොහෝ දුරට පෙනේ. Stdout වෙනුවට stderr අල්ලා ගන්නේ කෙසේද යන්න සඳහා Slothworks අදහස් බලන්න.
ජොනතන් හාර්ට්ලි

1
සැ.යු: මෙම ප්රතිදානය ලබා ගැනීමට makeගොනු බවට අණ එය ඒ වෙනුවට මෙම කාරක රීති අවශ්ය: make > someFile.txt 2>&1(මූලාශ්රය: linuxquestions.org/questions/linux-newbie-8/... )
ගේබ්රියෙල් ස්ෙට්පල්

1
ගොනුව 8MB පමණ ළඟා වූ විට එය ලිවීම නවත්වන ගැටළුවක් මට ඇත. මෙය දන්නා සීමාවක්ද?
relG

1018

ගොනුවකට විධානයක ප්‍රතිදානය ලිවීමට මූලික වශයෙන් පොදු ක්‍රම 10 ක් ඇත.

දළ විශ්ලේෂණය:

n.e.සින්ටැක්ස් තීරුවේ අර්ථය "නොපවතින" බව කරුණාවෙන් සලකන්න .
ක්රමයක් ඇත, නමුත් එය තීරුවට ගැලපෙන තරමට සංකීර්ණ ය. ඔබට ඒ පිළිබඳ ලැයිස්තු කොටසේ ප්‍රයෝජනවත් සබැඳියක් සොයාගත හැකිය.

          || visible in terminal ||   visible in file   || existing
  Syntax  ||  StdOut  |  StdErr  ||  StdOut  |  StdErr  ||   file   
==========++==========+==========++==========+==========++===========
    >     ||    no    |   yes    ||   yes    |    no    || overwrite
    >>    ||    no    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
   2>     ||   yes    |    no    ||    no    |   yes    || overwrite
   2>>    ||   yes    |    no    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
   &>     ||    no    |    no    ||   yes    |   yes    || overwrite
   &>>    ||    no    |    no    ||   yes    |   yes    ||  append
          ||          |          ||          |          ||
 | tee    ||   yes    |   yes    ||   yes    |    no    || overwrite
 | tee -a ||   yes    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    || overwrite
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
|& tee    ||   yes    |   yes    ||   yes    |   yes    || overwrite
|& tee -a ||   yes    |   yes    ||   yes    |   yes    ||  append

ලැයිස්තුව:

  • command > output.txt

    සම්මත ප්‍රතිදාන ප්‍රවාහය ගොනුව වෙත පමණක් හරවා යවනු ලැබේ, එය පර්යන්තයේ නොපෙනේ. ගොනුව දැනටමත් තිබේ නම්, එය නැවත ලියනු ලැබේ.

  • command >> output.txt

    සම්මත ප්‍රතිදාන ප්‍රවාහය ගොනුව වෙත පමණක් හරවා යවනු ලැබේ, එය පර්යන්තයේ නොපෙනේ. ගොනුව දැනටමත් තිබේ නම්, නව දත්ත ගොනුවේ අවසානයට එකතු වේ.

  • command 2> output.txt

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

  • command 2>> output.txt

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

  • command &> output.txt

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

  • command &>> output.txt

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

  • command | tee output.txt

    සම්මත ප්‍රතිදාන ප්‍රවාහය ගොනුවට පිටපත් කරනු ඇත, එය තවමත් පර්යන්තයේ දැකිය හැකිය. ගොනුව දැනටමත් තිබේ නම්, එය නැවත ලියනු ලැබේ.

  • command | tee -a output.txt

    සම්මත ප්‍රතිදාන ප්‍රවාහය ගොනුවට පිටපත් කරනු ඇත, එය තවමත් පර්යන්තයේ දැකිය හැකිය. ගොනුව දැනටමත් තිබේ නම්, නව දත්ත ගොනුවේ අවසානයට එකතු වේ.

  • (*)

    දෙවන විධානයකට StdErr පමණක් නල මාර්ගයට ඉඩ දෙන කෙටිකාලීන වාක්‍ය ඛණ්ඩයක් Bash සතුව නොමැත, එය teeනැවත වගුව සම්පුර්ණ කිරීම සඳහා මෙහි අවශ්‍ය වේ. ඔබට ඇත්ත වශයෙන්ම එවැනි දෙයක් අවශ්‍ය නම්, කරුණාකර බලන්න "stderr නල කරන්නේ කෙසේද, සහ stdout නොවේද?" මෙය සිදු කළ හැකි ආකාරය සඳහා ස්ටක් පිටාර ගැලීම මත උදා. ධාරාවන් මාරු කිරීමෙන් හෝ ක්‍රියාවලි ආදේශනය භාවිතා කිරීමෙන්.

  • command |& tee output.txt

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

  • command |& tee -a output.txt

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


75
මේසයට ස්තූතියි, එය විශිෂ්ටයි! මෙය ඉහළම පිළිතුර විය යුතුය
දේව්ෂාර්ක්

3
ar karthick87 මෙය ඇත්ත වශයෙන්ම ගොනුවකට ප්‍රතිදානය හරවා යැවීම පිළිබඳ ප්‍රශ්නයට සම්බන්ධ නොවේ, මන්ද එය එක් ප්‍රවාහයක් තවත් ප්‍රවාහයකට හරවා යවයි. 2>&1STDERR STDOUT වෙත හරවා යවයි, STDOUT STDERR වෙත 1>&2හරවා යවන අතර 3>&13 වන ධාරාව STDERR වෙත හරවා යවනු ඇත.
බයිට් කමාන්ඩර්

21
මැකෝස් හි '| &' මා වෙනුවෙන් වැඩ නොකරන බවට සටහනක් පමණි. මෙයට හේතුව එය පැරණි බාෂ් අනුවාදයක් තිබීමයි (මම හිතන්නේ). අඩු අලංකාර '2> & 1 |' හොඳින් ක්‍රියාත්මක වුවද
ඩැනී පාකර්

2
YByteCommander මට දෝෂයක් ඇතිවිය: sh: 1: Syntax error: "&" unexpectedමම |& teec9.io සේවාදායකයක පයිතන් ස්ක්‍රිප්ට් එකකින් භාවිතා කරන විට. වෙනත් කවචයක් භාවිතා කරන බව පෙනේ. 4.3.11 (1) අනුවාදය echo $SHELLපෙන්වයි /bin/bashසහ $SHELL --versionපෙන්වයි - නිදහස් කරන්න. මම #!/bin/bashමගේ පයිතන් පිටපතෙන් උත්සාහ කළ නමුත් මට තවමත් ලැබෙනවා sh: 1: Syntax error. මට අවශ්‍ය දේ මට ලැබී ඇති නිසා මගේ සේවාදායකය අතර shසහ එහි ඇති අමුතුකම වර්ග කිරීම මම අත්හරිමි bash. ස්තූතියි.
samkhan13

1
@ samkhan13 ඔබ ධාවනය වැනි ඇත බලයි shනොව bash(හෝ සමහර විට bashදී shමාදිලිය ...). ඔබගේ වර්තමාන ෂෙල් ක්‍රියාවලිය හරියටම භාවිතා කරන්නේ කුමක් දැයි ඔබට පරීක්ෂා කළ හැකිය ps -p $$ -o cmd=, මන්ද echo $SHELLඑය විශ්වාස කළ නොහැකි අතර ඔබ වෙනත් උපසිරැසියක් ආරම්භ කර ඇත්දැයි නොසලකා හරිමින් ඔබේ පිවිසුම් කවචය පෙන්වනු ඇත.
බයිට් කමාන්ඩර්

113

teeප්‍රතිදානය ගොනුවකට යැවීමටද ඔබට භාවිතා කළ හැකිය :

command | tee ~/outputfile.txt

සුළු වෙනස් කිරීමකින් stderr ද අල්ලා ගනු ඇත:

command 2>&1 | tee ~/outputfile.txt

හෝ තරමක් කෙටි හා අඩු සංකීර්ණ:

command |& tee ~/outputfile.txt

teeවිධාන ප්‍රතිදානය සජීවීව නැරඹීමට ඔබට හැකි නම් එය ප්‍රයෝජනවත් වේ .


එය & අනපේක්ෂිත යැයි පවසන අතර විධානය ක්‍රියාත්මක වන අවස්ථාවේදීම ලොගය ලියන්නේ නැත. කෙසේ වෙතත් මම මෙය බාෂ් ගොනුවක භාවිතා කරමි, එයින් යම් වෙනසක් සිදු වේද?
tim687

68 tim687 මම එම සංස්කරණය ඉවත් කර ඇත. ඒ ගැන කණගාටුයි ... මගේ මුල් පිළිතුරේ කොටසක් නොවේ.
ආරොන්

ආරොන් ස්තූතියි! ටී විසින් නියම වේලාවට ගොනුව එකතු කරනු ඇත, නේද? මගේ පරිගණකයේ උපස්ථ පිටපතක් මා සතුව ඇත, නමුත් ලොග් වීම මගේ පරිගණකයේ උපස්ථ වේ, නමුත් ලොග් වීම තථ්‍ය කාලීන නොවේ. උපස්ථය අවසන් වූ පසු මගේ පරිගණකය නින්දට යන අතර ලොග් ගොනුව හිස් වේ. විධාන ලොග් කිරීමට මා වෙනත් විධානයක් භාවිතා කළ යුතුද?
tim687

එහි අර්ථය මා අර්ථ නිරූපණය කරන්නේ 2>&1කෙසේද?
මහා

Es මහේෂා 999 යනු STDERR සඳහා ගොනු විස්තර කරන්නා වන අතර 1 STDOUT සඳහා වේ. එබැවින් 2> & 1 විසින් STDERR STDOUT වෙත යවයි. මෙම SO ප්‍රශ්නය එය ඉතා හොඳින් පැහැදිලි කරයි: stackoverflow.com/questions/818255/…
ආරොන්

20

ඔබට විධාන ප්‍රතිදානය ගොනුවකට හරවා යැවිය හැකිය:

your_command >/path/to/file

විධාන ප්‍රතිදානය ගොනුව නැවත ලිවීම වෙනුවට එය එකතු කිරීමට, භාවිතා කරන්න:

your_command >>/path/to/file

ගොඩක් ස්තුතියි ! සීමාවන් තිබේද? ගොනුවේ උපරිම ප්‍රමාණය වගේද?
led-Zepp

3
උපරිම ගොනු ප්‍රමාණය ගොනු පද්ධතිය හරහා පමණක් සීමා වේ
අවුල් සහගත

මෙම පිළිතුර stderr සුරකිනු නොලැබේ. භාවිතය සහ> බලන්න stackoverflow.com/questions/637827/... හා tldp.org/LDP/abs/html/io-redirection.html
මිදුළු බද්ධයෙන් පසු

3
OP කිසි විටෙකත් stderr
chaos

එහි "එවැනි ගොනුවක් හෝ නාමාවලියක් නැත" යනුවෙන් පවසයි. නාමාවලි ස්වයංක්‍රීයව නිර්මාණය කළ හැකිද?
Qwerty

15

සලකා බැලිය යුතු වැඩි දියුණු කිරීමක් -

විවිධ ස්ක්‍රිප්ට් මඟින් ඔබේ ලොග් ගොනුව අවුල් කිරීමට අවශ්‍ය නොවන ප්‍රතිදානය තුළට වර්ණ කේත එන්නත් කරනු ඇත.

මෙය නිවැරදි කිරීම සඳහා, ඔබට එම කේත ඉවත් කිරීම සඳහා sed වැඩසටහන භාවිතා කළ හැකිය . උදාහරණයක්:

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt

1
වර්ණ සංරක්ෂණය වන ආකාරයට ප්‍රතිදානය සුරැකෙන්නේ කෙසේද? විධානයක ප්‍රති result ලය libreoffice හි ආනයනය කර වර්ණ තබා ගැනීමට මම කැමතියි.
මැඩ්රාන්ග්

ad මාඩ්‍රැන්ග්: මම දැන් ඔබේ අදහස පමණක් කියවා ඇති නමුත් ඔබට මෙම පිළිතුර ප්‍රයෝජනවත් විය හැකිය .
සිල්වයින් පීනෝ

ඔහ්, මම සොයන දේ හරියටම පාහේ. ප්‍රතිදානය තිරය මත මුද්‍රණය කරන්නේ කෙසේද?
සිගූර්

1
වර්ණ ගැන්වූ ප්‍රතිදානය නිපදවන බොහෝ විධාන, lsසහ grep, සහය --color=auto, වර්ණ කේත ප්‍රතිදානය කරන්නේ සම්මත ප්‍රතිදානය පර්යන්තයක් නම් පමණි.
එලියා කගන්

6

සඳහා cronරැකියා ආදිය ඔබ බෑෂ් දිගු වළක්වා ගැනීමට අවශ්ය. සමාන POSIX shයළි-යොමුවීම් ක්‍රියාකරුවන් වේ

Bash          POSIX
------------  --------------
foo &> bar    foo >bar 2>&1
foo &>> bar   foo >>bar 2>&1
foo |& bar    foo 2>&1 | bar

POSIX පහසුකම යම් ආකාරයකින් සරල හා සරල බව ඔබට පෙනෙනු ඇත. මෙම &>කාරක රීති ලබා ගත් ණය විය cshදැනටමත් එය නරක අදහසක් බව ඔබට ඒත්තු යුතු.


5

some_command | tee command.logතවද some_command > command.logඔවුන් විධාන ප්‍රතිදානය command.logගොනුවට තත්‍ය කාලීනව සුරකින ගැටලුවක් නොමැත .

එම ගැටළුව මඟහරවා ගැනීමට සහ විධාන ප්‍රතිදානය තත්‍ය කාලීනව සුරැකීමට, ඔබට එකතු කළ හැකිය unbuffer, එය expectපැකේජය සමඟ පැමිණේ .


උදාහරණයක්:

sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log

උපකල්පනය කරයි log.py:

import time
print('testing')
time.sleep(100) # sleeping for 100 seconds

ඔබ ක්රියාත්මක කළ හැකිය unbuffer python log.py | tee command.logහෝunbuffer python log.py > command.log

වැඩි විස්තර: තත්‍ය කාලීනව ගොනුවකට විධාන ප්‍රතිදානය සුරැකිය හැක්කේ කෙසේද?


ප්‍රතිදානය ලැබුන විට ඔවුන් එය සුරකිනු ඇත, ගැටළුව වන්නේ ප්‍රතිදානය TTY වෙත නොවන විට පයිතන් බෆරය සක්‍රීය කිරීමයි. Python මෙම අක්රිය කිරීමේ වෙනත් විකල්ප: stackoverflow.com/q/107705/2072269
muru

ස්තූතියි! මෙය සෙවීම සඳහා බොහෝ කාලයක් ගත කළ අතර මට අවශ්‍ය වූයේ මෙයයි. ගූගල් සහකාර ස්ක්‍රිප්ට් වල stdout සමඟ ක්‍රියා කරයි.
anonymous2

5

මෙහි වෙනස් ප්‍රශ්න දෙකක් තිබේ. පළමුවැන්න මාතෘකාව තුළ ය:

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

දෙවන ප්‍රශ්නය ශරීරය තුළ ඇත:

විධානයක ප්‍රතිදානය ගොනුවකට සුරැකෙන්නේ කෙසේද?

මෙහි පළ කර ඇති සියලුම පිළිතුරු දෙවන ප්‍රශ්නයට ආමන්ත්‍රණය කරන නමුත් යුනික්ස් සහ ලිනක්ස් හි විශිෂ්ට පිළිතුරක් ඇති පළමු ප්‍රශ්නයට කිසිවෙකු ආමන්ත්‍රණය නොකරයි :

මෙම පිළිතුර මඳක් දන්නා විධානයක් භාවිතා කරයි, එය scriptඔබ ටයිප් කරන තෙක් ඔබේ ෂෙල් ප්‍රතිදානය පෙළ ගොනුවකට සුරකිනු exitඇත. විධාන ප්‍රතිදානය තවමත් ඔබේ තිරය මත දිස්වන අතර පෙළ ගොනුවේ ද දිස් වේ .

ක්රියාවලිය සරලයි. භාවිත:

$ script ~/outputfile.txt
Script started, file is /home/rick/outputfile.txt
$ command1
$ command2
$ command3
$ exit
exit
Script done, file is /home/rick/outputfile.txt

1, 2 සහ 3 විධානයන්හි ඔබේ වාර්තාගත ප්‍රතිදානය දෙස බලන්න:

cat ~/outputfile.txt

මෙය පෙර පිළිතුරට සමානය :

command |& tee ~/outputfile.txt
  • නමුත් ඔබ |& tee ~/outputfile.txtඑක් එක් පසු භාවිතා කිරීමට අවශ්ය නැත commnd.
  • මෙම scriptවිධානය නැවත පිරවීම වාසිය (හෝ අවාසිය) සඳහන් කර ඇත ~/.bashrcඑය ආරම්භ කරන විට.
  • මෙම scriptවිධානය සංදර්ශන (විමසුම විධානය $PS1) ඔබ ඇතුළු විධානය (ව) විසින් අනුගමනය.
  • මෙම scriptවිධානය සම්පූර්ණ වර්ණ සියලු විස්තර වාර්තා කරයි.


ඔබගේ සම්බන්ධිත පිළිතුරෙහි ud සුඩෝඩස් +1. scriptඑවැනි යෙදුමක් සඳහා භාවිතා කිරීම ගැන මම කිසි විටෙකත් සිහිනෙන්
නොසිතුවෙමි

0

එක් එක් විධානයන්ගෙන් ප්‍රතිදානයන් ගොනුවකට සුරැකීමට, ඔබට සෑම දෙනාටම දැනටමත් සඳහන් කර ඇති COMMAND> filename.txt සහ COMMAND >> filename.txt ක්‍රමය භාවිතා කළ හැකිය.

නමුත් ස්ක්‍රිප්ට් විධානය සඳහන් කිරීම වටී යැයි මම සිතමි . ඔබට සම්පූර්ණ පර්යන්ත සැසියක් පටිගත කිරීමට අවශ්‍ය නම්, එය ගොනුවකට සුරැකීමට ස්ක්‍රිප්ට් විධානය භාවිතා කළ හැකිය:

ස්ක්‍රිප්ට් filename.txt

CTRL + D එබීමෙන් ඔබ සැසිය අවසන් කරන තෙක් සියල්ල ගොනුවට සුරකිනු ඇත.

මම නිතරම මෙය භාවිතා නොකරමි. මම ප්රධාන වශයෙන් පමණක් >> ක්රමය භාවිතා කරන්න, නමුත් මම ඇත මම එය වටිනා සඳහන් වූ විය තෙරුම් එසේ, ස්ක්රිප්ට් විධානය කිහිප වතාවක් පාවිච්චි කළා.

චියර්ස්!

-බූයි

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.