කවචයේ “2> & 1” යන්නෙන් අදහස් කරන්නේ කුමක්ද?


2302

එය Unix shell, මම එකට එකතු කිරීමට අවශ්ය නම් stderrහා stdoutතුලට stdoutතවදුරටත් හැසිරවීම සඳහා විෂය ධාරාව, මම පහත සඳහන් මගේ අණට අවසන් මත ඇතුලත් කළ හැක:

2>&1

එබැවින්, මට headප්‍රතිදානය භාවිතා කිරීමට අවශ්‍ය නම් g++, මට මේ වගේ දෙයක් කළ හැකිය:

g++ lots_of_errors 2>&1 | head

ඒ නිසා මට පෙනෙන්නේ පළමු දෝෂ කිහිපයක් පමණි.

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

යමෙකුට මෙය බිඳ දමා චරිතය අනුව චරිතය පැහැදිලි කළ 2>&1 හැකිද?


50
bdbr මම හිතන්නේ නැහැ එය නිකම්ම නිකම් බාෂ් එකක් කියලා - මම විශ්වාස කරනවා එය බෝර්න් ෂෙල් දෙයක් කියලා; එබැවින් sh, bash, ksh, අළු, ඉර, ආදිය
තුවක්කු

8
මෙය POSIX- අනුකූල ෂෙල් වෙඩි හෝ කෙටියෙන් POSIX shell විස්තර කරන නැවත හරවා යැවීමේ ඡේදයේ කොටසකි. ksh යනු POSIX කවචයකි. බලන්න: pubs.opengroup.org/onlinepubs/009695399/utilities/…
jim

12
මෙම ඉදිකිරීම වින්ඩෝස් වලද ක්‍රියාත්මක වේ.
වඩ්සිම්

2
එය සාමාන්‍යයෙන් 2> / dev / null ;-)2>&1
F. Hauri

11
මම ඒ ගැන සඳහන් වේවි කියලා |& සඳහා වන සරල යෙදුමකි 2>&1 |ඔබ zsh භාවිතා කරන්නේ නම්. එය වෙනත් බෝර්න් වැනි ෂෙල් වෙඩි වලට අදාළ වේද යන්න හෝ එය zsh පමණක් අංගයක්ද යන්න මට කථා කළ නොහැක.
ක්‍රික්සියන්

Answers:


2576

ගොනු විස්තර 1 යනු සම්මත ප්‍රතිදානය ( stdout) වේ.
ගොනු විස්තර 2 යනු සම්මත දෝෂයයි ( stderr).

මෙම ඉදිකිරීම මතක තබා ගත හැකි එක් ක්‍රමයක් මෙන්න (එය සම්පූර්ණයෙන්ම නිවැරදි නොවේ): මුලදී, 2>1නැවත හරවා යැවීමට හොඳ ක්‍රමයක් stderrසේ stdoutපෙනේ. කෙසේ වෙතත්, එය ඇත්ත වශයෙන්ම " stderrනම් කරන ලද ගොනුවකට හරවා යැවීම " ලෙස අර්ථ දැක්වෙනු ඇත 1. &පහත දැක්වෙන්නේ ගොනු විස්තරයක් මිස ගොනු නාමයක් නොවන බවයි. එබැවින් ඉදිකිරීම් බවට පත්වේ : 2>&1.


283
නමුත් එසේ විය යුතු &2>&1නොවේද?
dokaspar

322
Omin ඩොමිනික්: නෑ, &අර්ථ නිරූපණය කෙරෙන්නේ යළි-යොමුවීම් සන්දර්භය තුළ “ගොනු විස්තර කරන්නා” යන්නයි. ලිවීම command &2>&විග්‍රහ කර ඇති command &අතර 2>&1, එනම් “ commandපසුබිමේ ධාවනය කරන්න, ඉන්පසු විධානය ක්‍රියාත්මක කර 2එහි stdout එහි stdout වෙත හරවා යවන්න”.
ඇඩම් රොසෙන්ෆීල්ඩ්

16
ඔවුන් මෙවැනි චාම් දේවල් තෝරාගත්තේ ඇයි? කුතුහලයෙන්.
කොමාටෝස්ට්

82
නමුත් ඔබ stderr '& 1' නම් ගොනුවකට හරවා යවන්නේ කෙසේද?
මාටින් ෆික්ස්මන්

121
Ar මාටින්:2>'&1'

636
echo test > afile.txt

stdout වෙත හරවා යවයි afile.txt. මෙය සිදු කිරීම හා සමානයි

echo test 1> afile.txt

Stderr නැවත හරවා යැවීම සඳහා, ඔබ කරන්නේ:

echo test 2> afile.txt

>& ප්‍රවාහය වෙනත් ගොනු විස්තරයකට හරවා යැවීමේ වාක්‍ය ඛණ්ඩයයි - 0 යනු stdin, 1 stdout, සහ 2 stderr.

එසේ කිරීමෙන් ඔබට stdout stderr වෙත හරවා යැවිය හැකිය:

echo test 1>&2 # or echo test >&2

හෝ අනෙක් අතට:

echo test 2>&1

කෙටියෙන් කිවහොත් ... 2>stderr (නිශ්චිතව දක්වා නැති) ගොනුවකට &1හරවා යවයි, stderr stdout වෙත යළි හරවා යවයි.


5
මෙය ඔබට කිසියම් තේරුමක් තිබේද, java ... 2&1 >> data.logමගේ සගයකු මෙය කළ බව මම දුටුවෙමි.
තං ෆාම්

