របៀបប្តូរទិសទិន្នផលកុងសូលទៅឯកសារ។ បញ្ជូនបន្តលទ្ធផលទៅឯកសារ។ ស្ទ្រីមលទ្ធផលស្តង់ដារលីនុច

  • ការបកប្រែ

ប្រសិនបើអ្នកបានស្ទាត់ជំនាញមូលដ្ឋាននៃស្ថានីយរួចហើយ អ្នកប្រហែលជាត្រៀមខ្លួនជាស្រេចដើម្បីបញ្ចូលគ្នានូវពាក្យបញ្ជាដែលអ្នកបានរៀន។ ពេលខ្លះការប្រតិបត្តិពាក្យបញ្ជាសែលម្តងមួយៗគឺគ្រប់គ្រាន់ដើម្បីដោះស្រាយបញ្ហាជាក់លាក់មួយ ប៉ុន្តែក្នុងករណីខ្លះការបញ្ចូលពាក្យបញ្ជាបន្ទាប់ពីពាក្យបញ្ជាគឺធុញទ្រាន់ពេកហើយមិនសមហេតុផល។ ក្នុងស្ថានភាពបែបនេះ និមិត្តសញ្ញាពិសេសមួយចំនួនដូចជា តង្កៀបមុំ អាចមានប្រយោជន៍។

សម្រាប់សែលអ្នកបកប្រែ ពាក្យបញ្ជាលីនុចតួអក្សរបន្ថែមទាំងនេះមិនខ្ជះខ្ជាយទំហំអេក្រង់ទេ។ ពួកគេគឺជាក្រុមដ៏មានឥទ្ធិពលដែលអាចភ្ជាប់ព័ត៌មានផ្សេងៗគ្នា បំបែកអ្វីដែលពីមុនទាំងស្រុង និងធ្វើអ្វីៗជាច្រើនទៀត។ លក្ខណៈពិសេសមួយក្នុងចំណោមលក្ខណៈពិសេសដ៏សាមញ្ញបំផុត ប៉ុន្តែមានថាមពល និងប្រើប្រាស់យ៉ាងទូលំទូលាយបំផុតរបស់សែលគឺការបញ្ជូនបន្តនៃស្ទ្រីមបញ្ចូល/ទិន្នផលស្តង់ដារ។

ស្ទ្រីម I/O ស្តង់ដារចំនួនបី

ដើម្បីយល់ពីអ្វីដែលយើងនឹងនិយាយអំពីនៅទីនេះ វាជាការសំខាន់ណាស់ដែលត្រូវដឹងថាតើទិន្នន័យដែលអាចប្តូរទិសបានមកពីណា និងកន្លែងដែលវាទៅ។ លីនុចមានស្ទ្រីម I/O ស្តង់ដារចំនួនបី។

ទីមួយគឺស្ទ្រីមបញ្ចូលស្តង់ដារ។ នៅក្នុងប្រព័ន្ធ នេះគឺជាលេខ 0 (ចាប់តាំងពីនៅក្នុងកុំព្យូទ័រ ការរាប់ជាធម្មតាចាប់ផ្តើមពីសូន្យ)។ លេខ​ខ្សែ​ត្រូវ​បាន​គេ​ហៅ​ផង​ដែរ​ថា​អ្នក​ពណ៌នា​។ ស្ទ្រីមនេះតំណាងឱ្យព័ត៌មានមួយចំនួនដែលបានបញ្ជូនទៅស្ថានីយ ជាពិសេសការណែនាំដែលបានបញ្ជូនទៅសែលសម្រាប់ការប្រតិបត្តិ។ ជាធម្មតា ទិន្នន័យចូលក្នុងស្ទ្រីមនេះ នៅពេលដែលអ្នកប្រើប្រាស់បញ្ចូលវាពីក្តារចុច។

ស្ទ្រីមទីពីរគឺជាស្ទ្រីមលទ្ធផលស្តង់ដារដែលមានលេខ 1 ។ នេះគឺជាស្ទ្រីមទិន្នន័យដែលសែលបញ្ចេញបន្ទាប់ពីអនុវត្តសកម្មភាពមួយចំនួន។ ជាធម្មតា ទិន្នន័យនេះបញ្ចប់នៅក្នុងបង្អួចស្ថានីយដូចគ្នា ដែលពាក្យបញ្ជាដែលបណ្តាលឱ្យវាលេចឡើងត្រូវបានបញ្ចូល។

ហើយចុងក្រោយ ស្ទ្រីមទីបីគឺជាស្ទ្រីមកំហុសស្តង់ដារ វាមានចំណុចទាញ 2. ស្ទ្រីមនេះគឺស្រដៀងទៅនឹងស្ទ្រីមលទ្ធផលស្តង់ដារ ព្រោះជាធម្មតាអ្វីដែលចូលទៅក្នុងវាបញ្ចប់នៅលើអេក្រង់ស្ថានីយ។ ទោះយ៉ាងណាក៏ដោយ វាខុសពីលទ្ធផលស្តង់ដារ ហើយជាលទ្ធផល ស្ទ្រីមទាំងនេះអាចត្រូវបានគ្រប់គ្រងដោយឡែកពីគ្នាប្រសិនបើចង់បាន។ វាមានប្រយោជន៍ឧទាហរណ៍ក្នុង ស្ថានភាពបន្ទាប់. មានក្រុមដែលដំណើរការ បរិមាណធំទិន្នន័យ អនុវត្តប្រតិបត្តិការស្មុគ្រស្មាញ និងមានកំហុស។ អ្នក​ចង់​ប្រាកដ​ថា payload ពាក្យ​បញ្ជា​នេះ​បង្កើត​មិន​ត្រូវ​បាន​លាយ​ឡំ​ជាមួយ​នឹង​សារ​កំហុស។ នេះត្រូវបានសម្រេចតាមរយៈការបញ្ជូនបន្តដាច់ដោយឡែកនៃលទ្ធផល និងស្ទ្រីមកំហុស។

ដូចដែលអ្នកប្រហែលជាបានទាយរួចហើយ ការបញ្ជូនបន្ត I/O មានន័យថាធ្វើការជាមួយស្ទ្រីមដែលបានពិពណ៌នាខាងលើ និងបញ្ជូនបន្តទិន្នន័យដែលអ្នកសរសេរកម្មវិធីត្រូវការវា។ នេះត្រូវបានធ្វើដោយប្រើនិមិត្តសញ្ញា > និង< в បន្សំផ្សេងៗការប្រើប្រាស់ដែលអាស្រ័យលើកន្លែងដែលទិន្នន័យដែលបានបញ្ជូនបន្តគួរទៅ។

បញ្ជូនបន្តទិន្នផលស្តង់ដារ

ចូរនិយាយថាអ្នកចង់បង្កើតឯកសារដែលនឹងត្រូវបានសរសេរទៅ កាលបរិច្ឆេទបច្ចុប្បន្ននិងពេលវេលា។ ដើម្បីធ្វើឱ្យបញ្ហាកាន់តែងាយស្រួល មានពាក្យបញ្ជា កាលបរិច្ឆេទដែលមានឈ្មោះត្រឹមត្រូវ ដែលត្រឡប់អ្វីដែលយើងត្រូវការ។ ជាធម្មតាបញ្ជាទិន្នន័យលទ្ធផលទៅជាលទ្ធផលស្តង់ដារ។ ដើម្បីឱ្យទិន្នន័យនេះបង្ហាញនៅក្នុងឯកសារ អ្នកត្រូវបន្ថែមនិមិត្តសញ្ញា > បន្ទាប់ពីពាក្យបញ្ជា មុននឹងឈ្មោះឯកសារគោលដៅ។ មុន និងក្រោយ > អ្នកត្រូវដាក់កន្លែងទំនេរ។

នៅពេលប្រើការបញ្ជូនបន្ត ឯកសារណាមួយដែលបានបញ្ជាក់បន្ទាប់ពី > នឹងត្រូវបានសរសេរជាន់ពីលើ។ ប្រសិនបើមិនមានអ្វីមានតម្លៃនៅក្នុងឯកសារ ហើយមាតិការបស់វាអាចបាត់បង់ នោះនៅក្នុងការរចនារបស់យើង វាត្រូវបានអនុញ្ញាតឱ្យប្រើរួចហើយ ឯកសារដែលមានស្រាប់. ជាធម្មតាវាជាការប្រសើរក្នុងការប្រើឈ្មោះឯកសារក្នុងករណីនេះដែលមិនទាន់មាន។ ឯកសារនេះនឹងត្រូវបានបង្កើតបន្ទាប់ពីពាក្យបញ្ជាត្រូវបានប្រតិបត្តិ។ តោះហៅវាថា date.txt។ ផ្នែកបន្ថែមឯកសារបន្ទាប់ពីចំនុចជាធម្មតាមិនមានបញ្ហាច្រើនទេ ប៉ុន្តែផ្នែកបន្ថែមជួយរក្សាអ្វីៗឱ្យមានរបៀបរៀបរយ។ ដូច្នេះនេះជាពាក្យបញ្ជារបស់យើង៖

$date>date.txt
នេះមិនមែនមានន័យថាពាក្យបញ្ជាខ្លួនវាមានប្រយោជន៍មិនគួរឱ្យជឿនោះទេ ទោះជាយ៉ាងណាក៏ដោយ ដោយផ្អែកលើវា យើងអាចធ្វើអ្វីមួយដែលគួរឱ្យចាប់អារម្មណ៍ជាងនេះ។ ចូរនិយាយថាអ្នកចង់ដឹងពីរបៀបដែលចរាចរអ៊ិនធឺណិតរបស់អ្នកកំពុងប្តូរទិសដៅទៅកាន់ចំណុចបញ្ចប់ជាក់លាក់មួយដោយកត់ត្រាទិន្នន័យប្រចាំថ្ងៃ។ ពាក្យបញ្ជា traceroute នឹងជួយក្នុងការដោះស្រាយបញ្ហានេះ ដែលរាយការណ៍ព័ត៌មានលម្អិតអំពីផ្លូវចរាចររវាងកុំព្យូទ័ររបស់យើង និងចំណុចបញ្ចប់ដែលបានបញ្ជាក់នៅពេលហៅពាក្យបញ្ជាក្នុងទម្រង់ជា URL ។ ទិន្នន័យរួមមានព័ត៌មានអំពីរ៉ោតទ័រទាំងអស់ដែលចរាចរណ៍ឆ្លងកាត់។

ដោយសារយើងមានឯកសារដែលមានកាលបរិច្ឆេទរួចហើយ វានឹងសមហេតុផលណាស់ក្នុងការគ្រាន់តែបន្ថែមទិន្នន័យដែលទទួលបានពី traceroute ទៅឯកសារនេះ។ ដើម្បី​ធ្វើ​ដូច្នេះ អ្នក​ត្រូវ​ប្រើ​សញ្ញា​ពីរ > ដាក់​មួយ​បន្ទាប់​ពី​មួយ​ទៅ​ទៀត។ ជាលទ្ធផល ក្រុមថ្មី។ដែលបញ្ជូនបន្តលទ្ធផលទៅឯកសារ ប៉ុន្តែមិនសរសេរជាន់លើវាទេ ប៉ុន្តែបន្ថែមទិន្នន័យថ្មីបន្ទាប់ពីឯកសារចាស់នឹងមើលទៅដូចនេះ៖

$ traceroute google.com >> date.txt
ឥឡូវនេះអ្វីដែលយើងត្រូវធ្វើគឺប្តូរឈ្មោះឯកសារទៅជាអ្វីដែលមានន័យជាងដោយប្រើពាក្យបញ្ជា mv ដែលយកឈ្មោះឯកសារដើមជាអាគុយម៉ង់ទីមួយ និងឈ្មោះឯកសារថ្មីជាទីពីរ៖

$ mv date.txt trace1.txt

បញ្ជូនបន្តការបញ្ចូលស្តង់ដារ

ដោយប្រើសញ្ញា< вместо >យើងអាចប្តូរទិសការបញ្ចូលស្តង់ដារដោយជំនួសវាដោយមាតិកានៃឯកសារ។

ចូរនិយាយថាមានឯកសារពីរ៖ list1.txt និង list2.txt ដែលនីមួយៗមានបញ្ជីខ្សែអក្សរដែលមិនបានតម្រៀប។ បញ្ជីនីមួយៗមានធាតុដែលមានតែមួយគត់សម្រាប់វា ប៉ុន្តែធាតុមួយចំនួននៅក្នុងបញ្ជីគឺដូចគ្នា។ យើងអាចស្វែងរកបន្ទាត់ដែលមានទាំងបញ្ជីទីមួយ និងទីពីរ ដោយប្រើពាក្យបញ្ជា com ប៉ុន្តែមុនពេលប្រើវា បញ្ជីត្រូវតែតម្រៀប។

មានពាក្យបញ្ជាតម្រៀបដែលត្រឡប់បញ្ជីដែលបានតម្រៀបទៅស្ថានីយដោយមិនរក្សាទុកទិន្នន័យដែលបានតម្រៀបទៅឯកសារដែលវាត្រូវបានគេយក។ អ្នកអាចផ្ញើកំណែដែលបានតម្រៀបនៃបញ្ជីនីមួយៗទៅ ឯកសារថ្មី។ដោយប្រើពាក្យបញ្ជា > ហើយបន្ទាប់មកប្រើពាក្យបញ្ជា com ។ ទោះជាយ៉ាងណាក៏ដោយវិធីសាស្រ្តនេះនឹងតម្រូវឱ្យមានពាក្យបញ្ជាយ៉ាងហោចណាស់ពីរទោះបីជារឿងដូចគ្នាអាចត្រូវបានធ្វើក្នុងមួយបន្ទាត់ដោយមិនចាំបាច់បង្កើតឯកសារដែលមិនចាំបាច់ក៏ដោយ។

ដូច្នេះយើងអាចប្រើពាក្យបញ្ជា< для перенаправления отсортированной версии каждого файла команде comm . Вот что у нас получилось:

