/ dev / null වෙත හරවා යැවීම


185

මම උදාහරණයක් ලෙස බාෂ් ෂෙල් පිටපතක් කියවමි:

#!/bin/bash

# This script makes a backup of my home directory.

cd /home

# This creates the archive
tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1

# First remove the old bzip2 file.  Redirect errors because this generates some if the archive
# does not exist.  Then create a new compressed file.
rm /var/tmp/home_franky.tar.bz2 2> /dev/null
bzip2 /var/tmp/home_franky.tar

# Copy the file to another host - we have ssh keys for making this work without intervention.
scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1

# Create a timestamp in a logfile.
date >> /home/franky/log/home_backup.log
echo backup succeeded >> /home/franky/log/home_backup.log

මම මෙහි "/ dev / null 2> & 1" භාවිතය තේරුම් ගැනීමට උත්සාහ කරමි. මුලදී, මම සිතුවේ මෙම ස්ක්‍රිප්ට් එක වැරදි ලෙස නොසලකා හැරීම සඳහා / dev / null භාවිතා කරයි, ස්ක්‍රිප්ට් බිඳ වැටීමට ඉඩ නොදී (ක්‍රමලේඛන භාෂාවලින් ව්‍යතිරේකය හැසිරවීමට උත්සාහ කිරීම වැනි). නාමාවලිය තාර ගොනුවකට සම්පීඩනය කිරීම සඳහා තාර භාවිතා කිරීම ඕනෑම ආකාරයක දෝෂයක් ඇති කරන්නේ කෙසේදැයි මා නොදකින බැවිනි.


4
වෙත හරවා යැවීම /dev/nullබිඳ වැටීම වලක්වනු නොලැබේ, නමුත් stdout සහ stderr ප්‍රතිදාන ධාරාවන් පිරිසිදු කරයි. tarවිවිධ ආකාරවලින් දෝෂ ඇති කළ හැකිය. ඔබට ලිවීමේ ප්‍රවේශය නොතිබිය හැකිය, ගොනුව දැනටමත් පැවතිය හැකිය.
ස්පාර්හෝක්

4
අනවශ්‍ය ප්‍රතිදානය වළක්වා ගැනීමට උපක්‍රමයක් පමණි. තාර දෝෂ ඇතිවීමට හේතුව: ඉලක්ක නාමාවලිය නොපවතින හෙයින්, ප්‍රභවය නොමැති නිසා, ඔබට ඉලක්කයට ලිඛිත ප්‍රවේශයක් නොමැති නිසා හෝ ප්‍රභවයට කියවීම නිසා tarඔබේ $ PATH හි නොමැති නිසා tarබිඳ වැටී ඇත (ඔබ කිසි විටෙකත් නොදනී), උපාංගයේ ඉඩක් ඉතිරිව නැති නිසා, tarඅනුවාදය වෙනස් වී ඇති අතර දැන් වෙනස් සින්ටැක්ස් අවශ්‍ය වන නිසා තැටිය I / O දෝෂයක් ඇති විය. මට විශ්වාසයි ඔබට තවත් සොයා ගත හැකි බව.
ටර්ඩන්

Answers:


275

නැත, මෙය ස්ක්‍රිප්ට් එක බිඳ වැටීම වලක්වනු නොලැබේ. tarක්‍රියාවලියේ කිසියම් දෝෂයක් සිදුවුවහොත් (උදා: අවසරය ප්‍රතික්ෂේප කරන ලදි, එවැනි ගොනුවක් හෝ නාමාවලියක් නොමැත, ...) ස්ක්‍රිප්ට් තවමත් බිඳ වැටෙනු ඇත.

මෙයට හේතුව > /dev/null 2>&1ඔබේ සියලු විධාන ප්‍රතිදානය (දෙකම stdoutසහ stderr) වෙත හරවා /dev/nullයැවීමයි, එනම් පර්යන්තයට ප්‍රතිදානයන් මුද්‍රණය නොකෙරේ.

පෙරනිමියෙන්:

