กลับไปหน้าบทความ

อ่าน 4 นาที

การเปลี่ยนเส้นทาง (ทางคอมพิวเตอร์)

ใน ด้าน การ คำนวณ การเปลี่ยนเส้นทาง (redirection) เป็นรูปแบบหนึ่งของ การสื่อสารระหว่างกระบวนการ และเป็นฟังก์ชันทั่วไปของ ตัวแปลคำสั่งบรรทัดคำสั่ง ส่วนใหญ่ รวมถึง เชลล์ Unix...

การเปลี่ยนเส้นทาง (ทางคอมพิวเตอร์)

สตรีมมาตรฐานสำหรับอินพุต เอาต์พุต และข้อผิดพลาด

ใน ด้าน การคำนวณการเปลี่ยนเส้นทาง (redirection)เป็นรูปแบบหนึ่งของการสื่อสารระหว่างกระบวนการและเป็นฟังก์ชันทั่วไปของตัวแปลคำสั่งบรรทัดคำสั่ง ส่วนใหญ่ รวมถึง เชลล์ Unixต่างๆที่สามารถเปลี่ยนเส้นทางสตรีมมาตรฐานไปยังตำแหน่งที่ผู้ใช้กำหนดได้ แนวคิดของการเปลี่ยนเส้นทางนั้นค่อนข้างเก่าแก่ ย้อนกลับไปถึงระบบปฏิบัติการ (OS) รุ่นแรกๆ การอภิปรายเกี่ยวกับเป้าหมายการออกแบบสำหรับการเปลี่ยนเส้นทางสามารถพบได้ในคำอธิบาย ระบบย่อย อินพุต-เอาต์พุตของระบบปฏิบัติการMultics ในปี 1971 [ 1 ]อย่างไรก็ตาม ก่อนการเปิดตัว ระบบปฏิบัติการ UNIXพร้อมกับ " ท่อ " การเปลี่ยนเส้นทางในระบบปฏิบัติการทำได้ยากหรือแทบเป็นไปไม่ได้เลย[ 2 ]

ใน ระบบปฏิบัติการ ที่คล้าย Unixโปรแกรมจะทำการเปลี่ยนเส้นทางด้วยการเรียกใช้ระบบdup2 (2) หรืออนาล็อกstdio ที่มีความยืดหยุ่นน้อยกว่าแต่ระดับสูงกว่า ได้แก่ freopen (3)และpopen (3 ) [ 3 ]

การเปลี่ยนเส้นทางการป้อนข้อมูลมาตรฐานและการส่งข้อมูลมาตรฐาน

โดยปกติแล้ว การเปลี่ยนเส้นทางจะทำได้โดยการใส่ตัวอักษร บางตัว ระหว่างคำสั่งต่างๆ

พื้นฐาน

โดยทั่วไปไวยากรณ์ของอักขระเหล่านี้จะเป็นดังนี้ โดยใช้<เพื่อเปลี่ยนเส้นทางการป้อนข้อมูล และ>เพื่อเปลี่ยนเส้นทางการส่งออกเรียกใช้คำสั่งโดยวางผลลัพธ์ไว้ในไฟล์ file1แทนที่จะแสดงผลที่เทอร์มินัล ซึ่งเป็นปลายทางปกติสำหรับการส่งออกมาตรฐาน การทำเช่นนี้จะลบข้อมูลที่มีอยู่ทั้งหมดในไฟล์ file1 command>file1

การใช้คำสั่ง executes จะกำหนดfile1เป็นแหล่งข้อมูลเข้า แทนที่จะใช้แป้นพิมพ์ซึ่งเป็นแหล่งข้อมูลมาตรฐานทั่วไป command<file1

command<infile>outfileผสานความสามารถทั้งสองอย่างเข้าด้วยกัน: คำสั่งนี้อ่านข้อมูลจากไฟล์อินพุตและเขียนข้อมูลไปยังไฟล์เอาต์พุต

ตัวแปร