$ com<(sort list1.txt) <(sort list2.txt)
វង់ក្រចកនៅទីនេះមានអត្ថន័យដូចគ្នានឹងគណិតវិទ្យាដែរ។ សែលដំណើរការពាក្យបញ្ជាក្នុងវង់ក្រចកជាមុនសិន ហើយបន្ទាប់មកអ្វីៗផ្សេងទៀត។ ក្នុងឧទាហរណ៍របស់យើង បន្ទាត់ពីឯកសារត្រូវបានតម្រៀបដំបូង ហើយបន្ទាប់មកលទ្ធផលត្រូវបានបញ្ជូនទៅពាក្យបញ្ជា comm ដែលបន្ទាប់មកបង្ហាញលទ្ធផលនៃការប្រៀបធៀបបញ្ជី។

បញ្ជូនបន្តការផ្សាយកំហុសស្តង់ដារ

ជាចុងក្រោយ សូមនិយាយអំពីការបញ្ជូនបន្តកំហុសស្តង់ដារ។ ជាឧទាហរណ៍ វាអាចត្រូវការជាចាំបាច់ ដើម្បីបង្កើតឯកសារកំណត់ហេតុដែលមានកំហុស ឬដើម្បីបញ្ចូលគ្នានូវសារកំហុស និងទិន្នន័យដែលបានបញ្ជូនមកវិញដោយពាក្យបញ្ជាជាក់លាក់នៅក្នុងឯកសារមួយ។

ឧទាហរណ៍ ចុះបើអ្នកចង់ស្វែងរកប្រព័ន្ធទាំងមូលរបស់អ្នកសម្រាប់ព័ត៌មានអំពីចំណុចប្រទាក់ឥតខ្សែដែលអាចចូលប្រើបានសម្រាប់អ្នកប្រើប្រាស់ដែលមិនមានសិទ្ធិជា root? ដើម្បីធ្វើដូចនេះអ្នកអាចប្រើថាមពលខ្លាំង ស្វែងរកពាក្យបញ្ជា.

ជាធម្មតា នៅពេលដែលអ្នកប្រើប្រាស់ធម្មតាដំណើរការពាក្យបញ្ជាស្វែងរកទូទាំងប្រព័ន្ធ វានឹងចេញទាំងទិន្នន័យមានប្រយោជន៍ និងកំហុសទៅកាន់ស្ថានីយ។ ក្នុងពេលជាមួយគ្នានេះ ជាធម្មតាមានផ្នែកក្រោយច្រើនជាងអតីត ដែលធ្វើឱ្យវាពិបាកក្នុងការស្វែងរកអ្វីដែលអ្នកត្រូវការនៅក្នុងលទ្ធផលពាក្យបញ្ជា។ ដំណោះស្រាយចំពោះបញ្ហានេះគឺសាមញ្ញណាស់៖ គ្រាន់តែប្តូរទិសស្ទ្រីមកំហុសស្តង់ដារទៅឯកសារដោយប្រើពាក្យបញ្ជា 2> (សូមចាំថា 2 គឺជាអ្នកពិពណ៌នាសម្រាប់ស្ទ្រីមកំហុសស្តង់ដារ)។ ជាលទ្ធផលមានតែអ្វីដែលពាក្យបញ្ជាផ្ញើទៅអេក្រង់នឹងបង្ហាញ។ ទិន្នផលស្តង់ដារ:

$ find / -name wireless 2> denied.txt
អ្វីដែលត្រូវធ្វើប្រសិនបើអ្នកត្រូវការរក្សាទុកលទ្ធផលនៃការងាររបស់ក្រុម ឯកសារដាច់ដោយឡែកដោយមិនលាយទិន្នន័យនេះជាមួយព័ត៌មានកំហុស? ដោយសារការស្ទ្រីមអាចត្រូវបានបញ្ជូនបន្តដោយឯករាជ្យពីគ្នាទៅវិញទៅមក យើងអាចបន្ថែមពាក្យបញ្ជាដើម្បីប្តូរទិសលទ្ធផលស្តង់ដារទៅឯកសារនៅចុងបញ្ចប់នៃការសាងសង់របស់យើង៖

$ find / -name wireless 2> denied.txt > found.txt
សូមចំណាំថាតង្កៀបមុំទីមួយភ្ជាប់មកជាមួយលេខ - 2> ហើយទីពីរដោយគ្មានវា។ នេះគឺដោយសារតែលទ្ធផលស្តង់ដារមានចំណុចទាញ 1 ហើយពាក្យបញ្ជា > មានគោលបំណងប្តូរទិសលទ្ធផលស្តង់ដារ ប្រសិនបើគ្មានលេខចំណុចទាញត្រូវបានបញ្ជាក់។

ជាចុងក្រោយ ប្រសិនបើអ្នកចង់ឱ្យអ្វីៗទាំងអស់ដែលលទ្ធផលពាក្យបញ្ជាបញ្ចប់ក្នុងឯកសារតែមួយ អ្នកអាចប្តូរទិសស្ទ្រីមទាំងពីរទៅទីតាំងដូចគ្នាដោយប្រើពាក្យបញ្ជា &>៖

$ find / -name wireless &> results.txt

លទ្ធផល

នៅទីនេះយើងបានពិនិត្យតែមូលដ្ឋាននៃយន្តការសម្រាប់ការបញ្ជូនបន្តការផ្សាយនៅក្នុងអ្នកបកប្រែប៉ុណ្ណោះ។ បន្ទាត់ពាក្យបញ្ជាលីនុច ប៉ុន្តែសូម្បីតែតិចតួចដែលអ្នកបានរៀនថ្ងៃនេះផ្តល់ឱ្យអ្នកស្ទើរតែទាំងអស់។ លទ្ធភាពគ្មានដែនកំណត់. ហើយដោយវិធីនេះ ដូចជាអ្វីៗផ្សេងទៀតដែលទាក់ទងនឹងការធ្វើការនៅក្នុងស្ថានីយ ការគ្រប់គ្រងការបញ្ជូនបន្តស្ទ្រីមត្រូវការការអនុវត្ត។ ដូច្នេះ យើងសូមណែនាំឱ្យអ្នកចាប់ផ្តើមការពិសោធន៍ផ្ទាល់ខ្លួនរបស់អ្នកជាមួយ > និង< .

អ្នកអានជាទីគោរព! តើអ្នកដឹងទេ? ឧទាហរណ៍គួរឱ្យចាប់អារម្មណ៍ការប្រើការបញ្ជូនបន្តខ្សែស្រឡាយនៅក្នុងលីនុច ដើម្បីជួយអ្នកទើបនឹងកើតកាន់តែមានផាសុកភាពជាមួយនឹងបច្ចេកទេសស្ថានីយនេះ?

អ្នកធ្លាប់ស្គាល់វិធីសាស្រ្តពីរសម្រាប់ធ្វើការជាមួយលទ្ធផលនៃស្គ្រីបបន្ទាត់ពាក្យបញ្ជា៖

  • បង្ហាញទិន្នន័យលទ្ធផលនៅលើអេក្រង់។
  • បញ្ជូនបន្តលទ្ធផលទៅឯកសារ។
ពេលខ្លះអ្នកត្រូវបង្ហាញអ្វីមួយនៅលើអេក្រង់ ហើយសរសេរអ្វីមួយទៅកាន់ឯកសារ ដូច្នេះអ្នកត្រូវយល់ពីរបៀបដែលលីនុចគ្រប់គ្រងការបញ្ចូល និងទិន្នផល ដែលមានន័យថារៀនពីរបៀបបញ្ជូនលទ្ធផលនៃស្គ្រីបទៅកន្លែងដែលអ្នកត្រូវការ។ ចូរចាប់ផ្តើមដោយនិយាយអំពីអ្នកពណ៌នាឯកសារស្តង់ដារ។

ការពិពណ៌នាឯកសារស្តង់ដារ

អ្វីគ្រប់យ៉ាងនៅក្នុងលីនុចគឺជាឯកសារ រួមទាំងការបញ្ចូល និងទិន្នផល។ ប្រព័ន្ធប្រតិបត្តិការកំណត់អត្តសញ្ញាណឯកសារដោយប្រើឧបករណ៍ពិពណ៌នា។

ដំណើរការនីមួយៗត្រូវបានអនុញ្ញាតឱ្យមានចំណុចទាញឯកសារបើករហូតដល់ប្រាំបួន។ សំបក bashរក្សាទុកចំណុចទាញបីដំបូងដែលមានលេខសម្គាល់ 0, 1 និង 2។ នេះជាអ្វីដែលពួកគេមានន័យ។

  • 0 , STDIN - ស្ទ្រីមបញ្ចូលស្តង់ដារ។
  • 1, STDOUT - ស្ទ្រីមលទ្ធផលស្តង់ដារ។
  • 2, STDERR - ស្ទ្រីមកំហុសស្តង់ដារ។
ចំណុចទាញពិសេសទាំងបីនេះគ្រប់គ្រងការបញ្ចូល និងលទ្ធផលទៅកាន់ស្គ្រីប។
អ្នក​ត្រូវ​យល់​ច្បាស់​អំពី​ការ​ផ្សាយ​តាម​ស្តង់ដារ។ ពួកគេអាចប្រៀបធៀបទៅនឹងមូលដ្ឋានគ្រឹះដែលអន្តរកម្មនៃស្គ្រីបជាមួយ ពិភពខាងក្រៅ. តោះមើលព័ត៌មានលម្អិតអំពីពួកគេ។

STDIN

STDIN គឺជាស្ទ្រីមបញ្ចូលស្តង់ដាររបស់សែល។ សម្រាប់ស្ថានីយ ការបញ្ចូលស្តង់ដារគឺជាក្តារចុច។ នៅពេលដែលស្គ្រីបប្រើតួអក្សរប្តូរទិសបញ្ចូល -< , Linux заменяет дескриптор файла ការបញ្ចូលស្តង់ដារទៅនឹងអ្វីដែលបានបញ្ជាក់នៅក្នុងពាក្យបញ្ជា។ ប្រព័ន្ធអានឯកសារ និងដំណើរការទិន្នន័យដូចជាវាត្រូវបានបញ្ចូលពីក្តារចុច។

ជាច្រើន។ ពាក្យបញ្ជា bashទទួលយកការបញ្ចូលពី STDIN ប្រសិនបើបន្ទាត់ពាក្យបញ្ជាមិនបញ្ជាក់ឯកសារដែលទិន្នន័យគួរតែត្រូវបានយក។ ឧទាហរណ៍នេះជាការពិតសម្រាប់ពាក្យបញ្ជាឆ្មា។

នៅពេលអ្នកចូល ពាក្យបញ្ជាឆ្មានៅលើបន្ទាត់ពាក្យបញ្ជាដោយមិនបញ្ជាក់ប៉ារ៉ាម៉ែត្រណាមួយវាទទួលយកការបញ្ចូលពី STDIN ។ បន្ទាប់ពីអ្នកបញ្ចូលបន្ទាត់បន្ទាប់ ឆ្មាគ្រាន់តែបង្ហាញវានៅលើអេក្រង់។

STDOUT

STDOUT គឺជាស្ទ្រីមលទ្ធផលស្តង់ដាររបស់សែល។ តាមលំនាំដើមនេះគឺជាអេក្រង់។ ពាក្យបញ្ជា bash ភាគច្រើនបញ្ជូនទិន្នន័យទៅ STDOUT ដែលបណ្តាលឱ្យវាលេចឡើងនៅក្នុងកុងសូល។ ទិន្នន័យអាចត្រូវបានបញ្ជូនបន្តទៅឯកសារដោយបន្ថែមវាទៅមាតិការបស់វាដោយប្រើពាក្យបញ្ជា >> ។

ដូច្នេះយើងមានឯកសារទិន្នន័យដែលយើងអាចបន្ថែមទិន្នន័យបន្ថែមទៀតដោយប្រើពាក្យបញ្ជានេះ៖

Pwd >> myfile
អ្វីដែលលទ្ធផល pwd នឹងត្រូវបានបន្ថែមទៅឯកសារ myfile ប៉ុន្តែទិន្នន័យដែលមានរួចហើយនៅក្នុងវានឹងមិនទៅណាទេ។

បញ្ជូន​បន្ត​លទ្ធផល​ពាក្យ​បញ្ជា​ទៅ​ឯកសារ

រហូតមកដល់ពេលនេះល្អណាស់ ប៉ុន្តែចុះយ៉ាងណាបើអ្នកព្យាយាមធ្វើអ្វីមួយដូចតទៅនេះដោយការចូលប្រើ xfile ដែលមិនមាន នោះទាំងអស់ត្រូវបានបង្កើតឡើងដើម្បីបង្កឱ្យមានសារកំហុសដើម្បីផ្ញើទៅកាន់ myfile ។

Ls –l xfile> myfile
បន្ទាប់ពីប្រតិបត្តិពាក្យបញ្ជានេះ យើងនឹងឃើញសារកំហុសនៅលើអេក្រង់។


ព្យាយាមចូលប្រើឯកសារដែលមិនមាន

កំហុសមួយត្រូវបានបង្កើតនៅពេលព្យាយាមចូលប្រើឯកសារដែលមិនមាន ប៉ុន្តែសែលមិនបានបញ្ជូនបន្តសារកំហុសទៅកាន់ឯកសារដោយការបោះពុម្ពពួកវាទៅអេក្រង់។ ប៉ុន្តែយើងចង់ឱ្យសារកំហុសត្រូវបានបញ្ចូលក្នុងឯកសារ។ អ្វីដែលត្រូវធ្វើ? ចម្លើយគឺសាមញ្ញ - ប្រើឧបករណ៍ពណ៌នាស្តង់ដារទីបី។

STDERR

STDERR គឺជាស្ទ្រីមកំហុសស្តង់ដាររបស់សែល។ តាមលំនាំដើម ចំណុចទាញនេះចង្អុលទៅវត្ថុដូចគ្នាដែល STDOUT ចង្អុលទៅ នោះហើយជាមូលហេតុដែលយើងឃើញសារនៅលើអេក្រង់នៅពេលមានកំហុសកើតឡើង។

ដូច្នេះ ឧបមាថាយើងចង់ប្តូរទិសសារកំហុសទៅ និយាយថា ឯកសារកំណត់ហេតុ ឬកន្លែងផ្សេងទៀត ជំនួសឱ្យការបោះពុម្ពពួកវាទៅអេក្រង់។

