Bd සමඟ ඇති ගොනුවකට stdout සහ stderr යන දෙකම හරවා යැවීම සහ එකතු කරන්නේ කෙසේද?


1553

බාෂ් හි කප්පාදු කරන ලද ගොනුවකට stdout හරවා යැවීමට , මම භාවිතා කිරීමට දනිමි:

cmd > file.txt

ගොනුවකට එකතු කරමින්, බාෂ් හි stdout නැවත හරවා යැවීමට , මම භාවිතා කිරීමට දනිමි:

cmd >> file.txt

Stdout සහ stderr යන දෙකම කපා දැමූ ගොනුවකට හරවා යැවීමට , මම භාවිතා කිරීමට දනිමි:

cmd &> file.txt

ගොනුවකට එකතු වන stdout සහ stderr යන දෙකම නැවත හරවා යැවිය හැක්කේ කෙසේද ? cmd &>> file.txtමට වැඩ කළේ නැහැ.


37
&> පිටපත යනු බාෂ් (සහ වෙනත්) විශේෂිත කේතයක් වන අතර එය අතේ ගෙන යා නොහැකි බව මම සටහන් කිරීමට කැමැත්තෙමි. අතේ ගෙන යා හැකි මාර්ගය (උපග්‍රන්ථ වලට සමාන) සෑම විටම හා තවමත් පවතී> පිටත 2> & 1
TheBonsai

… එය ඇණවුම් කිරීම වැදගත් ය.
ටොරස්ටන් බ්‍රොන්ගර්

Answers:


2024
cmd >>file.txt 2>&1

බෑෂ් වමේ සිට දකුණට යළි-යොමුවීම් පහත පරිදි ක්‍රියාත්මක කරයි:

  1. >>file.txt: file.txtඋපග්‍රන්ථ ප්‍රකාරයෙන් විවෘත කර stdoutඑහි හරවා යවන්න .
  2. 2>&1: යළි-යොමුවීම stderr කිරීමට "කොහේද stdoutදැනට යන්නේ" . මෙම අවස්ථාවේදී, එය උපග්‍රන්ථ ආකාරයෙන් විවෘත කරන ලද ගොනුවකි. වෙනත් වචන වලින් කිවහොත්, දැනට භාවිතා &1කරන ගොනු විස්තරය නැවත stdoutභාවිතා කරයි.

34
නියමයි! නමුත් මෙය තේරුම් ගැනීමට ක්‍රමයක් තිබේද? නැතහොත් මම මෙය පරමාණුක බාෂ් ඉදිකිරීමක් ලෙස සැලකිය යුතුද?
flybywire

181
එය සරල යළි හරවා යැවීමකි, යළි හරවා යැවීමේ ප්‍රකාශ සෑම විටම මෙන් වමේ සිට දකුණට ඇගයීමට ලක් කෙරේ. >> ගොනුව: රතු. ගොනු කිරීමට STDOUT (උපග්‍රන්ථ ප්‍රකාරය) (1 >> ගොනුව සඳහා කෙටි) 2> සහ 1: රතු. STDERR "stdout යන තැනට" "STDERR STDOUT වෙත හරවා යැවීම" යන අර්ථ නිරූපණය වැරදිය.
TheBonsai

31
එහි සඳහන් වන්නේ "ප්‍රතිදානය (stdout, ගොනු විස්තර 1) file.txt වෙත එකතු කර stderr (ගොනු විස්තර 2) fd1 ලෙස එකම ස්ථානයට යවන්න" යන්නයි.
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

2
B බොන්සායි කෙසේ වෙතත් මට STDERR වෙනත් ගොනුවකට හරවා යැවීමට අවශ්‍ය නමුත් එකතු වන්නේ නම් කුමක් කළ යුතුද? මෙය කළ හැකිද?
arod

41
ඔබ cmd >>file1 2>>file2එය කරන්නේ නම් ඔබට අවශ්‍ය දේ සාක්ෂාත් කරගත යුතුය.
වුඩ්රෝ ඩග්ලස්

369

ඔබේ බෑෂ් අනුවාදය මත පදනම්ව මෙය කිරීමට ක්‍රම දෙකක් තිබේ.