5
Har හැරී බැලූ බැල්මට නැති ෂෙල් එකක් හෝ යතුරු ලියනයකි .. cmd 2>&1 >> somefile.logගොනුවකට stdout / stderr එකතු කරනු ඇත - එය මූලික වශයෙන් ඉහත ආකාරයටම වේ, >> fileඑකතු කිරීමත් සමඟ
dbr

73
brdbr stderr cmd 2>&1 >>fileගොනුවට හරවා යවන්නේ නැත cmd >> file 2>&1. ඇණවුම් කරුණු. පළමු අවස්ථාවෙහිදී, stderr කවචයේ stdout වෙත හරවා යවනු ලැබේ (සමහර විට විධානය අන්තර්ක්‍රියාකාරීව ඇතුලත් කර ඇත්නම් tty වේ), පසුව stdout ගොනුව වෙත යොමු කෙරේ. දෙවන අවස්ථාවෙහිදී, stdout ගොනුව වෙත යොමු කරනු ලැබේ, පසුව stderr එකම ස්ථානයට යොමු කෙරේ.
විලියම් පර්සෙල්

2
මම ඉහත පිළිතුරට කැමතියි, නමුත් එය වඩාත් පැහැදිලි විය හැකිය. "2> & 1" stderr stdout ඉලක්කයට හරවා යවයි. එබැවින් ඔබට "ls -l >> directoryContents 2> & 1" වැනි යමක් තිබේ නම් එහි ප්‍රති result ලය වනුයේ directoryContents නම් ගොනුවකි. ක්‍රියාත්මක කිරීමේදී කිසියම් දෝෂයක් තිබේ නම්: දෝෂ පණිවිඩ සිදුවන විට මෙන් ම ඩිරෙක්ටරි අන්තර්ගත ගොනුවට ද එකතු වේ.
මැක්ස් වෙස්ට්

1
0(or 1,2)>&0(or 1,2)ප්රතිදානය පාලනය කිරීමට විකල්පයක් වගේ දෙයක්? වන echo test >test.log 2>&1ලෙස එම echo test 2>&1 >test.log?
සිමින් ජි

319

නැවත හරවා යැවීම පිළිබඳ සමහර උපක්‍රම

මේ පිළිබඳ සමහර සින්ටැක්ස් විශේෂතාවයට වැදගත් හැසිරීම් තිබිය හැකිය. Redirections, සමහර අය ගැන ටිකක් සාම්පල ඇත STDERR, STDOUTසහ තර්ක ඇනවුම් කිරීම .

1 - නැවත ලිවීම හෝ එකතු කිරීම?

සංකේතය >යනු යළි හරවා යැවීමයි .

  • >අදහස් සමස්තයක් සම්පූර්ණ කරන ගොනුවක් ලෙස යවන්න , පවතී නම් ඉලක්කය මත ලියන්නේ (බලන්න noclobberදී පැවැත්වෙනු ලක්ෂණය # 3 පසුව).
  • >>මධ්යන්ය යැවීමට අමතරව යැවීම යන්න ඉලක්කයට එකතු වේ.

ඕනෑම අවස්ථාවක, ගොනුව නොපවතී නම් එය නිර්මාණය වේ.

2 - ෂෙල් විධාන රේඛාව ඇණවුම මත රඳා පවතී !!

මෙය පරීක්ෂා කිරීම සඳහා, අපට සරල විධානයක් අවශ්‍ය වන අතර එමඟින් ප්‍රතිදානයන් දෙකටම යමක් යවනු ලැබේ :

$ ls -ld /tmp /tnt
ls: cannot access /tnt: No such file or directory
drwxrwxrwt 118 root root 196608 Jan  7 11:49 /tmp

$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt 2>/dev/null
drwxrwxrwt 118 root root 196608 Jan  7 11:49 /tmp

(ඔබට නාමාවලියක් නොමැති බව අපේක්ෂා /tntකිරීම, ඇත්ත වශයෙන්ම;). හොඳයි, අපට එය තිබේ !!

ඉතින්, අපි බලමු:

$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1

$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory

අන්තිම විධාන රේඛාව STDERRකොන්සෝලය වෙතට ඇද වැටෙන අතර එය අපේක්ෂිත හැසිරීම නොවන බව පෙනේ ... නමුත් ...

ඔබට එක් නිමැවුමක් ගැන පෝස්ට් පෙරනයක් කිරීමට අවශ්‍ය නම් , අනෙක් හෝ දෙකම:

$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan  7 12:02 /tmp --->

$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan  7 12:02 /tmp --->

$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$/<-- & --->/'

$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->

මෙම ඡේදයේ අවසාන විධාන රේඛාව පෙර ඡේදයට සමාන බව සලකන්න , එහිදී මා ලියා ඇත්තේ අපේක්ෂිත හැසිරීම නොවන බව පෙනේ (එබැවින් මෙය අපේක්ෂිත හැසිරීමක් විය හැකිය).

ප්‍රතිදානයන් දෙකෙහිම වෙනස් ක්‍රියාකාරිත්වයක් සිදු කිරීම සඳහා, යළි-යොමුවීම් පිළිබඳ කුඩා උපක්‍රම තිබේ :

$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2  2>&1  | sed 's/^/E: /'
O: drwxrwxrwt 118 root root 196608 Jan  7 12:13 /tmp
E: ls: cannot access /tnt: No such file or directory

සටහන: &9විස්තර කරන්නා ස්වයංසිද්ධව සිදුවන්නේ ) 9>&2.