หากต้องการเพิ่มเอาต์พุตต่อท้ายไฟล์ แทนที่จะเขียนทับไฟล์เดิม>>จะใช้ตัวดำเนินการ: . command1>>file1

ในการอ่านข้อมูลจากสตรีมลิเทอรัล (ไฟล์แบบอินไลน์ที่ส่งผ่านทางอินพุตมาตรฐาน) สามารถใช้here documentโดยใช้<<ตัวดำเนินการ:

$ tr a-z A-Z << END_TEXT > one two three > uno dos tres > END_TEXT ONE TWO THREE UNO DOS TRES

ในการอ่านข้อมูลจากสตริง สามารถใช้herestringโดยใช้<<<ตัวดำเนินการ : หรือ : tra-zA-Z<<<"one two three"

$ NUMBERS = "หนึ่ง สอง สาม" $ tr a-z A-Z <<< " $NUMBERS " หนึ่ง สอง สาม

ท่อ

ชุดโปรแกรมสามโปรแกรมทำงานบนเทอร์มินัลข้อความ

สามารถเรียกใช้โปรแกรมหลายโปรแกรมพร้อมกันได้ โดยโปรแกรมหนึ่งอ่านผลลัพธ์จากอีกโปรแกรมหนึ่งโดยไม่จำเป็นต้องมีไฟล์ตัวกลางที่ชัดเจน ตัวอย่างเช่น โปรแกรมจะเรียกใช้คำสั่งcommand1โดยใช้ผลลัพธ์ของ command1 เป็นอินพุตสำหรับคำสั่ง command2 (โดยทั่วไปเรียกว่าการส่งข้อมูลผ่านท่อโดยอักขระ " " เรียกว่า "pipe") command1|command2|

โปรแกรมทั้งสองที่ดำเนินการคำสั่งอาจทำงานแบบขนานกัน โดยมีพื้นที่จัดเก็บเพียงบัฟเฟอร์การทำงาน (Linux อนุญาตให้บัฟเฟอร์แต่ละตัวมีขนาดสูงสุด 64K) บวกกับพื้นที่ทำงานที่จำเป็นสำหรับการประมวลผลคำสั่งแต่ละคำสั่ง ตัวอย่างเช่น คำสั่ง "เรียงลำดับ" ไม่สามารถสร้างเอาต์พุตใดๆ ได้จนกว่าจะอ่านระเบียนอินพุตทั้งหมดแล้ว เนื่องจากระเบียนสุดท้ายที่ได้รับอาจเป็นระเบียนแรกในลำดับที่เรียงแล้ว ระบบปฏิบัติการทดลองของดร. Alexia Massalin ที่ชื่อ Synthesisจะปรับลำดับความสำคัญของแต่ละงานตามความเต็มของบัฟเฟอร์อินพุตและเอาต์พุตขณะที่ทำงาน[ 4 ]

วิธีนี้ให้ผลลัพธ์สุดท้ายเหมือนกับการใช้การเปลี่ยนเส้นทางสองครั้งและไฟล์ชั่วคราว ดังตัวอย่าง:

$ command1 > tempfile $ command2 < tempfile $ rm tempfile 

แต่ในกรณีนี้คำสั่ง command2จะไม่เริ่มทำงานจนกว่าcommand1จะทำงานเสร็จ และจำเป็นต้องมีไฟล์ชั่วคราวขนาดใหญ่พอที่จะเก็บผลลัพธ์ระหว่างการทำงาน รวมถึงพื้นที่ทำงานที่แต่ละงานต้องการ ตัวอย่างเช่น แม้ว่า DOS จะอนุญาตให้ใช้ไวยากรณ์ "pipe" แต่ก็ใช้วิธีการที่สองนี้ ดังนั้น สมมติว่าโปรแกรมที่ใช้เวลานาน "Worker" สร้างข้อความต่างๆ ขณะทำงาน และโปรแกรมที่สอง TimeStamp คัดลอกแต่ละระเบียนจากstdinไปยังstdoutโดยมีวันที่และเวลาของระบบเมื่อได้รับระเบียนนั้นนำหน้า ลำดับเช่นนี้จะสร้างการประทับเวลาเฉพาะเมื่อ Worker ทำงานเสร็จแล้วเท่านั้น ซึ่งแสดงให้เห็นว่าไฟล์เอาต์พุตสามารถอ่านและเขียนได้เร็วเพียงใด Worker|TimeStamp>LogFile.txt