▍ ការបញ្ជូនបន្តនៃលំហូរកំហុស

ដូចដែលអ្នកបានដឹងរួចមកហើយ ចំណុចទាញឯកសារ STDERR គឺ 2. យើងអាចប្តូរទិសកំហុសដោយដាក់ចំណុចទាញនេះមុននឹងពាក្យបញ្ជាប្តូរទិស៖

Ls -l xfile 2>myfile cat ./myfile
សារកំហុសនឹងទៅ myfile ឥឡូវនេះ។


បញ្ជូនបន្តសារកំហុសទៅឯកសារ

▍ ប្តូរទិសកំហុស និងលទ្ធផលស្ទ្រីម

នៅពេលសរសេរស្គ្រីបបន្ទាត់ពាក្យបញ្ជា អាចមានស្ថានភាពដែលអ្នកត្រូវប្តូរទិសទាំងសារកំហុស និងលទ្ធផលស្តង់ដារ។ ដើម្បីសម្រេចបាននូវចំណុចនេះ អ្នកត្រូវប្រើពាក្យបញ្ជាប្តូរទិសសម្រាប់អ្នកពណ៌នាសមរម្យ ដោយបញ្ជាក់ឯកសារដែលកំហុស និងលទ្ធផលស្តង់ដារគួរទៅ៖

Ls –l myfile xfile anotherfile 2> errorcontent 1> មាតិកាត្រឹមត្រូវ។

ការបញ្ជូនបន្តកំហុស និងលទ្ធផលស្តង់ដារ

សែលនឹងបញ្ជូនបន្តនូវអ្វីដែលពាក្យបញ្ជា ls ជាធម្មតាផ្ញើទៅ STDOUT ទៅក្នុងឯកសារមាតិកាត្រឹមត្រូវ អរគុណចំពោះ 1> ស្ថាបនា។ សារកំហុសដែលនឹងទៅ STDERR បញ្ចប់នៅក្នុងឯកសារដែលមានកំហុសដោយសារពាក្យបញ្ជា 2> បញ្ជូនបន្ត។

បើចាំបាច់ ទាំង STDERR និង STDOUT អាចត្រូវបានបញ្ជូនបន្តទៅឯកសារដូចគ្នាដោយប្រើពាក្យបញ្ជា &>៖


បញ្ជូនបន្ត STDERR និង STDOUT ទៅឯកសារដូចគ្នា។

បន្ទាប់ពីពាក្យបញ្ជាត្រូវបានប្រតិបត្តិ អ្វីដែលមានបំណងសម្រាប់ STDERR និង STDOUT បញ្ចប់នៅក្នុងឯកសារមាតិកា។

បញ្ជូនបន្តលទ្ធផលនៅក្នុងស្គ្រីប

មានវិធីសាស្រ្តពីរសម្រាប់ការបញ្ជូនបន្តលទ្ធផលនៅក្នុងស្គ្រីបបន្ទាត់ពាក្យបញ្ជា៖
  • ការបញ្ជូនបន្តបណ្តោះអាសន្ន ឬការបញ្ជូនបន្តទិសដៅលទ្ធផលបន្ទាត់តែមួយ។
  • ការបញ្ជូនបន្តជាអចិន្ត្រៃយ៍ ឬការបញ្ជូនបន្តនៃលទ្ធផលទាំងអស់ ឬផ្នែកនៃស្គ្រីប។

▍ ការបញ្ជូនបន្តលទ្ធផលបណ្តោះអាសន្ន

នៅក្នុងស្គ្រីប អ្នកអាចប្តូរទិសលទ្ធផលនៃបន្ទាត់តែមួយទៅ STDERR ។ ដើម្បីធ្វើដូចនេះគ្រាន់តែប្រើពាក្យបញ្ជាបញ្ជូនបន្តដោយបញ្ជាក់អ្នកពណ៌នា STDERR ហើយនាំមុខលេខអ្នកពណ៌នាដោយតួអក្សរ ampersand (&):

#!/bin/bash បន្ទរ "នេះជាកំហុស" >&2 បន្ទរ "នេះជាលទ្ធផលធម្មតា"
ប្រសិនបើអ្នកដំណើរការស្គ្រីប នោះបន្ទាត់ទាំងពីរនឹងបង្ហាញនៅលើអេក្រង់ ព្រោះដូចដែលអ្នកបានដឹងរួចមកហើយថា កំហុសលំនាំដើមគឺចេញនៅកន្លែងតែមួយជាមួយទិន្នន័យធម្មតា។


ការបញ្ជូនបន្តបណ្តោះអាសន្ន

ចូរដំណើរការស្គ្រីបដើម្បីឱ្យលទ្ធផល STDERR ទៅកាន់ឯកសារមួយ។

./myscript 2> myfile
ដូចដែលអ្នកអាចឃើញឥឡូវនេះទិន្នផលធម្មតាត្រូវបានផ្ញើទៅកុងសូលហើយសារកំហុសទៅឯកសារ។


សារកំហុសត្រូវបានសរសេរទៅឯកសារ

▍ ការបញ្ជូនបន្តលទ្ធផលអចិន្រ្តៃយ៍

ប្រសិនបើស្គ្រីបរបស់អ្នកត្រូវការប្តូរទិសទិន្នផលច្រើនទៅអេក្រង់ វារអាក់រអួលក្នុងការបន្ថែមពាក្យបញ្ជាដែលសមស្របទៅនឹងការហៅតាមអេកូនីមួយៗ។ ជំនួសមកវិញ អ្នកអាចកំណត់លទ្ធផលដែលត្រូវបញ្ជូនបន្តទៅចំណុចទាញជាក់លាក់មួយសម្រាប់រយៈពេលនៃស្គ្រីបដោយប្រើពាក្យបញ្ជា exec៖

#!/bin/bash exec 1>outfile echo "នេះ​គឺ​ជា​ការ​សាកល្បង​នៃ​ការ​បញ្ជូន​បន្ត​លទ្ធផល​ទាំងអស់" echo "ពី​ស្គ្រីប​សែល​ទៅ​ឯកសារ​ផ្សេង។" បន្ទរ "ដោយមិនចាំបាច់ប្តូរទិសគ្រប់បន្ទាត់"
តោះដំណើរការស្គ្រីប។


បញ្ជូនបន្តលទ្ធផលទាំងអស់ទៅឯកសារ

ប្រសិនបើអ្នកក្រឡេកមើលឯកសារដែលបានបញ្ជាក់នៅក្នុងពាក្យបញ្ជាបញ្ជូនបន្តលទ្ធផល អ្នកនឹងឃើញថាអ្វីគ្រប់យ៉ាងដែលត្រូវបានចេញដោយពាក្យបញ្ជាអេកូបានបញ្ចប់នៅក្នុងឯកសារនោះ។

ពាក្យបញ្ជា exec អាចត្រូវបានប្រើមិនត្រឹមតែនៅដើមស្គ្រីបប៉ុណ្ណោះទេប៉ុន្តែថែមទាំងនៅកន្លែងផ្សេងទៀតផងដែរ៖

#!/bin/bash exec 2>myerror echo "នេះគឺ ការចាប់ផ្តើមនៃស្គ្រីប" echo "ឥឡូវនេះបញ្ជូនបន្តលទ្ធផលទាំងអស់ទៅទីតាំងផ្សេងទៀត" exec 1> myfile echo "នេះគួរតែទៅកាន់ឯកសារ myfile" echo "ហើយវាគួរតែទៅកាន់ឯកសារ myerror" >&2
នេះជាអ្វីដែលអ្នកទទួលបានបន្ទាប់ពីដំណើរការស្គ្រីប និងមើលឯកសារដែលយើងប្តូរទិសលទ្ធផល។


បញ្ជូនបន្តលទ្ធផលទៅឯកសារផ្សេងៗ

ពាក្យបញ្ជា exec ដំបូងបញ្ជូនបន្តទិន្នផលពី STDERR ទៅកាន់ឯកសារ myerror ។ បន្ទាប់មកលទ្ធផលនៃពាក្យបញ្ជាអេកូជាច្រើនត្រូវបានបញ្ជូនទៅ STDOUT ហើយបោះពុម្ពទៅអេក្រង់។ ពាក្យបញ្ជា exec បណ្តាលឱ្យអ្វីដែលបញ្ចប់នៅក្នុង STDOUT ត្រូវបានបញ្ជូនទៅឯកសារ myfile ហើយទីបំផុតយើងប្រើពាក្យបញ្ជាប្តូរទិសទៅ STDERR នៅក្នុងពាក្យបញ្ជាអេកូ ដែលបណ្តាលឱ្យបន្ទាត់ដែលត្រូវគ្នាត្រូវបានសរសេរទៅ myerror ឯកសារ។

នៅពេលដែលអ្នកបានស្ទាត់ជំនាញនេះហើយ អ្នកនឹងអាចប្តូរទិសលទ្ធផលនៅកន្លែងដែលអ្នកចង់ទៅ។ ឥឡូវនេះសូមនិយាយអំពីការបញ្ជូនបន្តការបញ្ចូល។

បញ្ជូនបន្តការបញ្ចូលក្នុងស្គ្រីប

ដើម្បីប្តូរទិសការបញ្ចូល អ្នកអាចប្រើបច្ចេកទេសដូចគ្នាដែលយើងធ្លាប់ប្រើដើម្បីប្តូរទិសទិន្នផល។ ឧទាហរណ៍ ពាក្យបញ្ជា exec អនុញ្ញាតឱ្យអ្នកបង្កើតឯកសារជាប្រភពទិន្នន័យសម្រាប់ STDIN៖

Exec 0< myfile
ពាក្យបញ្ជានេះប្រាប់សែលថាប្រភពបញ្ចូលគួរតែជា myfile ជាជាង STDIN ធម្មតា។ តោះមើលការបញ្ជូនបន្តការបញ្ចូលក្នុងសកម្មភាព៖

#!/bin/bash exec 0< testfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done
នេះជាអ្វីដែលនឹងបង្ហាញនៅលើអេក្រង់បន្ទាប់ពីដំណើរការស្គ្រីប។


បញ្ចូលការបញ្ជូនបន្ត

នៅក្នុងអត្ថបទមុននេះ អ្នកបានរៀនពីរបៀបប្រើពាក្យបញ្ជាអាន ដើម្បីអានការបញ្ចូលរបស់អ្នកប្រើពីក្តារចុច។ ប្រសិនបើអ្នកប្តូរទិសការបញ្ចូលដោយធ្វើឱ្យប្រភពទិន្នន័យទៅជាឯកសារ នោះពាក្យបញ្ជាអាន នៅពេលព្យាយាមអានទិន្នន័យពី STDIN នឹងអានវាពីឯកសារ មិនមែនមកពីក្តារចុចទេ។

អ្នកគ្រប់គ្រងលីនុចខ្លះប្រើវិធីនេះដើម្បីអាន និងដំណើរការឯកសារកំណត់ហេតុ។

បង្កើតការបញ្ជូនបន្តលទ្ធផលផ្ទាល់ខ្លួនរបស់អ្នក។

តាមរយៈការបញ្ជូនបន្តការបញ្ចូល និងលទ្ធផលនៅក្នុងស្គ្រីប អ្នកមិនត្រូវបានកំណត់ចំពោះអ្នកពិពណ៌នាឯកសារស្តង់ដារទាំងបីទេ។ ដូចដែលបានរៀបរាប់ អ្នកអាចមានចំណុចទាញបើករហូតដល់ប្រាំបួន។ ប្រាំមួយដែលនៅសល់ដែលមានលេខ 3 ដល់ 8 អាចត្រូវបានប្រើដើម្បីប្តូរទិសបញ្ចូលឬទិន្នផល។ ពួកវាណាមួយអាចត្រូវបានកំណត់ទៅឯកសារមួយ ហើយប្រើជាកូដស្គ្រីប។

អ្នកអាចកំណត់ចំណុចទាញដើម្បីបញ្ចេញទិន្នន័យដោយប្រើពាក្យបញ្ជា exec៖

#!/bin/bash exec 3>myfile echo "វា​គួរ​តែ​បង្ហាញ​នៅ​លើ​អេក្រង់" echo "ហើយ​វា​គួរ​តែ​ត្រូវ​បាន​រក្សា​ទុក​ក្នុង​ឯកសារ" >&3 echo "ហើយ​វា​គួរតែ​ត្រឡប់​មក​វិញ​នៅ​លើ​អេក្រង់"
បន្ទាប់ពីដំណើរការស្គ្រីបផ្នែកនៃលទ្ធផលនឹងបង្ហាញនៅលើអេក្រង់ជាផ្នែកមួយ - នៅក្នុងឯកសារដែលមានអ្នកពណ៌នា 3 ។


បញ្ជូនបន្តលទ្ធផលដោយប្រើចំណុចទាញរបស់វា។

ការបង្កើតឯកសារពិពណ៌នាសម្រាប់ការបញ្ចូលទិន្នន័យ

អ្នកអាចប្តូរទិសការបញ្ចូលក្នុងស្គ្រីបតាមរបៀបដូចគ្នានឹងអ្នកប្តូរទិសលទ្ធផល។ រក្សាទុក STDIN នៅក្នុងចំណុចទាញមួយផ្សេងទៀត មុនពេលបញ្ជូនបន្តការបញ្ចូល។

បន្ទាប់ពីបញ្ចប់ការអានឯកសារ អ្នកអាចស្ដារ STDIN ហើយប្រើវាដូចធម្មតា៖

#!/bin/bash exec ៦<&0 exec 0< myfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done exec 0<&6 read -p "Are you done now? " answer case $answer in y) echo "Goodbye";; n) echo "Sorry, this is the end.";; esac
ចូរយើងសាកល្បងសេណារីយ៉ូ។


បញ្ចូលការបញ្ជូនបន្ត

ក្នុងឧទាហរណ៍នេះ អ្នកពិពណ៌នាឯកសារ 6 ត្រូវបានប្រើដើម្បីរក្សាទុកឯកសារយោងទៅ STDIN ។ បន្ទាប់មកការបញ្ជូនបន្តការបញ្ចូលត្រូវបានធ្វើរួច ឯកសារបានក្លាយជាប្រភពទិន្នន័យសម្រាប់ STDIN ។ ការបញ្ចូលទៅពាក្យបញ្ជាអានបន្ទាប់មកបានមកពី STDIN ដែលបានប្តូរទិស ពោលគឺពីឯកសារ។