අතිරේක: නෝටා! හි නව අනුවාදය සමඟ( >4.0) මේ ආකාරයේ දේවල් කිරීම සඳහා නව අංගයක් සහ වඩාත් සරාගී සින්ටැක්ස් ඇත:

$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')
O: drwxrwxrwt 17 root root 28672 Nov  5 23:00 /tmp
E: ls: cannot access /tnt: No such file or directory

අවසාන වශයෙන් එවැනි කඳුරැල්ලක ප්‍රතිදාන හැඩතල ගැන්වීම සඳහා:

$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n
     1  O: drwxrwxrwt 118 root root 196608 Jan  7 12:29 /tmp
     2  E: ls: cannot access /tnt: No such file or directory

අතිරේක: නෝටා! එකම නව වාක්‍ය ඛණ්ඩය, ක්‍රම දෙකෙන්ම:

$ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /'))
     1  O: drwxrwxrwt 17 root root 28672 Nov  5 23:00 /tmp
     2  E: ls: cannot access /tnt: No such file or directory

කොහෙද STDOUT, නිශ්චිත පෙරහන හරහා යන්න STDERRතවත් හා අවසානයේ ප්රතිදානයන් දෙකම තුන්වන විධානය පෙරහන හරහා යන්න ඒකාබද්ධ.

3 - noclobberවිකල්පය සහ >|වාක්‍ය ඛණ්ඩය පිළිබඳ වචනයක්

එය නැවත ලිවීම ගැන ය :

අතර set -o noclobberඋපදෙස් ලබා bash කිරීමට නොහැකි කිසිදු පවතින ගොනුවට ලිපිය, එම >|කාරක රීති ඔබ මෙම සීමාවන් හරහා ගමන් කරමු:

$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:15 CET 2013

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:19 CET 2013

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:21 CET 2013

ගොනුව සෑම අවස්ථාවකදීම නැවත ලියනු ලැබේ, දැන්:

$ set -o noclobber

$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan  7 13:18:21 CET 2013

$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan  7 13:18:21 CET 2013

සමඟ ගමන් කරන්න >|:

$ date >| $testfile ; cat $testfile
Mon Jan  7 13:18:58 CET 2013

$ date >| $testfile ; cat $testfile
Mon Jan  7 13:19:01 CET 2013

මෙම විකල්පය අස්ථාපනය කිරීම සහ / හෝ දැනටමත් සකසා තිබේදැයි විමසීම.

$ set -o | grep noclobber
noclobber           on

$ set +o noclobber

$ set -o | grep noclobber
noclobber           off

$ date > $testfile ; cat $testfile
Mon Jan  7 13:24:27 CET 2013

$ rm $testfile

4 - අවසාන උපක්‍රමය සහ තවත් ...

දී ඇති විධානයකින් ප්‍රතිදානය දෙකම හරවා යැවීම සඳහා, නිවැරදි සින්ටැක්ස් එකක් විය හැකි බව අපට පෙනේ:

$ ls -ld /tmp /tnt >/dev/null 2>&1

මෙම විශේෂ අවස්ථාව සඳහා, කෙටිමං සින්ටැක්ස් ඇත: &>... හෝ>&

$ ls -ld /tmp /tnt &>/dev/null

$ ls -ld /tmp /tnt >&/dev/null

සටහන: 2>&1පවතින්නේ 1>&2නම් එය නිවැරදි වාක්‍ය ඛණ්ඩයකි:

$ ls -ld /tmp /tnt 2>/dev/null 1>&2

4b- දැන්, මම ඔබට මේ ගැන සිතා බැලීමට ඉඩ දෙන්නෙමි:

$ ls -ld /tmp /tnt 2>&1 1>&2  | sed -e s/^/++/
++/bin/ls: cannot access /tnt: No such file or directory
++drwxrwxrwt 193 root root 196608 Feb  9 11:08 /tmp/

$ ls -ld /tmp /tnt 1>&2 2>&1  | sed -e s/^/++/
/bin/ls: cannot access /tnt: No such file or directory
drwxrwxrwt 193 root root 196608 Feb  9 11:08 /tmp/

4c- ඔබ වැඩි විස්තර සඳහා කැමති නම්

පහර දීමෙන් ඔබට සියුම් අත්පොත කියවිය හැකිය:

man -Len -Pless\ +/^REDIRECTION bash

තුළ console ;-)


5
වැඩිදුර කියවීම: ඔබ මෙය කැමති නම්, ඔබ අගය කළ හැකිය: යළි හරවා
එෆ්. හවුරි


132

නැවත හරවා යැවීම පිළිබඳ මෙම දීප්තිමත් ලිපිය මට හමු විය: සියල්ල නැවත හරවා යැවීම පිළිබඳ

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

$ විධානය &> ගොනුව

මෙම එක්-ලයිනර් &>ක්‍රියාකරු භාවිතා කරන්නේ ප්‍රතිදාන ධාරාවන් - stdout සහ stderr - විධානයේ සිට ගොනුව වෙත හරවා යැවීමට ය. ධාරාවන් දෙකම එකම ගමනාන්තයකට ඉක්මනින් හරවා යැවීම සඳහා මෙය බාෂ්ගේ කෙටිමඟ වේ.