ตัวอย่างที่ดีของการใช้คำสั่งแบบ pipe คือการรวมคำสั่งกับ echoคำสั่งอื่นเพื่อให้ได้ผลลัพธ์แบบโต้ตอบในเชลล์ที่ไม่โต้ตอบ เช่น คำสั่งนี้จะเรียก ใช้โปรแกรม FTPโดยป้อนชื่อผู้ใช้กดEnterแล้วตามด้วยpassecho-e'user\npass'|ftplocalhost

ในการใช้งานทั่วไป ขั้นตอนแรกของไปป์ไลน์มักจะcatเป็นการechoอ่านจากไฟล์หรือสตริง ซึ่งมักจะสามารถแทนที่ได้ด้วยการอ้างอิงอินพุตทางอ้อมหรือสตริง hereและการใช้ cat และการส่งข้อมูลผ่านไปป์ไลน์แทนการอ้างอิงอินพุตทางอ้อมนั้นเรียกว่าการใช้ cat อย่างไร้ประโยชน์ตัวอย่างเช่น คำสั่งต่อไปนี้:

$ cat infile | command $ echo $string | command $ echo -e 'user\npass' | ftp localhost 

สามารถแทนที่ด้วย:

$ command < infile $ command <<< $string $ ftp localhost <<< $'user\npass'

เนื่องจากechoเป็นคำสั่งภายในเชลล์เป็นส่วนใหญ่ การใช้งานจึงไม่ค่อยถูกวิพากษ์วิจารณ์มากเท่ากับ cat ซึ่งเป็นคำสั่งภายนอก

การเปลี่ยนเส้นทางไปยังและจากตัวจัดการไฟล์มาตรฐาน

ในเชลล์ Unix ที่ได้มาจาก เชลล์ Bourneดั้งเดิมการกระทำสองอย่างแรกสามารถแก้ไขได้เพิ่มเติมโดยการวางตัวเลข ( ตัวระบุไฟล์ ) ไว้หน้าอักขระ ทันที ซึ่งจะส่งผลต่อสตรีมที่ใช้สำหรับการเปลี่ยนเส้นทาง[ 5 ]สตรีม I/O มาตรฐานของ Unix คือ: [ 6 ]

รับมือชื่อคำอธิบาย
0 stdinอินพุตมาตรฐาน
1 stdoutเอาต์พุตมาตรฐาน
2 stderrข้อผิดพลาดมาตรฐาน

ตัวอย่างเช่นดำเนินการคำสั่งโดยส่ง กระแส ข้อผิดพลาดมาตรฐานไปยังไฟล์ 1 command2>file1

ในเชลล์ที่พัฒนามาจากcsh ( เชลล์ภาษาซี ) ไวยากรณ์จะเพิ่ม อักขระ & (แอมเปอร์แซนด์) ต่อท้ายอักขระการเปลี่ยนเส้นทาง ทำให้ได้ผลลัพธ์ที่คล้ายคลึงกัน เหตุผลก็คือเพื่อแยกความแตกต่างระหว่างไฟล์ชื่อ '1' กับ stdout กล่าวคือในกรณีแรก stderr จะถูกเปลี่ยนเส้นทางไปยังไฟล์ชื่อ ' 1 ' และในกรณีที่สอง stderr จะถูกเปลี่ยนเส้นทางไปยัง stdout catfile2>1catfile2>&1