បន្ទាប់ពីអានឯកសារ យើងកំណត់ STDIN ឡើងវិញដោយប្តូរទិសវាទៅដោះស្រាយ 6. ឥឡូវនេះ ដើម្បីពិនិត្យមើលថាអ្វីៗដំណើរការបានត្រឹមត្រូវ ស្គ្រីបសួរអ្នកប្រើប្រាស់នូវសំណួរមួយ រង់ចាំការបញ្ចូលក្តារចុច និងដំណើរការអ្វីដែលត្រូវបានបញ្ចូល។

ការបិទចំណុចទាញឯកសារ

សែលបិទចំណុចទាញឯកសារដោយស្វ័យប្រវត្តិ បន្ទាប់ពីស្គ្រីបបានបញ្ចប់។ ទោះយ៉ាងណាក៏ដោយ ក្នុងករណីខ្លះ វាចាំបាច់ក្នុងការបិទចំណុចទាញដោយដៃ មុនពេលស្គ្រីបបញ្ចប់ដំណើរការ។ ដើម្បីបិទចំណុចទាញ វាត្រូវតែបញ្ជូនបន្តទៅ &- ។ វាមើលទៅដូចនេះ៖

#!/bin/bash exec 3> myfile បន្ទរ "នេះជាបន្ទាត់សាកល្បងនៃទិន្នន័យ" >&3 exec 3>&- បន្ទរ "នេះនឹងមិនដំណើរការ" >&3
បន្ទាប់ពីដំណើរការស្គ្រីប យើងនឹងទទួលបានសារកំហុស។


ព្យាយាមចូលប្រើកម្មវិធីពិពណ៌នាឯកសារបិទ

រឿងនេះគឺថាយើងបានព្យាយាមចូលប្រើឧបករណ៍ពិពណ៌នាដែលមិនមាន។

សូមប្រយ័ត្នពេលបិទចំណុចទាញឯកសារនៅក្នុងស្គ្រីប។ ប្រសិនបើអ្នកបានផ្ញើទិន្នន័យទៅឯកសារ បន្ទាប់មកបិទចំណុចទាញ បន្ទាប់មកបើកវាម្តងទៀត សែលនឹងជំនួសឯកសារដែលមានស្រាប់ជាមួយនឹងឯកសារថ្មី។ នោះ​គឺ​អ្វី​គ្រប់​យ៉ាង​ដែល​ត្រូវ​បាន​សរសេរ​ពីមុន​ទៅ​ឯកសារ​នេះ​នឹង​ត្រូវ​បាត់បង់។

ទទួលបានព័ត៌មានអំពីចំណុចទាញបើកចំហ

ដើម្បីទទួលបានបញ្ជីចំណុចទាញទាំងអស់ដែលបើកនៅក្នុងលីនុច អ្នកអាចប្រើពាក្យបញ្ជា lsof ។ នៅលើការចែកចាយជាច្រើនដូចជា Fedora ឧបករណ៍ប្រើប្រាស់ lsof មានទីតាំងនៅ /usr/sbin ។ ពាក្យបញ្ជានេះមានប្រយោជន៍ណាស់ព្រោះវាបង្ហាញព័ត៌មានអំពីចំណុចទាញនីមួយៗដែលបើកនៅលើប្រព័ន្ធ។ នេះរួមបញ្ចូលទាំងអ្វីដែលបើកដោយដំណើរការដែលដំណើរការក្នុងផ្ទៃខាងក្រោយ និងអ្វីដែលត្រូវបានបើកដោយអ្នកប្រើប្រាស់ដែលបានចូល។

ពាក្យ​បញ្ជា​នេះ​មាន​កូនសោ​ជា​ច្រើន សូម​យើង​មើល​ពាក្យ​ដែល​សំខាន់​បំផុត។

  • -p អនុញ្ញាតឱ្យអ្នកបញ្ជាក់លេខសម្គាល់ដំណើរការ។
  • -d អនុញ្ញាតឱ្យអ្នកបញ្ជាក់ចំនួនអ្នកពណ៌នាដែលអ្នកចង់ទទួលបានព័ត៌មាន។
ដើម្បីស្វែងយល់ពី PID នៃដំណើរការបច្ចុប្បន្ន អ្នកអាចប្រើពិសេស បរិស្ថានប្រែប្រួល$$ ដែលសែលសរសេរ PID បច្ចុប្បន្ន។

កុងតាក់ -a ត្រូវបានប្រើដើម្បីអនុវត្តប្រតិបត្តិការឡូជីខល AND លើលទ្ធផលដែលបានត្រឡប់មកវិញដោយប្រើកុងតាក់ពីរផ្សេងទៀត៖

Lsof -a -p $$ -d 0,1,2

បង្ហាញព័ត៌មានអំពីចំណុចទាញបើក

ប្រភេទឯកសារដែលភ្ជាប់ជាមួយ STDIN, STDOUT និង STDERR គឺ CHR (របៀបតួអក្សរ)។ ដោយសារពួកវាទាំងអស់ចង្អុលទៅស្ថានីយមួយ ឈ្មោះឯកសារត្រូវគ្នានឹងឈ្មោះឧបករណ៍ដែលបានកំណត់ទៅស្ថានីយ។ ឯកសារស្តង់ដារទាំងបីគឺអាចអានបាន និងអាចសរសេរបាន។

សូមក្រឡេកមើលការហៅពាក្យបញ្ជា lsof ពីស្គ្រីប ដែលបន្ថែមពីលើស្តង់ដារ អ្នកពណ៌នាផ្សេងទៀតត្រូវបានបើក៖

#!/bin/bash exec 3> myfile1 exec 6> myfile2 exec ៧< myfile3 lsof -a -p $$ -d 0,1,2,3,6,7
នេះជាអ្វីដែលកើតឡើងប្រសិនបើអ្នកដំណើរការស្គ្រីបនេះ។


មើលចំណុចទាញឯកសារដែលបើកដោយស្គ្រីប

ស្គ្រីបបានបើកចំណុចទាញពីរសម្រាប់លទ្ធផល (3 និង 6) និងមួយសម្រាប់បញ្ចូល (7) ។ ផ្លូវទៅកាន់ឯកសារដែលប្រើដើម្បីកំណត់រចនាសម្ព័ន្ធអ្នកពណ៌នាក៏ត្រូវបានបង្ហាញផងដែរ។

ការបង្ក្រាបទិន្នផល

ពេលខ្លះអ្នកត្រូវប្រាកដថាពាក្យបញ្ជានៅក្នុងស្គ្រីបដែលឧទាហរណ៍អាចត្រូវបានប្រតិបត្តិដូចជា ដំណើរការផ្ទៃខាងក្រោយគ្មានអ្វីត្រូវបានបង្ហាញនៅលើអេក្រង់ទេ។ ដើម្បីធ្វើដូច្នេះ អ្នកអាចប្តូរទិសលទ្ធផលទៅ /dev/null ។ នេះគឺជាអ្វីមួយដូចជា "ប្រហោងខ្មៅ" ។

នេះជាឧទាហរណ៍នៃវិធីទប់ស្កាត់សារកំហុស៖

Ls -al badfile anotherfile 2> /dev/null
វិធីសាស្រ្តដូចគ្នាត្រូវបានប្រើប្រសិនបើឧទាហរណ៍ អ្នកត្រូវសម្អាតឯកសារដោយមិនលុបវា៖

Cat /dev/null> myfile

លទ្ធផល

ថ្ងៃនេះអ្នកបានរៀនពីរបៀបបញ្ចូល និងទិន្នផលដំណើរការនៅក្នុងស្គ្រីបបន្ទាត់ពាក្យបញ្ជា។ ឥឡូវអ្នកដឹងពីរបៀបដោះស្រាយឯកសារពិពណ៌នា បង្កើត មើល និងបិទពួកវា ហើយដឹងអំពីការបញ្ជូនបន្តការបញ្ចូល លទ្ធផល និងកំហុស។ ទាំងអស់នេះមានសារៈសំខាន់ខ្លាំងណាស់ក្នុងការអភិវឌ្ឍន៍ស្គ្រីប bash ។

លើកក្រោយយើងនឹងនិយាយអំពី សញ្ញាលីនុចរបៀបដំណើរការពួកវាក្នុងស្គ្រីប អំពីការងារដែលបានកំណត់ពេលដំណើរការ និងអំពីកិច្ចការផ្ទៃខាងក្រោយ។

អ្នកអានជាទីគោរព! សម្ភារៈនេះផ្តល់នូវមូលដ្ឋានគ្រឹះនៃការធ្វើការជាមួយការបញ្ចូល ទិន្នផល និងស្ទ្រីមកំហុស។ យើងប្រាកដថាក្នុងចំនោមអ្នកមានអ្នកជំនាញដែលអាចប្រាប់អ្នកអំពីអ្វីៗទាំងអស់នេះបានមកជាមួយបទពិសោធន៍តែប៉ុណ្ណោះ។ បើអញ្ចឹង យើងហុចជាន់ឱ្យអ្នក។

ទោះបីជាជាធម្មតា ដូចដែលបានកត់សម្គាល់ I/O របស់កម្មវិធីត្រូវបានភ្ជាប់ជាមួយស្ទ្រីមស្តង់ដារក៏ដោយ មានឧបករណ៍ពិសេសនៅក្នុងសែលសម្រាប់ការបញ្ជូនបន្ត I/O ។

5.5.1 ប្រតិបត្តិករ >,< и >>

និមិត្តសញ្ញា " ត្រូវបានប្រើដើម្បីបង្ហាញពីការបញ្ជូនបន្ត។ > ", "< "ហើយ" >> "។ ការប្រើប្រាស់ទូទៅបំផុតគឺប្តូរទិសលទ្ធផលពាក្យបញ្ជាទៅកាន់ឯកសារ។ នេះគឺជាឧទាហរណ៍មួយ៖

$ ls -l > /home/jim/dir.txt

ពាក្យ​បញ្ជា​នេះ​នឹង​រក្សា​ទុក​ក្នុង​ឯកសារ /home/jim/dir.txt បញ្ជី​ឯកសារ និង​ថត​រង​នៃ​ថត​ដែល​មាន​បច្ចុប្បន្ន​នៅ​ពេល​ដែល​ពាក្យ​បញ្ជា​ត្រូវ​បាន​ប្រតិបត្តិ ls; ហើយប្រសិនបើ ឯកសារដែលបានបញ្ជាក់មិនមានទេបន្ទាប់មកវានឹងត្រូវបានបង្កើតឡើង។ ប្រសិនបើវាមាន វានឹងសរសេរជាន់ពីលើ។ ប្រសិនបើអ្នកចង់ឱ្យលទ្ធផលពាក្យបញ្ជាត្រូវបានបន្ថែមទៅចុងបញ្ចប់នៃឯកសារដែលមានស្រាប់ នោះជំនួសឱ្យនិមិត្តសញ្ញាដែលអ្នកត្រូវការ > ប្រើ >> . ក្នុងករណីនេះវត្តមាននៃចន្លោះមុនឬក្រោយតួអក្សរ > >> គឺមិនសំខាន់ ហើយបម្រើតែសម្រាប់ភាពងាយស្រួលរបស់អ្នកប្រើប្រាស់ប៉ុណ្ណោះ។

អ្នក​អាច​ផ្ញើ​លទ្ធផល​មិន​ត្រឹម​តែ​ទៅ​ឯកសារ​មួយ​ប៉ុណ្ណោះ​ទេ ប៉ុន្តែ​ក៏​បញ្ចូល​ទៅ​នឹង​ការ​បញ្ចូល​ពាក្យ​បញ្ជា​ផ្សេង​ទៀត ឬ​ទៅ​ឧបករណ៍​មួយ (ដូចជា​ម៉ាស៊ីន​បោះពុម្ព)។ ដូច្នេះ ដើម្បីរាប់ចំនួនពាក្យនៅក្នុងឯកសារ /home/jim/report.txt អ្នកអាចប្រើពាក្យបញ្ជាខាងក្រោម៖

$ cat /home/jim/report.txt > wc -w

ហើយដើម្បីបោះពុម្ពឯកសារ សូមប្រើពាក្យបញ្ជា៖

$ cat /home/jim/report.txt > lpr

ដូចដែលអ្នកអាចឃើញប្រតិបត្តិករ > បម្រើដើម្បីប្តូរទិសស្ទ្រីមទិន្នផល។ ទាក់ទងទៅនឹងចរន្តបញ្ចូលមុខងារស្រដៀងគ្នាត្រូវបានអនុវត្តដោយប្រតិបត្តិករ < . ពាក្យបញ្ជាឧទាហរណ៍ខាងលើដើម្បីរាប់ចំនួនពាក្យនៅក្នុងឯកសារជាក់លាក់មួយអាចត្រូវបានសរសេរឡើងវិញដូចខាងក្រោម (ចំណាំអវត្តមាននៃពាក្យបញ្ជា ឆ្មា):

$ wc -w< /home/jim/report.txt

ជម្រើសប្តូរទិសនេះត្រូវបានប្រើជាញឹកញាប់នៅក្នុងស្គ្រីបផ្សេងៗសម្រាប់ពាក្យបញ្ជាដែលជាធម្មតាទទួលយក (ឬរំពឹង) ការបញ្ចូលក្តារចុច។ នៅក្នុងស្គ្រីបដែលស្វ័យប្រវត្តិកម្មមួយចំនួន ប្រតិបត្តិការជាប្រចាំអ្នកអាចផ្តល់ឱ្យពាក្យបញ្ជានូវព័ត៌មានចាំបាច់ពីឯកសារដែលអ្វីដែលត្រូវបញ្ចូលក្នុងគោលបំណងដើម្បីប្រតិបត្តិពាក្យបញ្ជានេះត្រូវបានកត់ត្រាទុកជាមុន។