බාෂ් ධාරාවන් දෙකම හරවා යැවීමෙන් පසු ගොනු විස්තර වගුව පෙනෙන්නේ කෙසේද යන්න මෙන්න:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ඔබට පෙනෙන පරිදි, stdout සහ stderr යන දෙවර්ගයම දැන් පෙන්වා දෙයි file. එබැවින් stdout සහ stderr වෙත ලියා ඇති ඕනෑම දෙයක් ලියා ඇත file.

ධාරාවන් දෙකම එකම ගමනාන්තයක් වෙත හරවා යැවීමට ක්‍රම කිහිපයක් තිබේ. ඔබට එක් එක් ධාරාව එකින් එක හරවා යැවිය හැකිය:

$ විධානය> ගොනුව 2> සහ 1

ධාරාවන් දෙකම ගොනුවකට හරවා යැවීමට මෙය වඩාත් පොදු ක්‍රමයකි. පළමු stdout ගොනුව වෙත හරවා යවනු ලැබේ, පසුව stderr අනුපිටපත් stdout හා සමාන වේ. එබැවින් ධාරාවන් දෙකම යොමු වන්නේ අවසන් වේ file.

බාෂ් නැවත හරවා යැවීම් කිහිපයක් දුටු විට එය වමේ සිට දකුණට ක්‍රියා කරයි. අපි පියවර හරහා ගොස් එය සිදු වන්නේ කෙසේදැයි බලමු. ඕනෑම විධානයක් ක්‍රියාත්මක කිරීමට පෙර, Bash හි ගොනු විස්තර වගුව මේ ආකාරයෙන් පෙනේ:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

දැන් Bash විසින් පළමු යළි හරවා යැවීම> ගොනුව සකසයි. අපි මෙය මීට පෙර දැක ඇති අතර එය ගොනුවට stdout point කරයි:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ඊළඟට බාෂ් දෙවන යළි හරවා යැවීම 2> සහ 1 දකී. මෙම නැවත හරවා යැවීම අප මීට පෙර දැක නැත. මෙය ගොනු විස්තර 2 අනුපිටපත් කර ගොනු විස්තර 1 හි පිටපතක් වන අතර අපට ලැබෙන්නේ:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ධාරාවන් දෙකම ගොනුව වෙත හරවා යවා ඇත.

කෙසේ වෙතත් මෙහි ප්‍රවේශම් වන්න! ලේඛන

විධානය> ගොනුව 2> සහ 1

ලිවීමට සමාන නොවේ:

$ විධානය 2> & 1> ගොනුව

යළි-යොමුවීම් අනුපිළිවෙල Bash හි ඇති කරුණු! මෙම විධානය මඟින් ගොනුව වෙත සම්මත ප්‍රතිදානය පමණක් යොමු කරයි. Stderr තවමත් පර්යන්තයට මුද්‍රණය කරනු ඇත. එය සිදුවීමට හේතුව තේරුම් ගැනීමට, අපි නැවත පියවර හරහා යමු. එබැවින් විධානය ක්‍රියාත්මක කිරීමට පෙර, ගොනු විස්තර වගුව මේ ආකාරයෙන් පෙනේ:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

දැන් බාෂ් වමේ සිට දකුණට යළි හරවා යැවීම සිදු කරයි. එය මුලින්ම 2> සහ 1 දකිනු ඇත, එබැවින් එය stderr සිට stdout දක්වා අනුපිටපත් කරයි. ගොනු විස්තර වගුව බවට පත්වන්නේ:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

දැන් බාෂ් දෙවන යළි-යොමුවීම් දකින අතර >file, එය stdout ගොනුව වෙත හරවා යවයි:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

මෙහි සිදුවන්නේ කුමක්දැයි ඔබට පෙනේද? Stdout දැන් ගොනුව වෙත යොමු කරයි, නමුත් stderr තවමත් පර්යන්තයට යොමු කරයි! Stderr වෙත ලියා ඇති සෑම දෙයක්ම තවමත් තිරයට මුද්‍රණය වේ! එබැවින් යළි-යොමුවීම් අනුපිළිවෙල සමඟ ඉතා ප්‍රවේශම් වන්න!

Bash හි ලිවීමද සැලකිල්ලට ගන්න

$ විධානය &> ගොනුව

හරියටම සමාන වේ:

$ විධානය> සහ ගොනුව


3
"විධානය" අංකයකින් අවසන් වුවහොත් අවසාන දෙක වෙනස් වේ, එවිට එය විකල්ප ගොනු විස්තරයක් ලෙස ගනු ලැබේ>&
එම්එම්

ඉතා හොඳ චිත්‍රයක් සහ පැහැදිලි කිරීමක්! “අනුපිටපත” යන්නෙන් සැබවින්ම අදහස් කරන්නේ කුමක්ද යන්න ඔබට විස්තර කළ හැකිද? ඔබ සඳහන් කළේ, "මෙය [2> & 1] ගොනු විස්තර 2 අනුපිටපත් ගොනු විස්තර 1 හි පිටපතක් වනු ඇත". එය හරියට stderr stdout වෙත අනුපිටපත් වන බවක් පෙනේ. නමුත් එය එසේ නම්, මා ද වැරැද්දක් දැකිය /dev/tty0යුතුද?
එච්.සී.එස්.එෆ්

87

ඉලක්කම් ලිපිගොනු විස්තර කරන්නන්ට (fd) යොමු කරයි.

  • ශුන්‍ය වේ stdin
  • එකකි stdout
  • දෙකක් stderr

2>&1 fd 2 සිට 1 දක්වා යළි හරවා යවයි.