stdin  ==> fd 0
stdout ==> fd 1
stderr ==> fd 2

ස්ක්‍රිප්ටයේ, ඔබ > /dev/nullහේතු භාවිතා කරයි :

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> fd 2

ඉන්පසු 2>&1හේතු:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> stdout

3
අවබෝධය අනුව > /dev/null 2>&1, මෙම විධානය stderr ==> stdoutප්‍රති result ලයකි, එබැවින් stderr තවමත් stdout වෙත මුද්‍රණය වේ ??
වයිෂි සෙන්ග්

14
බොහෝ විට එතරම් වැදගත් නැත, නමුත් කුමක්ද fd?
kev


10
ඇයි: CMD > /dev/null 2>&1වැඩ කරන්නේ නමුත් CMD 2>&1 > /dev/nullතවමත් මට STDERR ලබා දෙන්නේ?
dbmikus

4
නිර්දේශිත: 2>& 1අංකය සහ ඇම්පියර්සෑන්ඩ් යළි-යොමුකිරීමේ ක්‍රියාකරුගේ කොටසක් ලෙස සලකන බව අවධාරණය කිරීමට කේත උදාහරණ භාවිතා කරන්න . එය පොදු හරවා යැවීමේ සඳහා ගොනුවට අතර අවකාශය ලබා ගැනීමට ය >සහ /path/to/file, ගොනු descriptor කිරීමට හරවා යැවීමේ අත්යවශ්යයෙන්ම එකම දෙයක්.
හෙන්ක් ලැන්ග්වෙල්ඩ්

23

මම මෙහි "> / dev / null 2> & 1" භාවිතය තේරුම් ගැනීමට උත්සාහ කරමි.

( /dev/nullඔබගේ ප්‍රශ්නයට පෙර මම යළි-යොමුවීමක් එක් කළ බව සලකන්න .)

ඉහත දැක්වෙන්නේ STDOUTසහ STDERRවෙත හරවා යැවීමයි /dev/null. එය ක්‍රියාත්මක STDERRවන්නේ STDOUT. (අත්‍යවශ්‍යයෙන්ම විධානයෙන් ලැබෙන සියලුම ප්‍රතිදානයන් ශුන්‍ය උපාංගයට හරවා යවනු ලැබේ .)

... ස්ක්‍රිප්ට් බිඳ වැටීමට ඉඩ නොදී (ක්‍රමලේඛන භාෂාවලින් ව්‍යතිරේකය හැසිරවීමට උත්සාහ කිරීම වැනි).

එය කිසිසේත්ම try/catchහෝ කිසිවක් මෙන් නොවේ . එය විධානයෙන් ඕනෑම ආකාරයක ප්‍රතිදානයක් (දෝෂයක් ඇතුළුව) නිහ ces කරයි.

නාමාවලිය තාර ගොනුවකට සම්පීඩනය කිරීම සඳහා තාර භාවිතා කිරීම ඕනෑම ආකාරයක දෝෂයක් ඇති කරන්නේ කෙසේදැයි මා නොදකින බැවිනි.

එයට හේතු ගණනාවක් නිසා දෝෂ ඇති විය හැකිය,

  • ඔබ සංරක්ෂණය කිරීමට උත්සාහ කරන ගොනුවේ (ය) හෝ ඔබ ලිවීමට උත්සාහ කරන ගොනුවේ ප්‍රමාණවත් අවසරයන් නොමැත
  • සංරක්ෂිතය නිර්මාණය කිරීම සඳහා තැටියේ ඉඩක් නොමැතිකම

15

ඔබ CMD> / dev / null 2> & 1 ධාවනය කරන විට

STDOUT / dev / null වෙත හරවා යවනු ලැබේ, පසුව STDERR STDOUT හි ADDRESS වෙත හරවා යවනු ලැබේ, එය / dev / null ලෙස සකසා ඇත, එහි ප්‍රති ST ලයක් ලෙස STDOUT සහ STDERR යන දෙකම / dev / null වෙත යොමු වේ.