ដោយសារតែនិមិត្តសញ្ញា < , > និង >> ធ្វើសកម្មភាពលើស្ទ្រីមស្ដង់ដារ ពួកគេអាចត្រូវបានប្រើមិនត្រឹមតែក្នុងវិធីធម្មតាដូចដែលជាធម្មតាត្រូវបានធ្វើនោះទេ ប៉ុន្តែក៏នៅក្នុងវិធីផ្សេងគ្នាបន្តិច។ ដូច្នេះពាក្យបញ្ជាខាងក្រោមគឺសមមូល៖

$ cat > ឯកសារ

$cat>ឯកសារ

$ > ឯកសារឆ្មា

$ > ឯកសារឆ្មា

ទោះយ៉ាងណាក៏ដោយដោយខ្លួនវាផ្ទាល់ (ដោយគ្មានពាក្យបញ្ជាណាមួយដែលស្ទ្រីមស្តង់ដារត្រូវបានកំណត់) និមិត្តសញ្ញាប្តូរទិសមិនអាចប្រើបានទេ ដូច្នេះឧទាហរណ៍មិនអាចប្រើដោយការវាយ

$file1 > file2

ទទួលបានច្បាប់ចម្លងនៃឯកសារមួយ។ ប៉ុន្តែ​វា​មិន​ធ្វើ​ឲ្យ​វា​សំខាន់​ជាង​នេះ​ទេ។ យន្តការនេះ។ពីព្រោះលំហូរស្តង់ដារត្រូវបានកំណត់សម្រាប់ពាក្យបញ្ជាណាមួយ។ ក្នុងករណីនេះអ្នកអាចប្តូរទិសមិនត្រឹមតែការបញ្ចូលនិងទិន្នផលស្តង់ដារប៉ុណ្ណោះទេប៉ុន្តែថែមទាំងស្ទ្រីមផ្សេងទៀតផងដែរ។ ដើម្បីធ្វើដូច្នេះ សូមបញ្ជាក់ចំនួននៃស្ទ្រីមបញ្ជូនបន្តមុននិមិត្តសញ្ញាប្តូរទិស។ ការបញ្ចូលស្តង់ដារ stdin គឺលេខ 0 ស្តង់ដារទិន្នផល stdout គឺលេខ 1 កំហុសស្តង់ដារ stderr ស្ទ្រីមគឺលេខ 2 ។ នោះគឺ ទម្រង់ពេញពាក្យ​បញ្ជា​ប្ដូរ​ទិស​មើល​ទៅ​ដូច​នេះ (សូម​ចាំ​ថា​ចន្លោះ​នៅ​ជិត > គឺ​ជា​ជម្រើស)៖

ពាក្យបញ្ជា N> M

កន្លែងណា និង - ចំនួនស្ទ្រីមស្តង់ដារ (0,1,2) ឬឈ្មោះឯកសារ។ ការប្រើប្រាស់និមិត្តសញ្ញាក្នុងករណីខ្លះ < , > និង >> ដោយមិនបញ្ជាក់លេខឆានែល ឬឈ្មោះឯកសារគឺអាចធ្វើទៅបានលុះត្រាតែ 1 ត្រូវបានជំនួសដោយលំនាំដើមសម្រាប់លេខដែលបាត់ ពោលគឺលទ្ធផលស្តង់ដារ។ បាទ ប្រតិបត្តិករ > ដោយមិនបញ្ជាក់លេខត្រូវបានបកស្រាយថាជា 1 > .

លើកលែងតែ ការបញ្ជូនបន្តសាមញ្ញស្ទ្រីមស្ដង់ដារ វាក៏អាចធ្វើទៅបានមិនត្រឹមតែដើម្បីបញ្ជូនបន្តការផ្សាយទៅឆានែលមួយឬមួយផ្សេងទៀតប៉ុណ្ណោះទេ ប៉ុន្តែដើម្បីធ្វើច្បាប់ចម្លងមាតិកានៃស្ទ្រីមស្តង់ដារ។ មាននិមិត្តសញ្ញាពិសេសសម្រាប់រឿងនេះ & ដែលត្រូវបានដាក់នៅពីមុខលេខឆានែលដែលការផ្សាយត្រូវបានបញ្ជូនបន្ត៖

ពាក្យបញ្ជា N > & M

ពាក្យបញ្ជានេះមានន័យថាលទ្ធផលនៃលេខឆានែល ត្រូវ​បាន​បញ្ជូន​ទាំង​ពីរ​ទៅ​លទ្ធផល​ស្តង់ដារ និង​ចម្លង​ទៅ​លេខ​ឆានែល . ឧទាហរណ៍ ដើម្បីឱ្យសារកំហុសត្រូវបានចម្លងនៅលើលទ្ធផលស្តង់ដារ អ្នកត្រូវផ្តល់ពាក្យបញ្ជា 2>&1, ខណៈពេលដែល 1>&2 ស្ទួន stdout ទៅ stderr ។ លក្ខណៈពិសេសនេះមានប្រយោជន៍ជាពិសេសនៅពេលបញ្ជូនបន្តលទ្ធផលទៅឯកសារ ចាប់តាំងពីពេលនោះមកយើងទាំងពីរឃើញសារនៅលើអេក្រង់ និងរក្សាទុកពួកវាទៅក្នុងឯកសារ។

5.5.2 ប្រតិបត្តិករ |

ជម្រើសពិសេសសម្រាប់ការបញ្ជូនបន្តលទ្ធផលគឺត្រូវរៀបចំ ឆានែលកម្មវិធី(ជួនកាលគេហៅថា បំពង់បង្ហូរ ឬ conveyor)។ ដើម្បីធ្វើដូច្នេះបាន ពាក្យបញ្ជាពីរ ឬច្រើន ដែលលទ្ធផលនៃពាក្យមុនបម្រើជាការបញ្ចូលសម្រាប់បន្ទាប់ ត្រូវបានភ្ជាប់ (ឬបំបែកប្រសិនបើអ្នកចង់បាន) ដោយតួអក្សររបារបញ្ឈរ - "|" ។ ក្នុងករណីនេះស្ទ្រីមលទ្ធផលស្តង់ដារនៃពាក្យបញ្ជាដែលមានទីតាំងនៅខាងឆ្វេងនៃនិមិត្តសញ្ញា | ត្រូវបានផ្ញើទៅការបញ្ចូលស្តង់ដារនៃកម្មវិធីដែលមានទីតាំងនៅខាងស្តាំនៃនិមិត្តសញ្ញា | . ឧទាហរណ៍៖

$ cat myfile | grep លីនុច | wc -l

បន្ទាត់នេះមានន័យថាលទ្ធផលនៃពាក្យបញ្ជាគឺ ឆ្មាពោលគឺ អត្ថបទពីឯកសារ myfile នឹងត្រូវបានផ្ញើទៅកាន់ការបញ្ចូលពាក្យបញ្ជា grepដែលនឹងបន្លិចតែបន្ទាត់ដែលមានពាក្យ "លីនុច" ប៉ុណ្ណោះ។ លទ្ធផលពាក្យបញ្ជា grepវានឹងត្រូវបានដឹកនាំទៅការបញ្ចូលពាក្យបញ្ជា wc -lដែលនឹងរាប់ចំនួនបន្ទាត់បែបនេះ។

បំពង់កម្មវិធីត្រូវបានប្រើដើម្បីបញ្ចូលគ្នានូវកម្មវិធីតូចៗជាច្រើន ដែលកម្មវិធីនីមួយៗដំណើរការតែការបំប្លែងជាក់លាក់នៅលើស្ទ្រីមបញ្ចូលរបស់វា ដើម្បីបង្កើតការណែនាំទូទៅដែលបណ្តាលឱ្យមានការបំប្លែងដ៏ស្មុគស្មាញមួយចំនួន។

គួរកត់សំគាល់ថាសែលហៅពាក្យបញ្ជាទាំងអស់ដែលរួមបញ្ចូលក្នុងបំពង់សម្រាប់ប្រតិបត្តិក្នុងពេលដំណាលគ្នា ដោយបើកដំណើរការឧទាហរណ៍ដាច់ដោយឡែកនៃសែលសម្រាប់ពាក្យបញ្ជានីមួយៗ ដូច្នេះដរាបណាកម្មវិធីដំបូងចាប់ផ្តើមផលិតអ្វីមួយនៅក្នុងស្ទ្រីមលទ្ធផលរបស់វា ពាក្យបញ្ជាបន្ទាប់ចាប់ផ្តើមដំណើរការវា។ តាមរបៀបដូចគ្នា ពាក្យបញ្ជាបន្តបន្ទាប់នីមួយៗអនុវត្តប្រតិបត្តិការរបស់ខ្លួន ដោយរង់ចាំទិន្នន័យពីពាក្យបញ្ជាមុន និងបង្កើតលទ្ធផលរបស់វាជាការបញ្ចូលនៃពាក្យបញ្ជាបន្ទាប់។ ប្រសិនបើអ្នកចង់ឱ្យពាក្យបញ្ជាបញ្ចប់ទាំងស្រុងមុនពេលចាប់ផ្តើមបន្ទាប់ អ្នកអាចប្រើវានៅលើបន្ទាត់មួយជានិមិត្តសញ្ញាបំពង់ | , និង semicolon ; . មុន​សញ្ញា​ក្បៀស​នីមួយៗ សែល​នឹង​ឈប់ ហើយ​រង់ចាំ​ពាក្យ​បញ្ជា​មុន​ទាំងអស់​ដែល​រួម​បញ្ចូល​ក្នុង​បំពង់​ដើម្បី​បញ្ចប់​ការ​ប្រតិបត្តិ។

ស្ថានភាពចាកចេញ (តម្លៃប៊ូលីនបានត្រលប់មកវិញបន្ទាប់ពីការបញ្ចប់កម្មវិធី) ពីបំពង់គឺដូចគ្នានឹងស្ថានភាពចាកចេញដែលត្រឡប់ដោយពាក្យបញ្ជាចុងក្រោយនៅក្នុងបំពង់។ អ្នកអាចដាក់និមិត្តសញ្ញា "! សែលរង់ចាំពាក្យបញ្ជាបំពង់ទាំងអស់ដើម្បីបញ្ចប់ មុនពេលកំណត់តម្លៃត្រឡប់មកវិញ។

5.5.3 តម្រង

ឧទាហរណ៍ចុងក្រោយខាងលើ (ជាមួយពាក្យបញ្ជា grep) អាច​ត្រូវ​បាន​ប្រើ​ដើម្បី​បង្ហាញ​ពី​គោល​គំនិត​សំខាន់​មួយ​ទៀត​គឺ​កម្មវិធី​តម្រង។ តម្រងគឺជាពាក្យបញ្ជា (ឬកម្មវិធី) ដែលយកស្ទ្រីមទិន្នន័យបញ្ចូល អនុវត្តការបំប្លែងមួយចំនួននៅលើវា ហើយបញ្ចេញលទ្ធផលទៅជាលទ្ធផលស្តង់ដារ (ពីកន្លែងដែលវាអាចត្រូវបានបញ្ជូនបន្តទៅកន្លែងផ្សេងតាមការសំរេចចិត្តរបស់អ្នកប្រើ)។ ពាក្យបញ្ជាតម្រងរួមបញ្ចូលពាក្យបញ្ជាដែលបានរៀបរាប់ខាងលើរួចហើយ ឆ្មា, ច្រើន, តិច, wc, cmp, diff, ក៏ដូចជាពាក្យបញ្ជាខាងក្រោម។

តារាង 5.1 ។តម្រងពាក្យបញ្ជា

ក្រុម

ការពិពណ៌នាសង្ខេប

grep, fgrep, egreg

កំពុងស្វែងរក ឯកសារបញ្ចូលឬទិន្នន័យពីស្តង់ដារ បន្ទាត់បញ្ចូលដែលមានលំនាំដែលបានបញ្ជាក់ និងបញ្ចេញពួកវាទៅជាលទ្ធផលស្តង់ដារ

ជំនួសតួអក្សរដែលកើតឡើងទាំងអស់នៅក្នុងស្ទ្រីមបញ្ចូលដែលបានរាយក្នុងបញ្ជីដែលបានផ្តល់ឱ្យជាមួយនឹងតួអក្សរដែលត្រូវគ្នាពីបញ្ជីដែលបានបញ្ជាក់ទីពីរ

com

ប្រៀបធៀប​ឯកសារ​ពីរ​តាម​បន្ទាត់ ហើយ​លទ្ធផល 3 ជួរ​ឈរ​ទៅ​នឹង​លទ្ធផល​ស្តង់ដារ៖ មួយ​មាន​បន្ទាត់​ដែល​កើត​ឡើង​តែ​ក្នុង​ឯកសារ 1 ទីពីរ​មាន​បន្ទាត់​ដែល​កើត​ឡើង​តែ​ក្នុង​ឯកសារ​ទី 2៖ ហើយ​ទីបី​មាន​បន្ទាត់​ដែល​បង្ហាញ​ក្នុង​ឯកសារ​ទាំងពីរ។

ទម្រង់សម្រាប់ការបោះពុម្ព ឯកសារអត្ថបទឬខ្លឹមសារនៃការបញ្ចូលស្តង់ដារ

សេដ

កម្មវិធីកែខ្សែអក្សរដែលប្រើដើម្បីធ្វើការបំប្លែងមួយចំនួននៅលើស្ទ្រីមទិន្នន័យបញ្ចូល (យកចេញពីឯកសារ ឬពីការបញ្ចូលស្តង់ដារ)

តម្រងពិសេសគឺជាពាក្យបញ្ជា អាវដែល "បំបែក" ស្ទ្រីមបញ្ចូល ដឹកនាំវានៅម្ខាងទៅទិន្នផលស្តង់ដារ និងមួយទៀតទៅឯកសារ (ឈ្មោះដែលអ្នកត្រូវតែបញ្ជាក់)។ វាងាយស្រួលក្នុងការមើលឃើញថាដោយសកម្មភាពរបស់វាពាក្យបញ្ជា អាវស្រដៀងទៅនឹងប្រតិបត្តិករប្តូរទិស 1>&ឯកសារ.

សមត្ថភាពនៃតម្រងអាចត្រូវបានពង្រីកយ៉ាងខ្លាំងដោយប្រើ កន្សោមធម្មតា។អនុញ្ញាតឱ្យអ្នករៀបចំឧទាហរណ៍ ការស្វែងរកដោយប្រើគំរូផ្សេងៗ ជាញឹកញាប់ស្មុគស្មាញ។