වැඩසටහන භාවිතා කරන්නේ නම් ගොනු විස්තර කරන්නන් සඳහා මෙය ක්‍රියා කරයි.

ඔබට /usr/include/unistd.hඒවා අමතක නම් ඔබට බලා ගත හැකිය :

/* Standard file descriptors.  */
#define STDIN_FILENO    0   /* Standard input.  */
#define STDOUT_FILENO   1   /* Standard output.  */
#define STDERR_FILENO   2   /* Standard error output.  */

අභිරුචි ලොග් වීම සඳහා සම්මත නොවන ගොනු විස්තර භාවිතා කරන සී මෙවලම් මා ලියා ඇති බැවින් ඔබ එය ගොනුවකට හෝ වෙනත් දෙයකට හරවා යැවුවහොත් මිස ඔබට එය නොපෙනේ.


58

එම ඉදිකිරීම සම්මත දෝෂ ප්‍රවාහය ( stderr) සම්මත නිමැවුමේ වත්මන් ස්ථානයට යවයි ( stdout) - මෙම මුදල් ප්‍රශ්නය අනෙක් පිළිතුරු නොසලකා හැර ඇති බව පෙනේ.

මෙම ක්‍රමය භාවිතා කිරීමෙන් ඔබට ඕනෑම නිමැවුම් හසුරුව වෙනත් තැනකට හරවා යැවිය හැකි නමුත් එය බොහෝ විට භාවිතා කරන්නේ සැකසුම් සඳහා තනි ප්‍රවාහයකට නාලිකා stdoutසහ stderrප්‍රවාහයන් ය.

උදාහරණ කිහිපයක්:

# Look for ERROR string in both stdout and stderr.
foo 2>&1 | grep ERROR

# Run the less pager without stderr screwing up the output.
foo 2>&1 | less

# Send stdout/err to file (with append) and terminal.
foo 2>&1 |tee /dev/tty >>outfile

# Send stderr to normal location and stdout to file.
foo >outfile1 2>&1 >outfile2

බව අවසාන එක ඇත සටහන නොවන යොමු stderrකිරීමට outfile2එය දේ යළි-යොමුකරයි - stdoutතර්කය මුහුණ විට විය ( outfile1) සහ පසුව යළි-යොමුකරයි stdoutකිරීමට outfile2.

මෙය ඉතා නවීන උපක්‍රම වලට ඉඩ දෙයි.


5
එම අවසාන උදාහරණය වඩා පැහැදිලි වනු ඇත: foo> outfile2 2> outfile1
මයිකල් ක්‍රාමර්

3
වඩා පැහැදිලිය, ඔව්, නමුත් එය නැවත හරවා යැවීමේ "ස්ථානීය" ස්වභාවය පෙන්වන්නේ නැත. මෙය තනි පේළියකින් කිරීම සාමාන්‍යයෙන් ප්‍රයෝජනවත් නොවන බැවින් උදාහරණය සැකසී ඇත - නැවත හරවා යැවීමේ විවිධ කොටස් සඳහා විවිධ පාර්ශ්වයන් වගකිව යුතු විට මෙම ක්‍රමය සැබවින්ම ප්‍රයෝජනවත් වේ. උදාහරණයක් ලෙස, ස්ක්‍රිප්ට් එකක් නැවත හරවා යැවීමක් සිදු කළ විට ඔබ එය තවත් බිට් එකකින් ධාවනය කරයි.
paxdiablo

5
අන්තිම උදාහරණයෙන් මෙය some_program 2>&1 > /dev/nullසිදුවන්නේ ඇයිද යන්න පිළිබඳව මා තුළ පැවති දිගු කාලීන ව්‍යාකූලතාවයක් ද විසඳන බව මට වැටහුණි: මේ ආකාරයට ක්‍රියා නොකරන්නේ : some_program > /dev/null 2>&1.
snapfractalpop

අවසාන උදාහරණය පිළිබඳ ඔබේ අදහස් රන් අකුරින් වටිනවා :-) මෙම යළි-යොමුකිරීමේ තර්ක ස්ථානගත යැයි මම කිසි විටෙකත් නොසිතුවෙමි ... මෙය දැන ගැනීම ඉතා වැදගත් යැයි මම සිතමි.
නිල්ස්-ඕ-මැට්

20

2>&1POSIX shell ඉදිකිරීමකි. මෙන්න බිඳවැටීමක්, ටෝකනයකින් ටෝකනය:


2: " සම්මත දෝෂ " ප්‍රතිදාන ගොනු විස්තර කරන්නා.

>&: දෙවන පිටපත නිමැවුම් ගොනුව Descriptor ක්රියාකරු (ක ප්රභේද්යයක් ප්රතිදාන හරවා යැවීම්, ක්රියාකරු >). ලබා [x]>&[y]දී ඇති පරිදි, ගොනු විස්තරය xප්‍රතිදානය ගොනු විස්තරයේ පිටපතක් බවට පත් කර ඇත y.

1" සම්මත ප්‍රතිදානය " ප්‍රතිදාන ගොනු විස්තරය.

ප්‍රකාශනය 2>&1ගොනු විස්තර කරන්නා 1ස්ථානයට පිටපත් කරයි 2, එබැවින් 2ක්‍රියාත්මක කිරීමේ පරිසරයේ ("සම්මත දෝෂය") වෙත ලියා ඇති ඕනෑම ප්‍රතිදානයක් මුලින් විස්තර කර ඇති ගොනුවට යයි 1("සම්මත ප්‍රතිදානය").