අනෙක් අතට, ඔබ CMD 2> & 1> / dev / null ධාවනය කරන විට

STDERR STDOUT හි ADDRESS වෙත හරවා යවයි (ඒ මොහොතේ ගොනු විස්තර 1, හෝ / proc / self / fd / 1), පසුව STDOUT / dev / null වෙත හරවා යවයි, නමුත් STDERR fd1 වෙත හරවා යවයි !! එහි ප්‍රති As ලයක් ලෙස STDOUT වෙතින් සාමාන්‍ය ප්‍රතිදානය ඉවතලනු ලැබේ, නමුත් STDERR වෙතින් එන දෝෂ තවමත් කොන්සෝලය මත ලියා ඇත.


දෙකම හරවා යැවීමට stdoutසහ stderrකිරීමට වඩාත් කෙටි ක්‍රමයක් /dev/nullනම් : command &> /dev/null.
ටීඑන්ටී

1
&> /dev/nullස්ක්‍රිප්ට් ගොනුවක මා වෙනුවෙන් වැඩ නොකළ අතර, ස්ක්‍රිප්ට් එක සම්පුර්ණ වූ පසු මුළු ස්ටීඩරයම ප්‍රතිදානය කරයි, නමුත් > /dev/null 2>&1හොඳින් ක්‍රියා කළේය.
vstepaniuk

3

පහසුවෙන් තේරුම් ගැනීමට, එය පැහැදිලිව ලියන්න. පහත දැක්වෙන්නේ නොපවතින ගොනුවක් ඉවත් කිරීමට උත්සාහ කරන උදාහරණ විධානයකි (දෝෂයක් විසි කරන විධානයක් අනුකරණය කිරීමට)

rm nonexisting.txt 1>/dev/null 2>/dev/null
  • 1 යනු stdout ය. තොරතුරු ල logs ු-සටහන් / dev / null වෙත යවන්න
  • 2 stderr වේ. දෝෂ ල logs ු-සටහන් / dev / null වෙත යවන්න

පහත දැක්වෙන්නේ වැඩි දියුණු කිරීම් කිහිපයක්. සෑම කෙනෙකුම ව්‍යාකූල කිරීම සඳහා ඔවුන් පෙරනිමි සහ දර්ශක භාවිතා කරයි (මන්ද එහි ඇති සියලුම "සී" ... ඔබ දන්නා නිසා)

වැඩි දියුණු කිරීම 1: ඔබට "1>" වෙනුවට ">" ආදේශ කළ හැකිය. මෙයට හේතුව "1" යනු පෙරනිමි stdout වන අතර ඔබට පෙරනිමි සඳහන් කිරීම නොසලකා හැරිය හැකිය.

 rm nonexisting.txt >/dev/null 2>/dev/null

වැඩි දියුණු කිරීම 2: ඔබට 2 වන "/ dev / null" වෙනුවට & 1 ආදේශ කළ හැකිය. 2 වන / dev / null & 1 ලෙස හැඳින්වෙන්නේ / dev / null "දැනටමත් stdout 1 මගින් පෙන්වා ඇති නිසාය" (එහි කියමන "/ dev / null හි ලිපිනය & 1")

rm nonexisting.txt 1> /dev/null 2> &1

මගේ යෝජනාව: පළමු විකල්පයට ඇලී සිටින්න. විධාන පැහැදිලිව ලියන්න, එවිට ඔබේ සෙසු ඉංජිනේරුවන්ට අනාගතයේදී මෙම ස්ටක් ඕවර් ප්‍රවාහ පිටුව බැලීම වළක්වා ගත හැකිය.


-2

Bash I / O යළි හරවා යැවීම

යළි-යොමුවීමේ අර්ථ දැක්වීම


මෙම කේතය:

command > filename 2>&1
  • > filenameයළි-යොමුවීම් stdoutකිරීමටfilename
  • ( 2>&1) (දැන් ) stderrවෙත හරවා යවයිstdoutfilename

(ගොනු විස්තර 1 පෙරනිමිය වේ, එබැවින් >කෙටි වේ 1>)