អាចនិយាយបានច្រើនអំពីការបញ្ជូនបន្ត និងតម្រង។ ប៉ុន្តែសម្ភារៈនេះមាននៅក្នុងសៀវភៅភាគច្រើននៅលើយូនីក និងលីនុច ឧទាហរណ៍ Petersen [P1.4] និង Kelly-Bootle [P1.8] ។ ដូច្នេះហើយ យើងនឹងដាក់កម្រិតខ្លួនយើងទៅនឹងអ្វីដែលបាននិយាយ ហើយបន្តទៅការពិចារណាលើអ្វីដែលហៅថាបរិស្ថាន ឬបរិស្ថានដែលបង្កើតឡើងដោយសែល។

V. Kostromin (kos នៅ rus-linux dot net) - 5.5 ។ ការបញ្ជូនបន្ត I/O ឆានែល និងតម្រង

អ្នកធ្លាប់ស្គាល់វិធីសាស្រ្តពីរសម្រាប់ធ្វើការជាមួយលទ្ធផលនៃស្គ្រីបបន្ទាត់ពាក្យបញ្ជា៖

  • បង្ហាញទិន្នន័យលទ្ធផលនៅលើអេក្រង់។
  • បញ្ជូនបន្តលទ្ធផលទៅឯកសារ។
ពេលខ្លះអ្នកត្រូវបង្ហាញអ្វីមួយនៅលើអេក្រង់ ហើយសរសេរអ្វីមួយទៅកាន់ឯកសារ ដូច្នេះអ្នកត្រូវយល់ពីរបៀបដែលលីនុចគ្រប់គ្រងការបញ្ចូល និងទិន្នផល ដែលមានន័យថារៀនពីរបៀបបញ្ជូនលទ្ធផលនៃស្គ្រីបទៅកន្លែងដែលអ្នកត្រូវការ។ ចូរចាប់ផ្តើមដោយនិយាយអំពីអ្នកពណ៌នាឯកសារស្តង់ដារ។

ការពិពណ៌នាឯកសារស្តង់ដារ

អ្វីគ្រប់យ៉ាងនៅក្នុងលីនុចគឺជាឯកសារ រួមទាំងការបញ្ចូល និងទិន្នផល។ ប្រព័ន្ធប្រតិបត្តិការកំណត់អត្តសញ្ញាណឯកសារដោយប្រើឧបករណ៍ពិពណ៌នាឯកសារ។

ដំណើរការនីមួយៗត្រូវបានអនុញ្ញាតឱ្យមានចំណុចទាញឯកសារបើករហូតដល់ប្រាំបួន។ សែល bash រក្សាទុកចំណុចទាញបីដំបូងដែលមានលេខសម្គាល់ 0, 1 និង 2។ នេះជាអ្វីដែលពួកគេមានន័យ។

  • 0 , STDIN - ស្ទ្រីមបញ្ចូលស្តង់ដារ។
  • 1, STDOUT - ស្ទ្រីមលទ្ធផលស្តង់ដារ។
  • 2, STDERR - ស្ទ្រីមកំហុសស្តង់ដារ។
ចំណុចទាញពិសេសទាំងបីនេះគ្រប់គ្រងការបញ្ចូល និងលទ្ធផលទៅកាន់ស្គ្រីប។
អ្នក​ត្រូវ​យល់​ច្បាស់​អំពី​ការ​ផ្សាយ​តាម​ស្តង់ដារ។ ពួកគេអាចប្រៀបធៀបទៅនឹងមូលដ្ឋានគ្រឹះដែលអន្តរកម្មនៃស្គ្រីបជាមួយពិភពខាងក្រៅត្រូវបានបង្កើតឡើង។ តោះមើលព័ត៌មានលម្អិតអំពីពួកគេ។

STDIN

STDIN គឺជាស្ទ្រីមបញ្ចូលស្តង់ដាររបស់សែល។ សម្រាប់ស្ថានីយ ការបញ្ចូលស្តង់ដារគឺជាក្តារចុច។ នៅពេលដែលស្គ្រីបប្រើតួអក្សរប្តូរទិសបញ្ចូល -< , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

ពាក្យបញ្ជា bash ជាច្រើនទទួលយកការបញ្ចូលពី STDIN លុះត្រាតែបន្ទាត់ពាក្យបញ្ជាបញ្ជាក់ឯកសារដែលត្រូវយកទិន្នន័យ។ ឧទាហរណ៍នេះជាការពិតសម្រាប់ពាក្យបញ្ជាឆ្មា។

នៅពេលអ្នកបញ្ចូលពាក្យបញ្ជាឆ្មានៅប្រអប់បញ្ចូលពាក្យបញ្ជាដោយមិនបញ្ជាក់ប៉ារ៉ាម៉ែត្រណាមួយវាទទួលយកការបញ្ចូលពី STDIN ។ បន្ទាប់ពីអ្នកបញ្ចូលបន្ទាត់បន្ទាប់ ឆ្មាគ្រាន់តែបង្ហាញវានៅលើអេក្រង់។

STDOUT

STDOUT គឺជាស្ទ្រីមលទ្ធផលស្តង់ដាររបស់សែល។ តាមលំនាំដើមនេះគឺជាអេក្រង់។ ពាក្យបញ្ជា bash ភាគច្រើនបញ្ជូនទិន្នន័យទៅ STDOUT ដែលបណ្តាលឱ្យវាលេចឡើងនៅក្នុងកុងសូល។ ទិន្នន័យអាចត្រូវបានបញ្ជូនបន្តទៅឯកសារដោយបន្ថែមវាទៅមាតិការបស់វាដោយប្រើពាក្យបញ្ជា >> ។

ដូច្នេះយើងមានឯកសារទិន្នន័យដែលយើងអាចបន្ថែមទិន្នន័យបន្ថែមទៀតដោយប្រើពាក្យបញ្ជានេះ៖

Pwd >> myfile
អ្វីដែលលទ្ធផល pwd នឹងត្រូវបានបន្ថែមទៅឯកសារ myfile ប៉ុន្តែទិន្នន័យដែលមានរួចហើយនៅក្នុងវានឹងមិនទៅណាទេ។

បញ្ជូន​បន្ត​លទ្ធផល​ពាក្យ​បញ្ជា​ទៅ​ឯកសារ

រហូតមកដល់ពេលនេះល្អណាស់ ប៉ុន្តែចុះយ៉ាងណាបើអ្នកព្យាយាមធ្វើអ្វីមួយដូចតទៅនេះដោយការចូលប្រើ xfile ដែលមិនមាន នោះទាំងអស់ត្រូវបានបង្កើតឡើងដើម្បីបង្កឱ្យមានសារកំហុសដើម្បីផ្ញើទៅកាន់ myfile ។

Ls –l xfile> myfile
បន្ទាប់ពីប្រតិបត្តិពាក្យបញ្ជានេះ យើងនឹងឃើញសារកំហុសនៅលើអេក្រង់។


ព្យាយាមចូលប្រើឯកសារដែលមិនមាន

កំហុសមួយត្រូវបានបង្កើតនៅពេលព្យាយាមចូលប្រើឯកសារដែលមិនមាន ប៉ុន្តែសែលមិនបានបញ្ជូនបន្តសារកំហុសទៅកាន់ឯកសារដោយការបោះពុម្ពពួកវាទៅអេក្រង់។ ប៉ុន្តែយើងចង់ឱ្យសារកំហុសត្រូវបានបញ្ចូលក្នុងឯកសារ។ អ្វីដែលត្រូវធ្វើ? ចម្លើយគឺសាមញ្ញ - ប្រើឧបករណ៍ពណ៌នាស្តង់ដារទីបី។

STDERR

STDERR គឺជាស្ទ្រីមកំហុសស្តង់ដាររបស់សែល។ តាមលំនាំដើម ចំណុចទាញនេះចង្អុលទៅវត្ថុដូចគ្នាដែល STDOUT ចង្អុលទៅ នោះហើយជាមូលហេតុដែលយើងឃើញសារនៅលើអេក្រង់នៅពេលមានកំហុសកើតឡើង។

ដូច្នេះ ឧបមាថាយើងចង់ប្តូរទិសសារកំហុសទៅ និយាយថា ឯកសារកំណត់ហេតុ ឬកន្លែងផ្សេងទៀត ជំនួសឱ្យការបោះពុម្ពពួកវាទៅអេក្រង់។

▍ ការបញ្ជូនបន្តនៃលំហូរកំហុស

ដូចដែលអ្នកបានដឹងរួចមកហើយ ចំណុចទាញឯកសារ STDERR គឺ 2. យើងអាចប្តូរទិសកំហុសដោយដាក់ចំណុចទាញនេះមុននឹងពាក្យបញ្ជាប្តូរទិស៖

Ls -l xfile 2>myfile cat ./myfile
សារកំហុសនឹងទៅ myfile ឥឡូវនេះ។


បញ្ជូនបន្តសារកំហុសទៅឯកសារ

▍ ប្តូរទិសកំហុស និងលទ្ធផលស្ទ្រីម

នៅពេលសរសេរស្គ្រីបបន្ទាត់ពាក្យបញ្ជា អាចមានស្ថានភាពដែលអ្នកត្រូវប្តូរទិសទាំងសារកំហុស និងលទ្ធផលស្តង់ដារ។ ដើម្បីសម្រេចបាននូវចំណុចនេះ អ្នកត្រូវប្រើពាក្យបញ្ជាប្តូរទិសសម្រាប់អ្នកពណ៌នាសមរម្យ ដោយបញ្ជាក់ឯកសារដែលកំហុស និងលទ្ធផលស្តង់ដារគួរទៅ៖

Ls –l myfile xfile anotherfile 2> errorcontent 1> មាតិកាត្រឹមត្រូវ។

ការបញ្ជូនបន្តកំហុស និងលទ្ធផលស្តង់ដារ

សែលនឹងបញ្ជូនបន្តនូវអ្វីដែលពាក្យបញ្ជា ls ជាធម្មតាផ្ញើទៅ STDOUT ទៅក្នុងឯកសារមាតិកាត្រឹមត្រូវ អរគុណចំពោះ 1> ស្ថាបនា។ សារកំហុសដែលនឹងទៅ STDERR បញ្ចប់នៅក្នុងឯកសារដែលមានកំហុសដោយសារពាក្យបញ្ជា 2> បញ្ជូនបន្ត។

បើចាំបាច់ ទាំង STDERR និង STDOUT អាចត្រូវបានបញ្ជូនបន្តទៅឯកសារដូចគ្នាដោយប្រើពាក្យបញ្ជា &>៖


បញ្ជូនបន្ត STDERR និង STDOUT ទៅឯកសារដូចគ្នា។

បន្ទាប់ពីពាក្យបញ្ជាត្រូវបានប្រតិបត្តិ អ្វីដែលមានបំណងសម្រាប់ STDERR និង STDOUT បញ្ចប់នៅក្នុងឯកសារមាតិកា។

បញ្ជូនបន្តលទ្ធផលនៅក្នុងស្គ្រីប

មានវិធីសាស្រ្តពីរសម្រាប់ការបញ្ជូនបន្តលទ្ធផលនៅក្នុងស្គ្រីបបន្ទាត់ពាក្យបញ្ជា៖
  • ការបញ្ជូនបន្តបណ្តោះអាសន្ន ឬការបញ្ជូនបន្តទិសដៅលទ្ធផលបន្ទាត់តែមួយ។
  • ការបញ្ជូនបន្តជាអចិន្ត្រៃយ៍ ឬការបញ្ជូនបន្តនៃលទ្ធផលទាំងអស់ ឬផ្នែកនៃស្គ្រីប។

▍ ការបញ្ជូនបន្តលទ្ធផលបណ្តោះអាសន្ន

នៅក្នុងស្គ្រីប អ្នកអាចប្តូរទិសលទ្ធផលនៃបន្ទាត់តែមួយទៅ STDERR ។ ដើម្បីធ្វើដូចនេះគ្រាន់តែប្រើពាក្យបញ្ជាបញ្ជូនបន្តដោយបញ្ជាក់អ្នកពណ៌នា STDERR ហើយនាំមុខលេខអ្នកពណ៌នាដោយតួអក្សរ ampersand (&):

#!/bin/bash បន្ទរ "នេះជាកំហុស" >&2 បន្ទរ "នេះជាលទ្ធផលធម្មតា"
ប្រសិនបើអ្នកដំណើរការស្គ្រីប នោះបន្ទាត់ទាំងពីរនឹងបង្ហាញនៅលើអេក្រង់ ព្រោះដូចដែលអ្នកបានដឹងរួចមកហើយថា កំហុសលំនាំដើមគឺចេញនៅកន្លែងតែមួយជាមួយទិន្នន័យធម្មតា។


ការបញ្ជូនបន្តបណ្តោះអាសន្ន

ចូរដំណើរការស្គ្រីបដើម្បីឱ្យលទ្ធផល STDERR ទៅកាន់ឯកសារមួយ។

./myscript 2> myfile
ដូចដែលអ្នកអាចឃើញឥឡូវនេះទិន្នផលធម្មតាត្រូវបានផ្ញើទៅកុងសូលហើយសារកំហុសទៅឯកសារ។


សារកំហុសត្រូវបានសរសេរទៅឯកសារ

▍ ការបញ្ជូនបន្តលទ្ធផលអចិន្រ្តៃយ៍

ប្រសិនបើស្គ្រីបរបស់អ្នកត្រូវការប្តូរទិសទិន្នផលច្រើនទៅអេក្រង់ វារអាក់រអួលក្នុងការបន្ថែមពាក្យបញ្ជាដែលសមស្របទៅនឹងការហៅតាមអេកូនីមួយៗ។ ជំនួសមកវិញ អ្នកអាចកំណត់លទ្ធផលដែលត្រូវបញ្ជូនបន្តទៅចំណុចទាញជាក់លាក់មួយសម្រាប់រយៈពេលនៃស្គ្រីបដោយប្រើពាក្យបញ្ជា exec៖