සම්භාව්‍ය සහ අතේ ගෙන යා හැකි ( Bash pre-4 ) ක්‍රමය:

cmd >> outfile 2>&1

ඒ nonportable මාර්ගය, සමඟ ආරම්භ වන බෑෂ් 4 කියන්නේ

cmd &>> outfile

(ප්‍රතිසමයට &> outfile)

හොඳ කේතීකරණ විලාසය සඳහා, ඔබ කළ යුතුය

  • අතේ ගෙන යා හැකි කාරණයක් දැයි තීරණය කරන්න (ඉන්පසු සම්භාව්‍ය ක්‍රමය භාවිතා කරන්න)
  • Bash pre-4 වෙත පවා අතේ ගෙන යා හැකි බව සැලකිලිමත් වන්න (පසුව සම්භාව්‍ය ක්‍රමය භාවිතා කරන්න)
  • ඔබ කුමන වාක්‍ය ඛණ්ඩය භාවිතා කළත් එය එකම පිටපතක් තුළ වෙනස් නොකරන්න (ව්‍යාකූලත්වය!)

ඔබගේ ස්ක්‍රිප්ට් දැනටමත් ආරම්භ වන්නේ නම් #!/bin/sh ඇත්නම් (අදහස් කළත් නැතත් කමක් නැත), එවිට Bash 4 විසඳුම සහ පොදුවේ ඕනෑම Bash- විශේෂිත කේතයක් යන්නට මාර්ගය නොවේ.

Bash 4 &>>කෙටි වාක්‍ය ඛණ්ඩයක් බව මතක තබා ගන්න - එය නව ක්‍රියාකාරිත්වයක් හෝ එවැනි කිසිවක් හඳුන්වා නොදේ.

සින්ටැක්ස් මෙහි විස්තර කර ඇත (වෙනත් යළි හරවා යැවීමේ සින්ටැක්ස් හැර): http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output


8
මම කැමතියි & >> එය &> සහ >> සමඟ අනුකූල වන නිසා. 'ප්‍රතිදානයට දෝෂ යැවීම, මෙම ගොනුවට ප්‍රතිදානය එකතු කිරීම' යන්නට වඩා 'මෙම ගොනුවට ප්‍රතිදානය සහ දෝෂ එකතු කිරීම' කියවීම පහසුය. සටහන ලිනක්ස් සාමාන්‍යයෙන් වර්තමාන බාෂ් අනුවාදයක් වන අතර, ලියන අවස්ථාව වන විට, ඕඑස් එක්ස්,
හෝම්බ rew

මම එයට වඩා කැමතියි එය කෙටි වන අතර එක් පේළියකට ට්වෝයි ස්ථාන පමණක් බැවින්, උදාහරණයක් ලෙස zsh "& >>" වලින් කුමක් කරයිද?
ෆිලිප්

ඔබේ පද්ධතියට Bash 4 තිබුණත්, ක්‍රෝන් රැකියාවකදී, ඔබ පෙර -4 සින්ටැක්ස් භාවිතා කළ යුතු බව සැලකිල්ලට ගැනීම වැදගත්ය.
හයිපර්නොට්

5
sezroro cron කිසිසේත් bash භාවිතා නොකරයි ... එය භාවිතා කරයි sh. ඔබ prepending විසින් පෙරනිමි ෂෙල් වෙනස් කළ හැකිය SHELL=/bin/bashවෙත crontab -eගොනු.
රේ ෆොස්

91

Bash හි ඔබට විවිධ ගොනු වෙත ඔබේ යළි-යොමුවීම් පැහැදිලිව සඳහන් කළ හැකිය:

cmd >log.out 2>log_error.out

එකතු කිරීම වනුයේ:

cmd >>log.out 2>>log_error.out

6
ඔබේ පළමු විකල්පය භාවිතා කරමින් එකම ගොනුවකට ධාරාවන් දෙකක් හරවා යැවීමෙන් පළමුවැන්න දෙවැන්නෙහි "ඉහළින්" ලිවීමට හේතු වන අතර සමහර අන්තර්ගතයන් නැවත ලියයි. භාවිතය cmd >> log.out 2> log.out වෙනුවට.
ඔරෙස්ටිස් පී.

