லினக்ஸில் stdin, stdout மற்றும் stderr என்றால் என்ன?
stdin
, stdout
, மற்றும் stderr
நீங்கள் லினக்ஸ் கட்டளையைத் தொடங்கும்போது உருவாக்கப்பட்ட மூன்று தரவு நீரோடைகள். உங்கள் ஸ்கிரிப்ட்கள் குழாய் பதிக்கப்படுகிறதா அல்லது திருப்பி விடப்படுகிறதா என்பதைக் கூற அவற்றைப் பயன்படுத்தலாம். எப்படி என்பதை நாங்கள் உங்களுக்குக் காட்டுகிறோம்.
ஸ்ட்ரீம்கள் இரண்டு புள்ளிகளில் சேரவும்
நீங்கள் லினக்ஸ் மற்றும் யூனிக்ஸ் போன்ற இயக்க முறைமைகளைப் பற்றி அறியத் தொடங்கியவுடன், நீங்கள் விதிமுறைகளைக் காண்பீர்கள் stdin
, stdout
, மற்றும் stederr
. இவை மூன்று நிலையான நீரோடைகள், அவை லினக்ஸ் கட்டளை செயல்படுத்தப்படும் போது நிறுவப்படும். கம்ப்யூட்டிங்கில், ஸ்ட்ரீம் என்பது தரவை மாற்றக்கூடிய ஒன்று. இந்த நீரோடைகளின் விஷயத்தில், அந்த தரவு உரை.
தரவு நீரோடைகள், நீர் நீரோடைகள் போன்றவை, இரண்டு முனைகளைக் கொண்டுள்ளன. அவர்களுக்கு ஒரு மூலமும் வெளிச்செல்லும் உள்ளது. நீங்கள் பயன்படுத்தும் எந்த லினக்ஸ் கட்டளை ஒவ்வொரு ஸ்ட்ரீமின் ஒரு முனையையும் வழங்குகிறது. மற்ற முனை கட்டளையைத் தொடங்கிய ஷெல் மூலம் தீர்மானிக்கப்படுகிறது. அந்த முடிவு முனைய சாளரத்துடன் இணைக்கப்படும், ஒரு குழாயுடன் இணைக்கப்படும், அல்லது ஒரு கோப்பு அல்லது பிற கட்டளைக்கு திருப்பி விடப்படும், கட்டளையைத் தொடங்கிய கட்டளை வரியின் படி.
லினக்ஸ் ஸ்டாண்டர்ட் ஸ்ட்ரீம்கள்
லினக்ஸில்,stdin
நிலையான உள்ளீட்டு ஸ்ட்ரீம் ஆகும். இது உரையை அதன் உள்ளீடாக ஏற்றுக்கொள்கிறது. கட்டளையிலிருந்து ஷெல்லுக்கு உரை வெளியீடு stdout
(நிலையான அவுட்) ஸ்ட்ரீம். கட்டளையின் பிழை செய்திகள் stderr
(நிலையான பிழை) ஸ்ட்ரீம்.
எனவே இரண்டு வெளியீட்டு நீரோடைகள் இருப்பதை நீங்கள் காணலாம், stdout
மற்றும் stderr
, மற்றும் ஒரு உள்ளீட்டு ஸ்ட்ரீம், stdin
. பிழை செய்திகள் மற்றும் சாதாரண வெளியீடு ஒவ்வொன்றும் முனைய சாளரத்திற்கு கொண்டு செல்ல அவற்றின் சொந்த வழியைக் கொண்டிருப்பதால், அவை ஒருவருக்கொருவர் சுயாதீனமாக கையாளப்படலாம்.
கோப்புகள் போல நீரோடைகள் கையாளப்படுகின்றன
லினக்ஸில் உள்ள ஸ்ட்ரீம்கள்-கிட்டத்தட்ட எல்லாவற்றையும் போலவே-அவை கோப்புகளாகவே கருதப்படுகின்றன. நீங்கள் ஒரு கோப்பிலிருந்து உரையைப் படிக்கலாம், மேலும் உரையை ஒரு கோப்பில் எழுதலாம். இந்த இரண்டு செயல்களும் தரவுகளின் நீரோட்டத்தை உள்ளடக்கியது. எனவே தரவின் ஸ்ட்ரீமை ஒரு கோப்பாகக் கையாளும் கருத்து அவ்வளவு நீட்டிக்கப்படவில்லை.
ஒரு செயல்முறையுடன் தொடர்புடைய ஒவ்வொரு கோப்பும் அதை அடையாளம் காண ஒரு தனிப்பட்ட எண்ணை ஒதுக்குகிறது. இது கோப்பு விவரிப்பான் என்று அழைக்கப்படுகிறது. ஒரு கோப்பில் ஒரு செயலைச் செய்ய வேண்டிய போதெல்லாம், கோப்பை அடையாளம் காண கோப்பு விவரிப்பான் பயன்படுத்தப்படுகிறது.
இந்த மதிப்புகள் எப்போதும் பயன்படுத்தப்படுகின்றன stdin
, stdout,
மற்றும் stderr
:
- 0: stdin
- 1: stdout
- 2: stderr
குழாய்கள் மற்றும் வழிமாற்றுகளுக்கு எதிர்வினை
ஒரு விஷயத்திற்கு ஒருவரின் அறிமுகத்தை எளிதாக்க, தலைப்பின் எளிமையான பதிப்பை கற்பிப்பதே பொதுவான நுட்பமாகும். எடுத்துக்காட்டாக, இலக்கணத்துடன், விதி “நான் E க்கு முன், C க்குப் பிறகு தவிர” என்று கூறப்படுகிறது. ஆனால் உண்மையில், இந்த விதிக்கு கீழ்ப்படிந்த வழக்குகள் இருப்பதை விட அதிகமான விதிவிலக்குகள் உள்ளன.
இதேபோன்ற ஒரு நரம்பில், பேசும்போது stdin
, stdout
, மற்றும் stderr
ஒரு செயல்முறை அதன் மூன்று நிலையான நீரோடைகள் எங்கு நிறுத்தப்படும் என்பது தெரியாது அல்லது அக்கறை கொள்ளவில்லை என்று ஏற்றுக்கொள்ளப்பட்ட கோட்பாட்டை வெளியேற்றுவது வசதியானது. ஒரு செயல்முறை அதன் வெளியீடு முனையத்திற்குச் செல்கிறதா அல்லது ஒரு கோப்பாக திருப்பி விடப்படுகிறதா என்பதைக் கவனிக்க வேண்டுமா? அதன் உள்ளீடு விசைப்பலகையிலிருந்து வருகிறதா அல்லது வேறொரு செயல்முறையிலிருந்து குழாய் பதிக்கப்படுகிறதா என்று கூட சொல்ல முடியுமா?
உண்மையில், ஒரு செயல்முறைக்குத் தெரியும் - அல்லது குறைந்தபட்சம் அதைக் கண்டுபிடிக்க முடியும், அது சரிபார்க்கத் தேர்வுசெய்தால் - மற்றும் மென்பொருள் ஆசிரியர் அந்தச் செயல்பாட்டைச் சேர்க்க முடிவு செய்தால் அதற்கேற்ப அதன் நடத்தையை மாற்றலாம்.
நடத்தையில் இந்த மாற்றத்தை நாம் மிக எளிதாகக் காணலாம். இந்த இரண்டு கட்டளைகளையும் முயற்சிக்கவும்:
ls
ls | பூனை
தி ls
கட்டளை அதன் வெளியீடு என்றால் வித்தியாசமாக செயல்படும் (stdout
) மற்றொரு கட்டளைக்கு அனுப்பப்படுகிறது. இதுls
இது ஒரு நெடுவரிசை வெளியீட்டிற்கு மாறுகிறது, இது நிகழ்த்திய மாற்றம் அல்ல பூனை
. மற்றும் ls
அதன் வெளியீடு திருப்பி விடப்பட்டால் அதையே செய்கிறது:
ls> capture.txt
பூனை பிடிப்பு. txt
Stdout மற்றும் stderr ஐ திருப்பி விடுகிறது
பிரத்யேக ஸ்ட்ரீம் மூலம் பிழை செய்திகளை வழங்குவதில் ஒரு நன்மை இருக்கிறது. இதன் பொருள் நாம் ஒரு கட்டளையின் வெளியீட்டை திருப்பி விடலாம் (stdout
) ஒரு கோப்பிற்கு மற்றும் இன்னும் பிழை செய்திகளைக் காணலாம் (stderr
) முனைய சாளரத்தில். பிழைகள் தேவைப்பட்டால், அவை தேவைப்பட்டால் நீங்கள் எதிர்வினையாற்றலாம். இது கோப்பு மாசுபடுவதிலிருந்து பிழை செய்திகளை நிறுத்துகிறது stdout
க்கு திருப்பி விடப்பட்டுள்ளது.
பின்வரும் உரையை ஒரு எடிட்டரில் தட்டச்சு செய்து பிழையான கோப்பில் சேமிக்கவும்.
#! / bin / bash echo "இல்லாத கோப்பை அணுக முயற்சிப்பது பற்றி" பூனை bad-filename.txt
இந்த கட்டளையுடன் ஸ்கிரிப்டை இயக்கக்கூடியதாக ஆக்குங்கள்:
chmod + x error.sh
ஸ்கிரிப்ட்டின் முதல் வரி முனைய சாளரத்தில் உரையை எதிரொலிக்கிறதுstdout
ஸ்ட்ரீம். இரண்டாவது வரி இல்லாத கோப்பை அணுக முயற்சிக்கிறது. இது வழியாக வழங்கப்படும் பிழை செய்தியை உருவாக்கும் stderr
.
இந்த கட்டளையுடன் ஸ்கிரிப்டை இயக்கவும்:
./error.sh
வெளியீட்டின் இரண்டு நீரோடைகளும், stdout
மற்றும் stderr
, முனைய சாளரங்களில் காட்டப்படும்.
வெளியீட்டை ஒரு கோப்பிற்கு திருப்பிவிட முயற்சிப்போம்:
./error.sh> capture.txt
வழியாக வழங்கப்படும் பிழை செய்தி stderr
இன்னும் முனைய சாளரத்திற்கு அனுப்பப்படுகிறது. என்பதை அறிய கோப்பின் உள்ளடக்கங்களை நாம் சரிபார்க்கலாம் stdout
வெளியீடு கோப்புக்குச் சென்றது.
பூனை பிடிப்பு. txt
வெளியீடு stdin
எதிர்பார்த்தபடி கோப்பிற்கு திருப்பி விடப்பட்டது.
தி >
திசைதிருப்பல் சின்னம் வேலை செய்கிறது stdout
இயல்பாக. எந்த வழிமுறை வெளியீட்டு ஸ்ட்ரீமை நீங்கள் திருப்பிவிட விரும்புகிறீர்கள் என்பதைக் குறிக்க எண் கோப்பு விளக்கிகளில் ஒன்றைப் பயன்படுத்தலாம்.
வெளிப்படையாக திருப்பிவிட stdout
, இந்த திசைதிருப்பல் வழிமுறையைப் பயன்படுத்தவும்:
1>
வெளிப்படையாக திருப்பிவிட stderr
, இந்த திசைதிருப்பல் வழிமுறையைப் பயன்படுத்தவும்:
2>
மீண்டும் எங்கள் சோதனைக்கு முயற்சிப்போம், இந்த நேரத்தில் பயன்படுத்துவோம் 2>
:
./error.sh 2> capture.txt
பிழை செய்தி திருப்பி விடப்படுகிறது மற்றும் stdout
எதிரொலி
செய்தி முனைய சாளரத்திற்கு அனுப்பப்படுகிறது:
Capture.txt கோப்பில் என்ன இருக்கிறது என்று பார்ப்போம்.
பூனை பிடிப்பு. txt
தி stderr
செய்தி எதிர்பார்த்தபடி capture.txt இல் உள்ளது.
Stdout மற்றும் stderr இரண்டையும் திருப்பி விடுகிறது
நிச்சயமாக, நாம் திருப்பிவிட முடிந்தால் stdout
அல்லது stderr
ஒருவருக்கொருவர் சுயாதீனமாக ஒரு கோப்பிற்கு, இரண்டையும் ஒரே நேரத்தில், இரண்டு வெவ்வேறு கோப்புகளுக்கு திருப்பிவிட முடியும்?
ஆம் நம்மால் முடியும். இந்த கட்டளை இயக்கும் stdout
capture.txt மற்றும் stderr
error.txt எனப்படும் கோப்புக்கு.
./error.sh 1> capture.txt 2> error.txt
வெளியீடு-நிலையான வெளியீடு மற்றும் நிலையான பிழை both ஆகிய இரு நீரோடைகளும் கோப்புகளுக்கு திருப்பி விடப்படுவதால், முனைய சாளரத்தில் புலப்படும் வெளியீடு எதுவும் இல்லை. எதுவும் நடக்கவில்லை என்பது போல கட்டளை வரி வரியில் திரும்புவோம்.
ஒவ்வொரு கோப்பின் உள்ளடக்கங்களையும் சரிபார்க்கலாம்:
பூனை பிடிப்பு. txt
பூனை பிழை. txt
ஒரே கோப்பிற்கு stdout மற்றும் stderr ஐ திருப்பி விடுகிறது
இது சுத்தமாக இருக்கிறது, ஒவ்வொரு நிலையான வெளியீட்டு நீரோடைகளும் அதன் சொந்த அர்ப்பணிப்பு கோப்புக்கு செல்கிறோம். இரண்டையும் அனுப்புவதே நாம் செய்யக்கூடிய மற்ற கலவையாகும் stdout
மற்றும் stderr
அதே கோப்பில்.
பின்வரும் கட்டளையால் இதை நாம் அடையலாம்:
./error.sh> capture.txt 2> & 1
அதை உடைப்போம்.
- ./error.sh: Error.sh ஸ்கிரிப்ட் கோப்பை அறிமுகப்படுத்துகிறது.
- > capture.txt: திருப்பி விடுகிறது
stdout
capture.txt கோப்புக்கு ஸ்ட்ரீம் செய்க.>
என்பது சுருக்கெழுத்து1>
. - 2>&1: இது &> வழிமாற்று வழிமுறைகளைப் பயன்படுத்துகிறது. ஒரு ஸ்ட்ரீம் மற்றொரு ஸ்ட்ரீமின் அதே இலக்கை அடைய ஷெல்லிடம் சொல்ல இந்த வழிமுறை உங்களை அனுமதிக்கிறது. இந்த வழக்கில், “ஸ்ட்ரீம் 2 ஐ திருப்பி விடுங்கள்,
stderr
, ஸ்ட்ரீம் 1,stdout
, திருப்பி விடப்படுகிறது. ”
புலப்படும் வெளியீடு எதுவும் இல்லை. அது ஊக்கமளிக்கிறது.
Capture.txt கோப்பை சரிபார்த்து அதில் என்ன இருக்கிறது என்று பார்ப்போம்.
பூனை பிடிப்பு. txt
இரண்டும் stdout
மற்றும் stderr
நீரோடைகள் ஒற்றை இலக்கு கோப்பிற்கு திருப்பி விடப்பட்டுள்ளன.
ஒரு ஸ்ட்ரீமின் வெளியீட்டை திருப்பி, அமைதியாக தூக்கி எறிய, வெளியீட்டை இயக்கவும் / dev / null
.
ஒரு ஸ்கிரிப்டுக்குள் திசைதிருப்பலைக் கண்டறிதல்
ஏதேனும் ஸ்ட்ரீம்கள் திருப்பி விடப்படுகிறதா என்பதை ஒரு கட்டளை எவ்வாறு கண்டறிய முடியும் என்பதை நாங்கள் விவாதித்தோம், அதற்கேற்ப அதன் நடத்தையை மாற்றவும் தேர்வு செய்யலாம். இதை நம் சொந்த ஸ்கிரிப்ட்களில் நிறைவேற்ற முடியுமா? ஆம் நம்மால் முடியும். புரிந்துகொள்வதற்கும் பயன்படுத்துவதற்கும் இது மிகவும் எளிதான நுட்பமாகும்.
பின்வரும் உரையை ஒரு எடிட்டரில் தட்டச்சு செய்து input.sh ஆக சேமிக்கவும்.
#! / பின் / பாஷ் என்றால் [-t 0]; விசைப்பலகையிலிருந்து வரும் எதிரொலி stdin வேறு ஒரு குழாய் அல்லது ஒரு கோப்பு fi இலிருந்து வரும் எதிரொலி stdin
அதை இயக்கக்கூடியதாக மாற்ற பின்வரும் கட்டளையைப் பயன்படுத்தவும்:
chmod + x input.sh
புத்திசாலித்தனமான பகுதி சதுர அடைப்புக்குறிக்குள் சோதனை. தி -t
(முனையம்) விருப்பம் உண்மை (0) கோப்பு விளக்கத்துடன் தொடர்புடைய கோப்பு முனைய சாளரத்தில் நிறுத்தப்பட்டால். சோதனைக்கான வாதமாக கோப்பு விவரிப்பான் 0 ஐப் பயன்படுத்தினோம், இது குறிக்கிறதுstdin
.
என்றால் stdin
ஒரு முனைய சாளரத்துடன் இணைக்கப்பட்டுள்ளது சோதனை உண்மை என்பதை நிரூபிக்கும். என்றால் stdin
ஒரு கோப்பு அல்லது குழாயுடன் இணைக்கப்பட்டுள்ளது, சோதனை தோல்வியடையும்.
ஸ்கிரிப்ட்டில் உள்ளீட்டை உருவாக்க எந்தவொரு வசதியான உரை கோப்பையும் பயன்படுத்தலாம். இங்கே நாம் dummy.txt எனப்படும் ஒன்றைப் பயன்படுத்துகிறோம்.
./input.sh <dummy.txt
உள்ளீடு விசைப்பலகையிலிருந்து வரவில்லை, அது ஒரு கோப்பிலிருந்து வருகிறது என்பதை ஸ்கிரிப்ட் அங்கீகரிக்கிறது என்பதை வெளியீடு காட்டுகிறது. நீங்கள் தேர்வுசெய்தால், அதற்கேற்ப உங்கள் ஸ்கிரிப்டின் நடத்தை மாறுபடலாம்.
இது கோப்பு திருப்பிவிடலுடன் இருந்தது, அதை ஒரு குழாய் மூலம் முயற்சிப்போம்.
பூனை dummy.txt | ./input.sh
ஸ்கிரிப்ட் அதன் உள்ளீடு அதில் குழாய் பதிக்கப்படுவதை அங்கீகரிக்கிறது. அல்லது இன்னும் துல்லியமாக, அது மீண்டும் ஒரு முறை அங்கீகரிக்கிறது stdin
ஸ்ட்ரீம் ஒரு முனைய சாளரத்துடன் இணைக்கப்படவில்லை.
ஸ்கிரிப்டை குழாய்கள் அல்லது வழிமாற்றுகள் இல்லாமல் இயக்குவோம்.
./input.sh
தி stdin
ஸ்ட்ரீம் முனைய சாளரத்துடன் இணைக்கப்பட்டுள்ளது, அதற்கேற்ப ஸ்கிரிப்ட் இதைப் புகாரளிக்கிறது.
வெளியீட்டு ஸ்ட்ரீமுடன் அதையே சரிபார்க்க, எங்களுக்கு புதிய ஸ்கிரிப்ட் தேவை. பின்வருவனவற்றை ஒரு எடிட்டரில் தட்டச்சு செய்து output.sh ஆக சேமிக்கவும்.
#! / பின் / பாஷ் என்றால் [-t 1]; பின்னர் எதிரொலி stdout முனைய சாளரத்திற்குச் செல்கிறது, எதிரொலி stdout திருப்பி விடப்படுகிறது அல்லது fi செய்யப்படுகிறது
அதை இயக்கக்கூடியதாக மாற்ற பின்வரும் கட்டளையைப் பயன்படுத்தவும்:
chmod + x input.sh
இந்த ஸ்கிரிப்ட்டின் குறிப்பிடத்தக்க மாற்றம் சதுர அடைப்புக்குறிக்குள் சோதனையில் உள்ளது. கோப்பு விவரிப்பாளரைக் குறிக்க இலக்க 1 ஐப் பயன்படுத்துகிறோம் stdout
.
இதை முயற்சிப்போம். வெளியீட்டை குழாய் பதிப்போம் பூனை
.
./ வெளியீடு | பூனை
ஸ்கிரிப்ட் அதன் வெளியீடு நேரடியாக ஒரு முனைய சாளரத்திற்கு செல்லவில்லை என்பதை அங்கீகரிக்கிறது.
வெளியீட்டை ஒரு கோப்பிற்கு திருப்பிவிடுவதன் மூலமும் ஸ்கிரிப்டை சோதிக்கலாம்.
./output.sh> capture.txt
முனைய சாளரத்திற்கு வெளியீடு எதுவும் இல்லை, நாங்கள் அமைதியாக கட்டளை வரியில் திரும்புவோம். நாங்கள் எதிர்பார்ப்பது போல.
கைப்பற்றப்பட்டதைக் காண நாம் capture.txt கோப்பின் உள்ளே பார்க்கலாம். அவ்வாறு செய்ய பின்வரும் கட்டளையைப் பயன்படுத்தவும்.
பூனை பிடிப்பு
மீண்டும், எங்கள் ஸ்கிரிப்டில் உள்ள எளிய சோதனை அதைக் கண்டறிகிறது stdout
ஸ்ட்ரீம் நேரடியாக ஒரு முனைய சாளரத்திற்கு அனுப்பப்படவில்லை.
எந்த குழாய்கள் அல்லது வழிமாற்றுகள் இல்லாமல் ஸ்கிரிப்டை இயக்கினால், அது அதைக் கண்டறிய வேண்டும் stdout
முனைய சாளரத்தில் நேரடியாக வழங்கப்படுகிறது.
./output.sh
அதுதான் நாம் பார்ப்பது.
நனவின் நீரோடைகள்
உங்கள் ஸ்கிரிப்ட்கள் முனைய சாளரத்திலோ அல்லது ஒரு குழாயிலோ இணைக்கப்பட்டுள்ளதா அல்லது திருப்பி விடப்படுகிறதா என்பதை எவ்வாறு சொல்வது என்று தெரிந்துகொள்வது, அவற்றின் நடத்தையை அதற்கேற்ப சரிசெய்ய உங்களை அனுமதிக்கிறது.
பதிவுசெய்தல் மற்றும் கண்டறியும் வெளியீடு திரைக்கு அல்லது கோப்பிற்குப் போகிறதா என்பதைப் பொறுத்து அதிகமாகவோ அல்லது குறைவாகவோ விரிவாக இருக்கும். பிழை செய்திகளை சாதாரண நிரல் வெளியீட்டை விட வேறு கோப்பில் உள்நுழைய முடியும்.
வழக்கம்போல, அதிக அறிவு அதிக விருப்பங்களைக் கொண்டுவருகிறது.