#!/bin/bash exec 1>outfile echo "នេះ​គឺ​ជា​ការ​សាកល្បង​នៃ​ការ​បញ្ជូន​បន្ត​លទ្ធផល​ទាំងអស់" echo "ពី​ស្គ្រីប​សែល​ទៅ​ឯកសារ​ផ្សេង។" បន្ទរ "ដោយមិនចាំបាច់ប្តូរទិសគ្រប់បន្ទាត់"
តោះដំណើរការស្គ្រីប។


បញ្ជូនបន្តលទ្ធផលទាំងអស់ទៅឯកសារ

ប្រសិនបើអ្នកក្រឡេកមើលឯកសារដែលបានបញ្ជាក់នៅក្នុងពាក្យបញ្ជាបញ្ជូនបន្តលទ្ធផល អ្នកនឹងឃើញថាអ្វីគ្រប់យ៉ាងដែលត្រូវបានចេញដោយពាក្យបញ្ជាអេកូបានបញ្ចប់នៅក្នុងឯកសារនោះ។

ពាក្យបញ្ជា exec អាចត្រូវបានប្រើមិនត្រឹមតែនៅដើមស្គ្រីបប៉ុណ្ណោះទេប៉ុន្តែថែមទាំងនៅកន្លែងផ្សេងទៀតផងដែរ៖

#!/bin/bash exec 2>myerror echo "នេះជាការចាប់ផ្តើមនៃស្គ្រីប" echo "ឥឡូវប្តូរទិសលទ្ធផលទាំងអស់ទៅទីតាំងផ្សេង" exec 1>myfile echo "នេះគួរតែទៅកាន់ឯកសារ myfile" echo " ហើយវាគួរតែទៅ ទៅកាន់ឯកសារ myerror">&2
នេះជាអ្វីដែលអ្នកទទួលបានបន្ទាប់ពីដំណើរការស្គ្រីប និងមើលឯកសារដែលយើងប្តូរទិសលទ្ធផល។


បញ្ជូនបន្តលទ្ធផលទៅឯកសារផ្សេងៗ

ពាក្យបញ្ជា exec ដំបូងបញ្ជូនបន្តទិន្នផលពី STDERR ទៅកាន់ឯកសារ myerror ។ បន្ទាប់មកលទ្ធផលនៃពាក្យបញ្ជាអេកូជាច្រើនត្រូវបានបញ្ជូនទៅ STDOUT ហើយបោះពុម្ពទៅអេក្រង់។ ពាក្យបញ្ជា exec បណ្តាលឱ្យអ្វីដែលបញ្ចប់នៅក្នុង STDOUT ត្រូវបានបញ្ជូនទៅឯកសារ myfile ហើយទីបំផុតយើងប្រើពាក្យបញ្ជាប្តូរទិសទៅ STDERR នៅក្នុងពាក្យបញ្ជាអេកូ ដែលបណ្តាលឱ្យបន្ទាត់ដែលត្រូវគ្នាត្រូវបានសរសេរទៅ myerror ឯកសារ។

នៅពេលដែលអ្នកបានស្ទាត់ជំនាញនេះហើយ អ្នកនឹងអាចប្តូរទិសលទ្ធផលនៅកន្លែងដែលអ្នកចង់ទៅ។ ឥឡូវនេះសូមនិយាយអំពីការបញ្ជូនបន្តការបញ្ចូល។

បញ្ជូនបន្តការបញ្ចូលក្នុងស្គ្រីប

ដើម្បីប្តូរទិសការបញ្ចូល អ្នកអាចប្រើបច្ចេកទេសដូចគ្នាដែលយើងធ្លាប់ប្រើដើម្បីប្តូរទិសទិន្នផល។ ឧទាហរណ៍ ពាក្យបញ្ជា exec អនុញ្ញាតឱ្យអ្នកបង្កើតឯកសារជាប្រភពទិន្នន័យសម្រាប់ STDIN៖

Exec 0< myfile
ពាក្យបញ្ជានេះប្រាប់សែលថាប្រភពបញ្ចូលគួរតែជា myfile ជាជាង STDIN ធម្មតា។ តោះមើលការបញ្ជូនបន្តការបញ្ចូលក្នុងសកម្មភាព៖

#!/bin/bash exec 0< testfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done
នេះជាអ្វីដែលនឹងបង្ហាញនៅលើអេក្រង់បន្ទាប់ពីដំណើរការស្គ្រីប។


បញ្ចូលការបញ្ជូនបន្ត

នៅក្នុងអត្ថបទមុននេះ អ្នកបានរៀនពីរបៀបប្រើពាក្យបញ្ជាអាន ដើម្បីអានការបញ្ចូលរបស់អ្នកប្រើពីក្តារចុច។ ប្រសិនបើអ្នកប្តូរទិសការបញ្ចូលដោយធ្វើឱ្យប្រភពទិន្នន័យទៅជាឯកសារ នោះពាក្យបញ្ជាអាន នៅពេលព្យាយាមអានទិន្នន័យពី STDIN នឹងអានវាពីឯកសារ មិនមែនមកពីក្តារចុចទេ។

អ្នកគ្រប់គ្រងលីនុចខ្លះប្រើវិធីនេះដើម្បីអាន និងដំណើរការឯកសារកំណត់ហេតុ។

បង្កើតការបញ្ជូនបន្តលទ្ធផលផ្ទាល់ខ្លួនរបស់អ្នក។

តាមរយៈការបញ្ជូនបន្តការបញ្ចូល និងលទ្ធផលនៅក្នុងស្គ្រីប អ្នកមិនត្រូវបានកំណត់ចំពោះអ្នកពិពណ៌នាឯកសារស្តង់ដារទាំងបីទេ។ ដូចដែលបានរៀបរាប់ អ្នកអាចមានចំណុចទាញបើករហូតដល់ប្រាំបួន។ ប្រាំមួយដែលនៅសល់ដែលមានលេខ 3 ដល់ 8 អាចត្រូវបានប្រើដើម្បីប្តូរទិសបញ្ចូលឬទិន្នផល។ ពួកវាណាមួយអាចត្រូវបានកំណត់ទៅឯកសារមួយ ហើយប្រើជាកូដស្គ្រីប។

អ្នកអាចកំណត់ចំណុចទាញដើម្បីបញ្ចេញទិន្នន័យដោយប្រើពាក្យបញ្ជា exec៖

#!/bin/bash exec 3>myfile echo "វា​គួរ​តែ​បង្ហាញ​នៅ​លើ​អេក្រង់" echo "ហើយ​វា​គួរ​តែ​ត្រូវ​បាន​រក្សា​ទុក​ក្នុង​ឯកសារ" >&3 echo "ហើយ​វា​គួរតែ​ត្រឡប់​មក​វិញ​នៅ​លើ​អេក្រង់"
បន្ទាប់ពីដំណើរការស្គ្រីបផ្នែកនៃលទ្ធផលនឹងបង្ហាញនៅលើអេក្រង់ជាផ្នែកមួយ - នៅក្នុងឯកសារដែលមានអ្នកពណ៌នា 3 ។


បញ្ជូនបន្តលទ្ធផលដោយប្រើចំណុចទាញរបស់វា។

ការបង្កើតឯកសារពិពណ៌នាសម្រាប់ការបញ្ចូលទិន្នន័យ

អ្នកអាចប្តូរទិសការបញ្ចូលក្នុងស្គ្រីបតាមរបៀបដូចគ្នានឹងអ្នកប្តូរទិសលទ្ធផល។ រក្សាទុក STDIN នៅក្នុងចំណុចទាញមួយផ្សេងទៀត មុនពេលបញ្ជូនបន្តការបញ្ចូល។

បន្ទាប់ពីបញ្ចប់ការអានឯកសារ អ្នកអាចស្ដារ STDIN ហើយប្រើវាដូចធម្មតា៖

#!/bin/bash exec ៦<&0 exec 0< myfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done exec 0<&6 read -p "Are you done now? " answer case $answer in y) echo "Goodbye";; n) echo "Sorry, this is the end.";; esac
ចូរយើងសាកល្បងសេណារីយ៉ូ។


បញ្ចូលការបញ្ជូនបន្ត

ក្នុងឧទាហរណ៍នេះ អ្នកពិពណ៌នាឯកសារ 6 ត្រូវបានប្រើដើម្បីរក្សាទុកឯកសារយោងទៅ STDIN ។ បន្ទាប់មកការបញ្ជូនបន្តការបញ្ចូលត្រូវបានធ្វើរួច ឯកសារបានក្លាយជាប្រភពទិន្នន័យសម្រាប់ STDIN ។ ការបញ្ចូលទៅពាក្យបញ្ជាអានបន្ទាប់មកបានមកពី STDIN ដែលបានប្តូរទិស ពោលគឺពីឯកសារ។

បន្ទាប់ពីអានឯកសារ យើងកំណត់ STDIN ឡើងវិញដោយប្តូរទិសវាទៅដោះស្រាយ 6. ឥឡូវនេះ ដើម្បីពិនិត្យមើលថាអ្វីៗដំណើរការបានត្រឹមត្រូវ ស្គ្រីបសួរអ្នកប្រើប្រាស់នូវសំណួរមួយ រង់ចាំការបញ្ចូលក្តារចុច និងដំណើរការអ្វីដែលត្រូវបានបញ្ចូល។

ការបិទចំណុចទាញឯកសារ

សែលបិទចំណុចទាញឯកសារដោយស្វ័យប្រវត្តិ បន្ទាប់ពីស្គ្រីបបានបញ្ចប់។ ទោះយ៉ាងណាក៏ដោយ ក្នុងករណីខ្លះ វាចាំបាច់ក្នុងការបិទចំណុចទាញដោយដៃ មុនពេលស្គ្រីបបញ្ចប់ដំណើរការ។ ដើម្បីបិទចំណុចទាញ វាត្រូវតែបញ្ជូនបន្តទៅ &- ។ វាមើលទៅដូចនេះ៖

#!/bin/bash exec 3> myfile បន្ទរ "នេះជាបន្ទាត់សាកល្បងនៃទិន្នន័យ" >&3 exec 3>&- បន្ទរ "នេះនឹងមិនដំណើរការ" >&3
បន្ទាប់ពីដំណើរការស្គ្រីប យើងនឹងទទួលបានសារកំហុស។


ព្យាយាមចូលប្រើកម្មវិធីពិពណ៌នាឯកសារបិទ

រឿងនេះគឺថាយើងបានព្យាយាមចូលប្រើឧបករណ៍ពិពណ៌នាដែលមិនមាន។

សូមប្រយ័ត្នពេលបិទចំណុចទាញឯកសារនៅក្នុងស្គ្រីប។ ប្រសិនបើអ្នកបានផ្ញើទិន្នន័យទៅឯកសារ បន្ទាប់មកបិទចំណុចទាញ បន្ទាប់មកបើកវាម្តងទៀត សែលនឹងជំនួសឯកសារដែលមានស្រាប់ជាមួយនឹងឯកសារថ្មី។ នោះ​គឺ​អ្វី​គ្រប់​យ៉ាង​ដែល​ត្រូវ​បាន​សរសេរ​ពីមុន​ទៅ​ឯកសារ​នេះ​នឹង​ត្រូវ​បាត់បង់។

ទទួលបានព័ត៌មានអំពីចំណុចទាញបើកចំហ

ដើម្បីទទួលបានបញ្ជីចំណុចទាញទាំងអស់ដែលបើកនៅក្នុងលីនុច អ្នកអាចប្រើពាក្យបញ្ជា lsof ។ នៅលើការចែកចាយជាច្រើនដូចជា Fedora ឧបករណ៍ប្រើប្រាស់ lsof មានទីតាំងនៅ /usr/sbin ។ ពាក្យបញ្ជានេះមានប្រយោជន៍ណាស់ព្រោះវាបង្ហាញព័ត៌មានអំពីចំណុចទាញនីមួយៗដែលបើកនៅលើប្រព័ន្ធ។ នេះរួមបញ្ចូលទាំងអ្វីដែលបើកដោយដំណើរការដែលដំណើរការក្នុងផ្ទៃខាងក្រោយ និងអ្វីដែលត្រូវបានបើកដោយអ្នកប្រើប្រាស់ដែលបានចូល។

ពាក្យ​បញ្ជា​នេះ​មាន​កូនសោ​ជា​ច្រើន សូម​យើង​មើល​ពាក្យ​ដែល​សំខាន់​បំផុត។

  • -p អនុញ្ញាតឱ្យអ្នកបញ្ជាក់លេខសម្គាល់ដំណើរការ។
  • -d អនុញ្ញាតឱ្យអ្នកបញ្ជាក់ចំនួនអ្នកពណ៌នាដែលអ្នកចង់ទទួលបានព័ត៌មាន។
ដើម្បីស្វែងរក PID នៃដំណើរការបច្ចុប្បន្ន អ្នកអាចប្រើអថេរបរិស្ថានពិសេស $$ ដែលសែលសរសេរ PID បច្ចុប្បន្ន។

កុងតាក់ -a ត្រូវបានប្រើដើម្បីអនុវត្តប្រតិបត្តិការឡូជីខល AND លើលទ្ធផលដែលបានត្រឡប់មកវិញដោយប្រើកុងតាក់ពីរផ្សេងទៀត៖

Lsof -a -p $$ -d 0,1,2

បង្ហាញព័ត៌មានអំពីចំណុចទាញបើក

ប្រភេទឯកសារដែលភ្ជាប់ជាមួយ STDIN, STDOUT និង STDERR គឺ CHR (របៀបតួអក្សរ)។ ដោយសារពួកវាទាំងអស់ចង្អុលទៅស្ថានីយមួយ ឈ្មោះឯកសារត្រូវគ្នានឹងឈ្មោះឧបករណ៍ដែលបានកំណត់ទៅស្ថានីយ។ ឯកសារស្តង់ដារទាំងបីគឺអាចអានបាន និងអាចសរសេរបាន។

សូមក្រឡេកមើលការហៅពាក្យបញ្ជា lsof ពីស្គ្រីប ដែលបន្ថែមពីលើស្តង់ដារ អ្នកពណ៌នាផ្សេងទៀតត្រូវបានបើក៖