වැඩිදුර පැහැදිලි කිරීම:

ලිපිගොනු විස්තර කරන්නා: "ගොනු ප්‍රවේශය සඳහා විවෘත ගොනුවක් හඳුනා ගැනීම සඳහා භාවිතා කරන එක් ක්‍රියාවලියකට අද්විතීය, negative ණ නොවන පූර්ණ සංඛ්‍යාවක්."

සම්මත ප්‍රතිදානය / දෝෂය : ෂෙල් ප්‍රලේඛනයේ යළි-යොමුවීමේ කොටසේ පහත සටහන බලන්න :

විවෘත ගොනු ශුන්‍යයෙන් ආරම්භ වන දශම සංඛ්‍යා මගින් නිරූපණය කෙරේ. කළ හැකි විශාලතම අගය ක්‍රියාත්මක කිරීම-අර්ථ දැක්වීම ය; කෙසේ වෙතත්, සියළුම ක්‍රියාත්මක කිරීම් යෙදුම භාවිතා කිරීම සඳහා අවම වශයෙන් 0 සිට 9 දක්වා සහය දක්වයි. මෙම අංක "ගොනු විස්තර කරන්නන්" ලෙස හැඳින්වේ. 0, 1, සහ 2 යන අගයන්ට විශේෂ අරුතක් සහ සාම්ප්‍රදායික භාවිතයන් ඇති අතර ඒවා නැවත හරවා යැවීමේ මෙහෙයුම් වලින් ගම්‍ය වේ; ඒවා පිළිවෙලින් සම්මත ආදානය, සම්මත ප්‍රතිදානය සහ සම්මත දෝෂ ලෙස හැඳින්වේ. වැඩසටහන් සාමාන්‍යයෙන් ඒවායේ ආදානය සම්මත ආදානයෙන් ලබා ගන්නා අතර සම්මත ප්‍රතිදානය මත ප්‍රතිදානය ලියයි. දෝෂ පණිවිඩ සාමාන්‍යයෙන් සම්මත දෝෂ මත ලියා ඇත. යළි-යොමුකිරීමේ ක්‍රියාකරුවන්ට ගොනු විස්තර අංකය නියම කිරීම සඳහා ඉලක්කම් එකක් හෝ වැඩි ගණනක් (මැදිහත් අක්ෂර නොමැතිව) කළ හැකිය.


19

2 යනු කොන්සෝලයේ සම්මත දෝෂයකි.

1 යනු කොන්සෝලයේ සම්මත ප්‍රතිදානයයි.

මෙය සම්මත යුනික්ස් වන අතර වින්ඩෝස් ද පොසික්ස් අනුගමනය කරයි.

උදා: ඔබ දුවන විට

perl test.pl 2>&1

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

perl test.pl > debug.log 2>&1

ක්‍රියාත්මක කිරීමෙන් පසු, දෝෂ ඇතුළු සියලු ප්‍රතිදානයන් debug.log හි දැකිය හැකිය.

perl test.pl 1>out.log 2>err.log

එවිට සම්මත ප්‍රතිදානය out.log වෙතද සම්මත දෝෂය err.log වෙතද යයි.

මේවා තේරුම් ගැනීමට උත්සාහ කරන ලෙස මම ඔබට යෝජනා කරමි.