මෙන්න ABSG පැහැදිලි කිරීම (පරි. 20) .

තවත් පොදු උදාහරණයක්:

command >>/dev/null 2>&1

යළි-යොමුවීම් stderrසහ stdoutවෙත /dev/null... එයින් අදහස් වන්නේ කොතැනකවත් නැති බවයි. යවන ලද දේවල් /dev/nullකිසිදු ආකාරයකින් සුරැකීම, හැඹිලි කිරීම හෝ මතක තබා නොගනී.

ඒවා ' කොතැනකටවත් ' යවා අමතක කර දමනු ලැබේ. මෙය වැඩසටහන් ක්‍රියාත්මක කිරීමේ ක්‍රමයක් වන අතර ඒවා කිසිදු ප්‍රතිදානයක් නිපදවන්නේ නැති බවට සහතික වන අතර එය කිසි විටෙකත් විධාන රේඛාවේ හෝ ලොග් ගොනුවක නොපෙනේ.


මම මේ ආකාරයේ ප්‍රශ්නයක් මඳක් දකිමි ... ප්‍රධාන වශයෙන් මා වසර ගණනාවක් තිස්සේ කේතීකරණය කර නොමැති බැවින් එය මා විසින්ම සොයා බැලිය යුතු බැවිනි. ABSG වෙතින් ලබා ගත හැකි ප්‍රයෝජනවත් තොරතුරු කිහිපයක් මෙන්න:

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

2>&1 
# Redirects stderr to stdout.

command >>filename 2>&1
# Appends both stdout and stderr
#+  to the file "filename" ...

ABSG: උසස් අත්ගුණය මාර්ගෝපදේශය:20 වන පරිච්ඡේදය ලින්ක් ඉහත විවෘත මූලාශ්ර පිළිබඳ I / O හරවා යැවීමේ පිටුව වන සම්බන්ධයක් tldp.org හඳුන්වන ලියවිල්ල උසස් අත්ගුණය මාර්ගෝපදේශය Mendel කූපර් විසින්. එය "ෂෙල් ස්ක්‍රිප්ටින් කලාව පිළිබඳ ගැඹුරු ගවේෂණයක්" ලෙස ලැයිස්තුගත කර ඇති අතර මම සම්පූර්ණයෙන්ම එකඟ වෙමි. එය භයානක සම්පතක් වන අතර සියලු ආකාරයේ පිස්සු තත්වයන්ට පිළිතුරු ටොන් ගණනක් ඇත.

වෙනත් වටිනා සම්පත්: වත්මන් / නඩත්තු අංශයේ බොහෝ වටිනා සම්පත් ඇත (html, PDF, පෙළ, ආදිය වැනි ඉතා ප්රයෝජනවත් ආකෘති කිහිපයක් තුළ) මත ලිනක්ස් ප්රලේඛන ව්යාපෘතිය මාර්ගෝපදේශ පිටුව. මෙන්න මට ප්‍රයෝජනවත් වූ කරුණු කිහිපයක්:


2
නැත, යළි-යොමුවීම් වමේ සිට දකුණට හසුරුවනු ලැබේ. ඔබේ උදාහරණයේ දී, සම්මත ප්‍රතිදානය වෙත හරවා යවනු ලැබේ filename, පසුව සම්මත දෝෂය සම්මත ප්‍රතිදානය දැනට යන ඕනෑම තැනකට හරවා යවනු ලැබේ (වෙත filename). එය ප්‍රතිවිරුද්ධ දිශාව නම්, සම්මත දෝෂය පර්යන්තය මත අවසන් වන අතර සම්මත ප්‍රතිදානය පමණක් හරවා යවනු filenameලැබේ. ද මීට command >file1 2>file2, file2නම් නිර්මාණය කළ නොහැකි බව file1(යන්න උනත් නිර්මාණය කළ නොහැකි විය file1හා file2ඇත්තටම සම්පූර්ණයෙන්ම වෙනස් මංපෙත් නම් විය).
කුසලනන්ද
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.