อีกหนึ่งความสามารถที่มีประโยชน์คือการเปลี่ยนเส้นทางแฮนเดิลไฟล์มาตรฐานหนึ่งไปยังอีกแฮนเดิลหนึ่ง รูปแบบที่นิยมที่สุดคือการรวมข้อผิดพลาดมาตรฐานเข้ากับเอาต์พุตมาตรฐานเพื่อให้สามารถประมวลผลข้อความแสดงข้อผิดพลาดพร้อมกับ (หรือสลับกับ) เอาต์พุตปกติได้ ตัวอย่างเช่น คำสั่งนี้จะพยายามค้นหาไฟล์ทั้งหมดที่มีชื่อว่า.profile หาก เรียกใช้โดยไม่เปลี่ยนเส้นทาง คำสั่งนี้จะแสดงผลลัพธ์ที่พบไปยังstdoutและข้อผิดพลาด (เช่น การขาดสิทธิ์ในการเข้าถึงไดเร็กทอรีที่ได้รับการป้องกัน) ไปยังstderrหากเอาต์พุตมาตรฐานถูกกำหนดเส้นทางไปยังไฟล์resultsข้อความแสดงข้อผิดพลาดจะปรากฏบนคอนโซล หากต้องการดูทั้งผลลัพธ์ที่พบและข้อความแสดงข้อผิดพลาดในไฟล์resultsให้รวมstderr (แฮนเดิล 2) เข้ากับstdout (แฮนเดิล 1) โดยใช้คำ สั่งนี้find/-name.profile>results2>&12>&1

ถ้าหากต้องการส่งผลลัพธ์ที่รวมกันแล้วไปยังโปรแกรมอื่น ลำดับการรวมไฟล์2>&1จะต้องอยู่ก่อนสัญลักษณ์ไปป์ ดังนี้find/-name.profile2>&1|less

รูปแบบคำสั่งที่เรียบง่ายกว่า แต่ไม่เป็นไปตามมาตรฐาน POSIX คือ (ไม่สามารถใช้งานได้ใน Bourne Shell ก่อนเวอร์ชัน 4 ซึ่งเป็นเวอร์ชันสุดท้าย หรือในเชลล์มาตรฐานDebian Almquistที่ใช้ใน Debian/Ubuntu) : หรือcommand>file2>&1command&>filecommand>&file

สามารถใช้2>&1ก่อน " >" ได้ แต่ผลลัพธ์มักจะถูกเข้าใจผิด กฎคือ การเปลี่ยนเส้นทางใดๆ จะตั้งค่าแฮนเดิลไปยังสตรีมเอาต์พุตโดยอิสระ ดังนั้น " 2>&1" จะตั้งค่าแฮนเดิล2ไปยังสิ่งใดก็ตามที่แฮนเดิล1ชี้ไป ซึ่งโดยปกติแล้วในขณะนั้นคือstdoutจากนั้น " >" จะเปลี่ยนเส้นทางแฮนเดิล1ไปยังสิ่งอื่น เช่น ไฟล์ แต่จะไม่เปลี่ยนแฮนเดิล2ซึ่งยังคงชี้ไปยัง stdout

ในตัวอย่างต่อไปนี้ เอาต์พุตมาตรฐานจะถูกเขียนลงในไฟล์แต่ข้อผิดพลาดจะถูกส่งต่อจาก stderr ไปยัง stdout หรือส่งไปยังหน้าจอ: command2>&1>file

หากต้องการเขียนทั้งข้อผิดพลาดและเอาต์พุตมาตรฐานลงในไฟล์ลำดับควรกลับกัน โดยเอาต์พุตมาตรฐานจะถูกส่งไปยังไฟล์ก่อน จากนั้น stderr จะถูกส่งต่อไปยังตัวจัดการ stdout ที่ได้เปลี่ยนให้ชี้ไปยังไฟล์แล้ว command>file2>&1

ท่อส่งแบบลูกโซ่