#!/bin/bash exec 3> myfile1 exec 6> myfile2 exec ៧< myfile3 lsof -a -p $$ -d 0,1,2,3,6,7
នេះជាអ្វីដែលកើតឡើងប្រសិនបើអ្នកដំណើរការស្គ្រីបនេះ។


មើលចំណុចទាញឯកសារដែលបើកដោយស្គ្រីប

ស្គ្រីបបានបើកចំណុចទាញពីរសម្រាប់លទ្ធផល (3 និង 6) និងមួយសម្រាប់បញ្ចូល (7) ។ ផ្លូវទៅកាន់ឯកសារដែលប្រើដើម្បីកំណត់រចនាសម្ព័ន្ធអ្នកពណ៌នាក៏ត្រូវបានបង្ហាញផងដែរ។

ការបង្ក្រាបទិន្នផល

ពេលខ្លះអ្នកត្រូវប្រាកដថាពាក្យបញ្ជានៅក្នុងស្គ្រីប ដែលឧទាហរណ៍ អាចត្រូវបានប្រតិបត្តិជាដំណើរការផ្ទៃខាងក្រោយ មិនបង្ហាញអ្វីនៅលើអេក្រង់ទេ។ ដើម្បីធ្វើដូច្នេះ អ្នកអាចប្តូរទិសលទ្ធផលទៅ /dev/null ។ នេះគឺជាអ្វីមួយដូចជា "ប្រហោងខ្មៅ" ។

នេះជាឧទាហរណ៍នៃវិធីទប់ស្កាត់សារកំហុស៖

Ls -al badfile anotherfile 2> /dev/null
វិធីសាស្រ្តដូចគ្នាត្រូវបានប្រើប្រសិនបើឧទាហរណ៍ អ្នកត្រូវសម្អាតឯកសារដោយមិនលុបវា៖

Cat /dev/null> myfile

លទ្ធផល

ថ្ងៃនេះអ្នកបានរៀនពីរបៀបបញ្ចូល និងទិន្នផលដំណើរការនៅក្នុងស្គ្រីបបន្ទាត់ពាក្យបញ្ជា។ ឥឡូវអ្នកដឹងពីរបៀបដោះស្រាយឯកសារពិពណ៌នា បង្កើត មើល និងបិទពួកវា ហើយដឹងអំពីការបញ្ជូនបន្តការបញ្ចូល លទ្ធផល និងកំហុស។ ទាំងអស់នេះមានសារៈសំខាន់ខ្លាំងណាស់ក្នុងការអភិវឌ្ឍន៍ស្គ្រីប bash ។

លើកក្រោយយើងនឹងនិយាយអំពីសញ្ញាលីនុច របៀបដោះស្រាយពួកវានៅក្នុងស្គ្រីប ការងារដែលបានកំណត់ពេល និងកិច្ចការផ្ទៃខាងក្រោយ។

អ្នកអានជាទីគោរព! សម្ភារៈនេះផ្តល់នូវមូលដ្ឋានគ្រឹះនៃការធ្វើការជាមួយការបញ្ចូល ទិន្នផល និងស្ទ្រីមកំហុស។ យើងប្រាកដថាក្នុងចំនោមអ្នកមានអ្នកជំនាញដែលអាចប្រាប់អ្នកអំពីអ្វីៗទាំងអស់នេះបានមកជាមួយបទពិសោធន៍តែប៉ុណ្ណោះ។ បើអញ្ចឹង យើងហុចជាន់ឱ្យអ្នក។

ការបញ្ជូនបន្តជាធម្មតាត្រូវបានសម្រេចដោយការបញ្ចូលតួអក្សរពិសេស ">"រវាងពាក្យបញ្ជា។ ជាធម្មតាវាក្យសម្ព័ន្ធមើលទៅដូចនេះ៖

ពាក្យបញ្ជា 1 > ឯកសារ 1

ប្រតិបត្តិពាក្យបញ្ជា 1 ដោយសរសេរលទ្ធផលស្តង់ដារទៅឯកសារ 1 ។

ក្រុម 1< файл1

ប្រតិបត្តិពាក្យបញ្ជា 1 ដោយប្រើឯកសារ 1 ជាប្រភពបញ្ចូល (ជំនួសឱ្យក្តារចុច) ។

ក្រុម 1< файл1 >ឯកសារ ២

រួមបញ្ចូលគ្នាពីរ កំណែមុន។. ប្រតិបត្តិពាក្យបញ្ជា 1 ជាមួយនឹងការបញ្ចូលពីឯកសារ 1 និងលទ្ធផលទៅឯកសារ 2

អ្នកដឹកជញ្ជូន

បំពង់គឺជាសមត្ថភាពរបស់កម្មវិធីជាច្រើនដើម្បីធ្វើការជាមួយគ្នា នៅពេលដែលលទ្ធផលនៃកម្មវិធីមួយទៅដោយផ្ទាល់ទៅធាតុបញ្ចូលរបស់មួយផ្សេងទៀតដោយមិនប្រើកម្រិតមធ្យម។ ឯកសារបណ្តោះអាសន្ន. វាក្យសម្ពន្ធ៖

ក្រុម១ | ក្រុម 2

ប្រតិបត្តិពាក្យបញ្ជា 1 ដោយប្រើស្ទ្រីមលទ្ធផលរបស់វាជាស្ទ្រីមបញ្ចូលនៅពេលប្រតិបត្តិពាក្យបញ្ជា 2 ដែលស្មើនឹងការប្រើការបញ្ជូនបន្តពីរនិងឯកសារបណ្តោះអាសន្ន៖

Command1> ពាក្យបញ្ជា TemporaryFile 2< ВременныйФайл rm ВременныйФайл

ឧទាហរណ៍ដ៏ល្អនៃបំពង់បញ្ជាគឺការរួមបញ្ចូលអេកូជាមួយនឹងពាក្យបញ្ជាមួយផ្សេងទៀតដើម្បីសម្រេចបាននូវអន្តរកម្មនៅក្នុងបរិស្ថានដែលមិនអន្តរកម្ម ឧទាហរណ៍៖

echo -e "ឈ្មោះអ្នកប្រើប្រាស់\nពាក្យសម្ងាត់" | ftp localhost

វាចាប់ផ្តើមម៉ាស៊ីនភ្ញៀវដែលភ្ជាប់ទៅ localhost ជា UserName ចុច Enter ហើយបន្ទាប់មកបញ្ចូលពាក្យសម្ងាត់ពាក្យសម្ងាត់។

ការបញ្ជូនបន្តទៅ/ពីអ្នកពណ៌នាឯកសារស្តង់ដារ

នៅក្នុងក្រុម សែលយូនីកដែលមានប្រភពមកពីសំបក Bourne ជំហានពីរមុនអាចត្រូវបានកែលម្អដោយបញ្ជាក់លេខ (អ្នកពណ៌នាឯកសារ) ភ្លាមៗមុនពេលតួអក្សរប្តូរទិស។ លេខ​នេះ​បង្ហាញ​ថា​ស្ទ្រីម​មួយ​ណា​ត្រូវ​បាន​ប្រើ​សម្រាប់​ការ​បញ្ជូន​បន្ត។ UNIX មានស្ទ្រីមបញ្ចូល/ទិន្នផលស្តង់ដារដូចខាងក្រោម៖

ឧទាហរណ៍៖

ពាក្យបញ្ជា 1 2 > ឯកសារ 1

នៅក្នុងសែលពាក្យបញ្ជាដែលបានមកពី C Shell យោងទៅតាមច្បាប់វាក្យសម្ព័ន្ធ ដើម្បីបង្ហាញពីចរន្តដែលការបញ្ជូនបន្តត្រូវបានអនុវត្ត អ្នកត្រូវបន្ថែមតួអក្សរ & បន្ទាប់ពីតួអក្សរប្តូរទិស។

ជាញឹកញាប់ ស្ទ្រីមកំហុសស្តង់ដារត្រូវបានផ្សំជាមួយស្ទ្រីមលទ្ធផលស្តង់ដារ ដូច្នេះកំហុស និងលទ្ធផលកម្មវិធីធម្មតាអាចត្រូវបានដោះស្រាយជាមួយគ្នា។ ឧទាហរណ៍៖

ស្វែងរក / -name .profile> results.txt 2>&1

នឹងព្យាយាមស្វែងរកឯកសារទាំងអស់ដែលមានឈ្មោះ .profile ។ ប្រសិនបើអ្នកដំណើរការពាក្យបញ្ជានេះដោយគ្មានការបញ្ជូនបន្ត វានឹងដឹកនាំលទ្ធផលស្វែងរកទៅកាន់ និងសារកំហុស (ឧទាហរណ៍ អំពីសិទ្ធិចូលប្រើមិនគ្រប់គ្រាន់នៅពេលព្យាយាមស្វែងរកក្នុងថតដែលបានការពារ) ទៅ . តាមលំនាំដើម តួនាទីទាំងនេះត្រូវបានអនុវត្តដោយកុងសូល។ ប្រសិនបើលទ្ធផលស្តង់ដារត្រូវបានដឹកនាំទៅឯកសារលទ្ធផល នោះកំហុសនឹងនៅតែត្រូវបានបញ្ជូនទៅកុងសូល។ ដើម្បីធានាថាទាំងកំហុស និងលទ្ធផលស្វែងរកត្រូវបានផ្ញើទៅកាន់ឯកសារ results.txt នោះ កំហុសស្តង់ដារ និងស្ទ្រីមលទ្ធផលត្រូវបានបញ្ចូលគ្នាដោយប្រើ 2>&1 .

ការសរសេរ 2>&1 ពីមុន > នឹងមិនដំណើរការទេព្រោះនៅពេលដែលអ្នកបកប្រែអាន 2>&1 វាមិនទាន់ដឹងពីកន្លែងដែលស្ទ្រីមទិន្នផលស្តង់ដារត្រូវបានបញ្ជូនបន្តទេ ដូច្នេះកំហុស និងស្ទ្រីមលទ្ធផលនឹងមិនត្រូវបានបញ្ចូលចូលគ្នាទេ។

ប្រសិនបើលទ្ធផលរួមបញ្ចូលគ្នាគឺត្រូវដាក់បំពង់ទៅការបញ្ចូលនៃកម្មវិធីផ្សេងទៀត នោះលំដាប់ 2>&1 ត្រូវតែនៅពីមុខសញ្ញាបញ្ជូន។ ឧទាហរណ៍៖

ស្វែងរក / -name .profile 2>&1 | តិច

ទម្រង់ពាក្យបញ្ជាសាមញ្ញ៖

ពាក្យបញ្ជា> ឯកសារ 2> & 1

មើលទៅដូចនេះ៖

ពាក្យបញ្ជា &> ឯកសារ

ពាក្យបញ្ជា> & ឯកសារ

ខ្សែសង្វាក់ដឹកជញ្ជូន

ការបញ្ជូនបន្ត និងពាក្យបញ្ជាបំពង់អាចត្រូវបានដាក់ច្រវាក់ជាមួយគ្នាដើម្បីបង្កើតពាក្យបញ្ជាស្មុគស្មាញបន្ថែមទៀត ឧទាហរណ៍៖

ls | grep ".sh" | តម្រៀប>បញ្ជី

ទទួលបានបញ្ជីមាតិកានៃថតបច្ចុប្បន្ន ដែលត្រូវបានត្រង ដោយបន្សល់ទុកតែបន្ទាត់ដែលមាន ".sh"បន្ទាប់មកបញ្ជីដែលបានត្រងនេះត្រូវបានតម្រៀបតាមវេជ្ជបញ្ជា ហើយលទ្ធផលចុងក្រោយត្រូវបានដាក់ចូលទៅក្នុងឯកសារមួយ។ បញ្ជី. សំណង់ប្រភេទនេះត្រូវបានរកឃើញជាញឹកញាប់នៅក្នុងស្គ្រីបសែលយូនីក។

ប្តូរទិសទៅម្ជុលច្រើន។

ពាក្យបញ្ជាស្តង់ដារអាចប្តូរទិសលទ្ធផលពាក្យបញ្ជាទៅកន្លែងជាច្រើនក្នុងពេលតែមួយ។ ឧទាហរណ៍៖

Ls -lrt | ឯកសារ 1

ដឹកនាំលទ្ធផលស្តង់ដារនៃពាក្យបញ្ជា ls -lrt(បញ្ជីឯកសារ) ទាំងនៅក្នុងកុងសូល និងក្នុង ឯកសារ១.

បញ្ជូនបន្តជាមួយផ្នែកបន្ថែម

IN សែលពាក្យបញ្ជាអ្នកអាចប្តូរទិសទៅឯកសារបន្ថែមនៅចុងបញ្ចប់។ ក្នុងករណីនេះព័ត៌មានដែលរក្សាទុកក្នុងឯកសារនឹងមិនត្រូវបានលុបទេ ប៉ុន្តែទាំងអស់។ ព័ត៌មានថ្មី។នឹងត្រូវបានបន្ថែមទៅចុងបញ្ចប់នៃឯកសារនេះ។ វាក្យសម្ពន្ធ៖

Command1>> file1

ឯកសារដែលបានបង្កប់

សែលមួយចំនួន និងសូម្បីតែភាសាដែលបានអនុវត្ត (PHP) Perl អនុញ្ញាតឱ្យវាក្យសម្ព័ន្ធនៃឯកសារដែលភ្ជាប់មកជាមួយ (សូមមើលវាក្យសម្ព័ន្ធ Heredoc) ដែលអនុញ្ញាតឱ្យអ្នកដឹកនាំចរន្តបញ្ចូលពីឯកសារកម្មវិធីដោយខ្លួនឯង ឧទាហរណ៍៖ cat « EOF Any អត្ថបទត្រូវបានដាក់នៅទីនេះ រួមទាំង តួអក្សរពិសេស EOF

ហត្ថលេខាចុងក្រោយនៃចុងបញ្ចប់នៃឯកសារដែលបានបង្កប់ EOF (តម្លៃតាមអំពើចិត្តអាចត្រូវបានប្រើ ប៉ុន្តែ EOF ត្រូវបានគេប្រើជាញឹកញាប់ - យោងតាមអត្ថន័យ) ត្រូវតែចាប់ផ្តើមនៅដើមបន្ទាត់។