දෙවන ආදර්ශ වැරදි: සඳහා මුල් තැන ලෙස STDERR යළියොමුවක් වෙත STDOUT , පෙරනිමියෙන් STDOUT ලියා ඇත debug.log (නෑ STDERR ) බලන්න මගේ පිළිතුර (ඡේදය # 2)! දෙකම එකම ගොනුවකට හරවා යැවීම සහතික කිරීම සඳහා, ඔබ යළි-යොමුවීම් විධානයන් හරවා perl test.pl > debug.log 2>&1
යැවිය යුතුය

16

ඔබේ ප්‍රශ්නයට පිළිතුරු සැපයීම සඳහා: එය ඕනෑම දෝෂ ප්‍රතිදානයක් (සාමාන්‍යයෙන් stderr වෙත යවනු ලැබේ) ගෙන එය සම්මත ප්‍රතිදානය (stdout) වෙත ලියයි.

මෙය සියලු නිමැවුම් සඳහා පේජිං අවශ්‍ය වූ විට 'තවත්' සමඟ උපකාරී වේ. භාවිත වැඩසටහන් stderr වෙත මුද්‍රණය කිරීම වැනි සමහර වැඩසටහන්.

ඔබට මතක තබා ගැනීමට උදව් කිරීමට

  • 1 = සම්මත ප්‍රතිදානය (වැඩසටහන් සාමාන්‍ය ප්‍රතිදානය මුද්‍රණය කරන තැන)
  • 2 = සම්මත දෝෂය (වැඩසටහන් දෝෂ මුද්‍රණය කරන තැන)

"2> & 1" සරලවම stderr වෙත යවන සෑම දෙයක්ම stdout වෙත යොමු කරයි.

මෙම විෂය සම්පූර්ණයෙන් විස්තර කර ඇති තැන නැවත හරවා යැවීමේදී මෙම ලිපිය කියවීමට මම නිර්දේශ කරමි .


11

ක්‍රමලේඛකයෙකුගේ දෘෂ්ටි කෝණයෙන්, එයින් අදහස් වන්නේ හරියටම මෙයයි:

dup2(1, 2);

බලන්න man පිටුව .

2>&1එය පිටපතක් බව වටහා ගැනීම ඊට හේතුව ද පැහැදිලි කරයි ...

command >file 2>&1

... සමාන නොවේ ...

command 2>&1 >file

පළමුවැන්න ධාරාවන් දෙකම වෙත යවන fileඅතර දෙවැන්න දෝෂ stdoutසහ සාමාන්‍ය ප්‍රතිදානය වෙත යවනු ඇත file.


11

ඔබ ආධුනිකයෙක් කියවීමට නම් මම මේ ඉතා ප්රයෝජනවත් සොයා මේ

යාවත්කාලීන කිරීම:
ලිනක්ස් හෝ යුනික්ස් පද්ධතියේ වැඩසටහන් දෙකක් ප්‍රතිදානය වෙත යවනු ලැබේ: සම්මත ප්‍රතිදානය (stdout) සහ සම්මත දෝෂය (stderr) .ඔබට මෙම ප්‍රතිදානය ඕනෑම ගොනුවකට හරවා යැවිය හැකිය.

ඔබ මෙය කරන්නේ නම්

ls -a > output.txt

කිසිවක් කොන්සෝලය තුළ මුද්‍රණය නොකෙරේ. සියලු ප්‍රතිදානය (stdout) ප්‍රතිදාන ගොනුවට හරවා යවනු ලැබේ.

ඔබ පිටවන්නේ නැති ඕනෑම ගොනුවක අන්තර්ගතය මුද්‍රණය කිරීමට උත්සාහ කළහොත් එයින් අදහස් වන්නේ ඔබ වත්මන් නාමාවලියෙහි නොමැති test.txt මුද්‍රණය කළහොත් ප්‍රතිදානය දෝෂයක්

cat test.txt > error.txt

වනු ඇති බවයි.

cat: test.txt :No such file or directory

නමුත් erdr.txt ගොනුව හිස් වනු ඇත, මන්ද අපි stdout stderr නොවන ගොනුවකට හරවා යවමු.

එබැවින් අපට ගොනු විස්තර කිරීම අවශ්‍ය වේ (ගොනු විස්තරයක් යනු විවෘත ගොනුවක් නිරූපණය කරන ධනාත්මක පූර්ණ සංඛ්‍යාවක් නොවේ. ඔබට විස්තර කළ හැක්කේ ගොනුවේ අද්විතීය හැඳුනුම්පතක් යැයි ඔබට පැවසිය හැකිය) අපි කුමන ආකාරයේ ප්‍රතිදානයක් ගොනුව වෙත යවනවාදැයි ෂෙල්ට පැවසීමට. යුනික්ස් / ලිනක්ස් පද්ධතියේ 1 යනු stdout සඳහා වන අතර 2 stderr සඳහා වේ.

දැන් ඔබ මෙය

ls -a 1> output.txtකරන්නේ නම් ඔබ output.txt වෙත සම්මත ප්‍රතිදානය (stdout) යවන බව අදහස් වේ.

ඔබ මෙය

cat test.txt 2> error.txtකරන්නේ නම් ඔබ සම්මත දෝෂය (stderr) error.txt වෙත යවන බව අදහස් වේ.

&1ගොනු විස්තර 1 (stdout) හි අගය සඳහන් කිරීමට භාවිතා කරයි.

දැන් කාරණය 2>&1යන්නෙහි තේරුම “අපි stdout නැවත හරවා යවන ස්ථානයට stderr යොමු කරන්න”

දැන් ඔබට මෙය කළ හැකිය

cat maybefile.txt > output.txt 2>&1

සම්මත ප්‍රතිදානය (stdout) සහ සම්මත දෝෂය (stderr) යන දෙකම output.txt වෙත හරවා යවනු ලැබේ.

ස්තුති Ondrej කේ පෙන්වා දෙමින් සඳහා


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

7

ජනතාව, සෑම විටම මතක තබා paxdiablo ගැන ගේ ඉඟියක් වත්මන් වන හරවා යැවීමේ ඉලක්කය ස්ථානය ... ඒක ඇත වැදගත්.

2>&1ක්රියාකරු සඳහා මගේ පුද්ගලික මතකය මෙයයි:

  • &අර්ථයක් ලෙස සිතන්න 'and'හෝ 'add'(චරිතය ඇම්පියර්ස් - සහ , එසේ නොවේ ද?)
  • එබැවින් එය බවට පත්වේ: ' (stderr) දැනටමත් / දැනට පවතින 2ස්ථානයට 1(stdout) හරවා යවා ධාරාවන් දෙකම එක් කරන්න ' .

නිතර භාවිතා වන නැවත හරවා යැවීම සඳහා එකම සිහිවටන ක්‍රියා කරයි 1>&2:

  • &අර්ථය ගැන සිතන්න andහෝ add... (ඔබට ඇම්පියර්සෑන්ඩ් ගැන අදහස ලැබෙනවා, ඔව්?)
  • එබැවින් එය බවට පත්වන්නේ: ' (stdout) දැනටමත් / දැනට පවතින 1ස්ථානයට 2(stderr) හරවා යවා ධාරාවන් දෙකම එක් කරන්න ' .

හා සෑම විටම මතක තබා ගන්න: ඔබ 'අවසානයේ සිට' පස සිට වම් (කිරීමට redirections මාල කියවීමට ඇති, නැති වමේ සිට දකුණට).


7

ආදානය හරවා යැවීම

ආදානය නැවත හරවා යැවීම නිසා වචනයේ ප්‍රසාරණය හේතුවෙන් ඇති වන ගොනුව ලිපිගොනු n හි කියවීම සඳහා විවෘත වේ, හෝ n නිශ්චිතව දක්වා නොමැති නම් සම්මත ආදානය (ගොනු විස්තර 0).

ආදානය හරවා යැවීමේ පොදු ආකෘතිය:

[n]<word

ප්‍රතිදානය හරවා යැවීම

ප්‍රතිදානය නැවත හරවා යැවීම නිසා වචනයේ ප්‍රසාරණය හේතුවෙන් ඇති වන ගොනුව ලිපිගොනු n හි ලිවීම සඳහා විවෘත වේ, හෝ n නිශ්චිතව දක්වා නොමැති නම් සම්මත ප්‍රතිදානය (ගොනු විස්තර 1). ගොනුව නොපවතී නම් එය නිර්මාණය වේ; එය පවතින්නේ නම් එය ශුන්‍ය ප්‍රමාණයට කපා ඇත.

ප්‍රතිදානය හරවා යැවීමේ පොදු ආකෘතිය:

[n]>word

ගොනු විස්තර කිරීම

යළි-යොමුවීමේ ක්‍රියාකරු,

[n]<&digit-

n විස්තර කර නොමැති නම් ගොනු විස්තර සංඛ්‍යාංක ගොනු විස්තර විස්තර n වෙත හෝ සම්මත ආදානය (ගොනු විස්තර 0) වෙත ගෙන යයි. n වෙත අනුපිටපත් කිරීමෙන් පසුව ඉලක්කම් වසා ඇත.

ඒ හා සමානව, යළි-යොමුවීමේ ක්රියාකරු

[n]>&digit-

n විස්තර කර නොමැති නම් ගොනු විස්තර සංඛ්‍යාංක ගොනු විස්තර විස්තර n වෙත හෝ සම්මත ප්‍රතිදානය (ගොනු විස්තර 1) වෙත ගෙන යයි.

Ref:

man bash

කොටස /^REDIRECTසොයා ගැනීමට ටයිප් කරන්න redirection, සහ වැඩිදුර ඉගෙන ගන්න ...

සබැඳි අනුවාදයක් මෙහි ඇත: 3.6 යළි-යොමුවීම්

PS:

manලිනක්ස් ඉගෙන ගැනීමට ඇති ප්‍රබලම මෙවලම වූයේ බොහෝ කාලයකි .


6

බව ලබා /fooඔබේ පද්ධතිය මත නොපවතියි සහ /tmpකරන්නේ ...

$ ls -l /tmp /foo

සඳහා අන්තර්ගතය /tmpමුද්‍රණය කර දෝෂ පණිවිඩයක් මුද්‍රණය කරනු ඇත/foo

$ ls -l /tmp /foo > /dev/null

අන්තර්ගතය එවයි /tmpකිරීමට /dev/nullහා සඳහා දෝෂ මුද්රණය/foo

$ ls -l /tmp /foo 1> /dev/null

හරියටම එයම කරයි ( 1 සටහන සටහන් කරන්න )

$ ls -l /tmp /foo 2> /dev/null

හි අන්තර්ගතය මුද්‍රණය කර /tmpදෝෂ පණිවිඩය යවනු ඇත/dev/null

$ ls -l /tmp /foo 1> /dev/null 2> /dev/null

ලැයිස්තුගත කිරීම මෙන්ම දෝෂ පණිවිඩය යවනු ඇත /dev/null

$ ls -l /tmp /foo > /dev/null 2> &1

කෙටිමං වේ


5

මෙය හරියට දෝෂය stdout හෝ පර්යන්තය වෙත යැවීම හා සමානයි.

එනම්, cmdවිධානයක් නොවේ:

$cmd 2>filename
cat filename

command not found

දෝෂය ගොනුවට යවනු ලබන්නේ:

2>&1

සම්මත දෝෂය පර්යන්තයට යවනු ලැබේ.


1

ආදානය සඳහා 0, stdout සඳහා 1 සහ stderr සඳහා 2.

එක් ඉඟියක් : somecmd >1.txt 2>&1නිවැරදි ය, කිසිදු බලපෑමකින් තොරව somecmd 2>&1 >1.txtසම්පූර්ණයෙන්ම වැරදියි !


1

unix_commands 2>&1

ටර්මිනලයට දෝෂ මුද්‍රණය කිරීමට මෙය භාවිතා කරයි.

පහත දැක්වෙන්නේ ක්‍රියාවලියයි

  • දෝෂ ඇති වූ විට, ඒවා සම්මත දෝෂ මතක ලිපිනය &2"බෆරය" වෙත ලියා ඇති අතර , එයින් සම්මත දෝෂ ප්‍රවාහ 2යොමු වේ.
  • ප්‍රතිදානය නිපදවන විට, එය සම්මත ප්‍රතිදාන මතක ලිපිනය &1"බෆරය" වෙත ලියා ඇති අතර , එයින් සම්මත ප්‍රතිදාන ප්‍රවාහ 1යොමු වේ.

එබැවින් unix_commandsසම්මත දෝෂ ප්‍රවාහය ගෙන 2, >ධාරාව (දෝෂ) සම්මත ප්‍රතිදාන මතක ලිපිනය &1වෙත හරවා යවන්න, එවිට ඒවා පර්යන්තයට ප්‍රවාහනය කර මුද්‍රණය කෙරේ.

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.