โทเค็นการเปลี่ยนเส้นทางและการส่งข้อมูลสามารถเชื่อมโยงเข้าด้วยกันเพื่อสร้างคำสั่งที่ซับซ้อนได้ ตัวอย่างเช่นเรียงลำดับบรรทัดของinfileตามลำดับตัวอักษร เขียนบรรทัดที่ไม่ซ้ำกันโดยมีคำนำหน้าตามจำนวนครั้งที่เกิดขึ้น เรียงลำดับผลลัพธ์ตามตัวเลข และวางผลลัพธ์สุดท้ายไว้ในoutfile [ 7 ] โครงสร้างประเภทนี้ใช้กันอย่างแพร่หลายในสคริปต์เชลล์และไฟล์แบตช์ sortinfile|uniq-c|sort-n>outfile

เปลี่ยนเส้นทางไปยังเอาต์พุตหลายรายการ

คำสั่งมาตรฐานtee สามารถเปลี่ยนเส้นทางการ ส่ง ออกของคำสั่งไปยังปลายทางหลายแห่งได้เช่น การส่งออกรายการไฟล์ไปยังทั้งเอาต์พุตมาตรฐานและไฟล์xyzls-lrt|teexyz

ดูเพิ่มเติม

แหล่งที่มา

  • Feiertag, RJ; Organick, EI (1972). "ระบบอินพุต/เอาต์พุต Multics". ACM SIGOPS Operating Systems Review . 6 (1/2): 35– 38. doi : 10.1145/850614.850622 . ISSN  0163-5980 .
  • Kernighan, Brian W.; Morgan, Samuel P. (1982). "ระบบปฏิบัติการ UNIX: แบบจำลองสำหรับการออกแบบซอฟต์แวร์" . Science . 215 (4534). American Association for the Advancement of Science: 779– 783. eISSN  0036-8075 . ISSN  1095-9203 . JSTOR  1687467 . สืบค้นเมื่อ2024-04-25 .
  • dup: ทำสำเนาตัวระบุไฟล์ที่เปิดอยู่ – เอกสารอ้างอิงส่วนต่อประสานระบบ, ข้อกำหนด UNIX เดียว , เวอร์ชัน 5 จากThe Open Group
  • คำจำกัดความของการเปลี่ยนเส้นทางโดยโครงการข้อมูลลินุกซ์ (LINFO)
  • การเปลี่ยนเส้นทางการรับส่งข้อมูล (I/O Redirection)ในโครงการเอกสาร Linux (The Linux Documentation Project)
  • การเปลี่ยนเส้นทางใน Windows
  • การสร้างกระบวนการย่อยที่มีการเปลี่ยนเส้นทางการรับและส่งข้อมูลใน Windows
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Redirection_(computing)&oldid=1220771654 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ การเปลี่ยนเส้นทาง (ทางคอมพิวเตอร์)

ใน ด้าน การ คำนวณ การเปลี่ยนเส้นทาง (redirection) เป็นรูปแบบหนึ่งของ การสื่อสารระหว่างกระบวนการ และเป็นฟังก์ชันทั่วไปของ ตัวแปลคำสั่งบรรทัดคำสั่ง ส่วนใหญ่ รวมถึง เชลล์ Unix...

การเปลี่ยนเส้นทางการป้อนข้อมูลมาตรฐานและการส่งข้อมูลมาตรฐาน

โดยปกติแล้ว การเปลี่ยนเส้นทางจะทำได้โดยการใส่ ตัวอักษร บางตัว ระหว่าง คำสั่ง ต่างๆ

พื้นฐาน

โดยทั่วไป ไวยากรณ์ ของอักขระเหล่านี้จะเป็นดังนี้ โดยใช้ เพื่อเปลี่ยนเส้นทางการส่งออกเรียกใช้ คำสั่ง โดยวางผลลัพธ์ไว้ใน ไฟล์ file1 แทนที่จะแสดงผลที่เทอร์มินัล ซึ่งเป็นปลายทางปกติสำหรับการส่งออกมาตรฐาน การทำเช่นนี้จะ ลบ ข้อมูลที่มีอยู่ทั้งหมดใน ไฟล์ file1...

ตัวแปร

หากต้องการเพิ่มเอาต์พุตต่อท้ายไฟล์ แทนที่จะเขียนทับไฟล์เดิม >> จะใช้ตัวดำเนินการ: . command1 >> file1