3
එය අල්ලා ගැනීමට ස්තූතියි; ඔබ හරි, එක් කෙනෙක් අනෙකාට පහර දෙයි. කෙසේ වෙතත්, ඔබේ විධානය ද ක්‍රියා නොකරයි. එකම ගොනුවකට ලිවීමට ඇති එකම ක්‍රමය කලින් ලබා දී ඇති ආකාරයටම යැයි මම සිතමි cmd >log.out 2>&1. පළමු උදාහරණය ඉවත් කිරීම සඳහා මම මගේ පිළිතුර සංස්කරණය කරමි.
ආරොන් ආර්.

65

Bash 4 හි (මෙන්ම ZSH 4.3.11):

cmd &>>outfile

කොටුවෙන් පිටත


2
: all: මෙය හොඳ පිළිතුරකි, මන්ද එය බාෂ් සමඟ ක්‍රියා කරන අතර එය කෙටියි, එබැවින් මම එය සංස්කරණය කර ඇත්තේ එය පැහැදිලිවම බාෂ් ගැන සඳහන් කර ඇති බව තහවුරු කර ගැනීම සඳහා ය.
mikemaccana

10
ikemikemaccana: TheBonsai හි පිළිතුර 2009 සිට bash 4 විසඳුම පෙන්වයි
jfs

53

මෙය හොඳින් ක්‍රියාත්මක විය යුතුය:

your_command 2>&1 | tee -a file.txt

එය සියළුම ල logs ු -සටහන් file.txt හි ගබඩා කර ටර්මිනලයට දමනු ඇත.


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

25

මේක උත්සාහ කරන්න

You_command 1>output.log  2>&1

ඔබගේ &> x.file භාවිතය bash4 හි ක්‍රියා කරයි. ඒකට සමාවෙන්න : (

මෙන්න අමතර උපදෙස් කිහිපයක්.

0, 1, 2 ... 9 යනු බාෂ් හි ගොනු විස්තර කරන්නන් ය.

0 යනු stdin1, 1 යනු stdout, 2 යනු stderror. 3 ~ 9 වෙනත් ඕනෑම තාවකාලික භාවිතයක් සඳහා අමතර වේ.

කිසිම ගොනුවක් descriptor ක්රියාකරු භාවිතා අනෙකුත් ගොනු descriptor හෝ ගොනුව නැවත යොමු කළ හැක >හෝ >>(ඇතුලත්).

භාවිතය: < file_descriptor > > < ගොනු | & file_descriptor >

කරුණාකර http://www.tldp.org/LDP/abs/html/io-redirection.html වෙත යොමු වන්න


ඔබගේ උදාහරණය OP ඉල්ලා සිටි දෙයට වඩා වෙනස් දෙයක් කරනු ඇත: එය stdout හි You_commandstdr සහ stdout You_commandගොනුව වෙත හරවා යවනු ඇත output.log. මීට අමතරව එය ගොනුවට එකතු නොවන නමුත් එය නැවත ලියයි.
pabouk

නිවැරදි: ගොනු විස්තර කරන්නා අනෙක් සියලුම ගොනු සඳහා 3 ට වඩා වැඩි අගයන් විය හැකිය.
ඉටාචි

5
ඔබේ පිළිතුර වඩාත් පොදු ප්‍රතිදාන යළි-යොමුවීමේ දෝෂය පෙන්වයි: STDERR දැනට STDOUT පෙන්වා ඇති ස්ථානයට හරවා යැවීම සහ STDOUT ගොනුව වෙත හරවා යැවීමෙන් පසුව පමණි. මෙය STDERR එකම ගොනුවකට හරවා යැවීමට හේතු නොවේ. යළි-යොමුවීම් අනුපිළිවෙල වැදගත් වේ.
Jan Wikholm

1
එහි තේරුම, මම පළමුව STDERROR STDOUT වෙත හරවා යැවිය යුතු අතර පසුව STDOUT ගොනුවකට හරවා යැවිය යුතුය. 1 > output.log 2>&1
Quintus.Zhou

1
@ ක්වින්ටස්.ෂෝ යූප්. ඔබගේ අනුවාදය යළි-යොමුවීම් වැරදියි, ඒ සමඟම ගොනු කිරීම.
ඇලෙක්ස් යාරෝෂෙවිච්

11

වසර දහයකට ආසන්න කාලයක් තුළ කිසිවෙකු තවමත් මෙම ප්‍රවේශය පළ නොකිරීම ගැන මම පුදුම වෙමි.

&>>ලබා ගත නොහැකි තැන පැරණි අනුවාදයන් භාවිතා කරන්නේ නම් , ඔබට ද කළ හැකිය:

(cmd 2>&1) >> file.txt

මෙය සම්ප්‍රදායික ප්‍රවේශයට වඩා අඩු කාර්යක්ෂමතාවයක් ඇති cmd >> file.txt 2>&1අතර එමඟින් වර්තමාන කවචය (උදා cd. pushd) වෙනස් කිරීමට අවශ්‍ය විධාන සඳහා එය ක්‍රියා නොකරනු ඇත , නමුත් මෙම ප්‍රවේශය මට වඩා ස්වාභාවික හා තේරුම්ගත හැකි යැයි හැඟේ:

  1. Stderr stdout වෙත හරවන්න.
  2. ගොනුවකට එකතු කිරීමෙන් නව stdout නැවත හරවන්න.

තවද, වරහන් මඟින් අනුපිළිවෙලෙහි අපැහැදිලි බවක් ඉවත් කරයි, විශේෂයෙන් ඔබට stdout සහ stderr වෙනත් විධානයකට නල කිරීමට අවශ්‍ය නම්.

සංස්කරණය කරන්න: උපසිරැසියක් ආරම්භ කිරීමෙන් වළක්වා ගැනීම සඳහා, කණ්ඩායම් විධානයක් නිර්මාණය කිරීම සඳහා වරහන් වෙනුවට කැරලි වරහන් භාවිතා කළ හැකිය :

{ cmd 2>&1; } >> file.txt

(කණ්ඩායම් විධානය අවසන් කිරීම සඳහා අර්ධ සළකුණක් (හෝ නව රේඛාවක්) අවශ්‍ය බව සලකන්න.)


මෙම ක්‍රියාත්මක කිරීම මඟින් පද්ධතිය ක්‍රියාත්මක වීමට එක් අමතර ක්‍රියාවලියක් හේතු වේ. සින්ටැක්ස් භාවිතා cmd >> file 2>&1කිරීම සියලුම කවච වල ක්‍රියා කරන අතර ක්‍රියාත්මක කිරීමට අමතර ක්‍රියාවලියක් අවශ්‍ය නොවේ.
මිකෝ රන්ටලයිනන්

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

1
IckMikkoRantalainen මම මගේ පිළිතුර යාවත්කාලීන කර ඇත්තේ ප්‍රභේදයක් සමඟිනි.
jamesdlin

ඔබට සැබවින්ම මතක තබා ගත නොහැකි නම් සින්ටැක්ස් cmd >> file 2>&1හෝ cmd 2>&1 >> fileමම සිතන්නේ cmd 2>&1 | cat >> fileවරහන් හෝ වරහන් භාවිතා කිරීම වෙනුවට එය කිරීම පහසු වනු ඇති බවයි . මට නම්, ක්‍රියාත්මක කිරීම cmd >> file 2>&1වචනාර්ථයෙන් "STDOUT වෙත හරවා යැවීම file" සහ " STDOUR දැනට පෙන්වා ඇති ඕනෑම ගොනුවකට STDERR යළි හරවා යැවීම " (එය පැහැදිලිවම fileපළමු යළි -යොමුවීමෙන් පසුව බව) තේරුම් ගත් පසු, ඔබ යළි-යොමුවීම් තැබූ අනුපිළිවෙල කුමක්දැයි වහාම පැහැදිලි වේ. . යුනික්ස් ප්‍රවාහයක් වෙත හරවා යැවීමට සහාය නොදක්වයි, ප්‍රවාහයක් මඟින් පෙන්වා ඇති ගොනු විස්තර කිරීමට පමණි .
මිකෝ රන්ටලයිනන්
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.