การเชื่อมต่อ STDOUT และ STDIN หมายถึงอะไร


10

ฉันอ่านหนังสือมันพูดว่า:

ทุกกระบวนการมีช่องทางการสื่อสารอย่างน้อยสามช่อง: "อินพุตมาตรฐาน" (STDIN), "เอาต์พุตมาตรฐาน" (STDOUT) และ "ข้อผิดพลาดมาตรฐาน" (STDERR)

คำสั่งส่วนใหญ่ยอมรับอินพุตจาก STDIN และเขียนเอาต์พุตไปยัง STDOUT พวกเขาเขียนข้อความแสดงข้อผิดพลาดไปยัง STDERR การประชุมนี้ช่วยให้คุณสามารถใช้คำสั่งสตริงร่วมกันเช่นแบบเอกสารสำเร็จรูปเพื่อสร้างไปป์ไลน์คอมโพสิต

เปลือกตีความสัญลักษณ์<, >และ>>เป็นคำแนะนำในการเปลี่ยนเส้นทางการป้อนคำสั่งหรือการส่งออกไปยังหรือจากไฟล์

ในการเชื่อมต่อ STDOUT ของคำสั่งเดียวกับ STDIN ของอีกคำสั่งให้ใช้| สัญลักษณ์ที่รู้จักกันทั่วไปว่าเป็นไปป์

ps -ef | grep httpd

ดังนั้นโดยทั่วไปสิ่งที่กล่าวคืออินพุตมาตรฐานเป็นคำสั่งที่อนุญาตให้ผู้ใช้เขียนไฟล์ในขณะที่เอาต์พุตมาตรฐานเป็นคำสั่งที่มี bash เชลล์เขียนเอาต์พุตไปยังเชลล์และข้อผิดพลาดมาตรฐานเป็นเหมือนเอาต์พุต แต่เป็นเพียง เรียกใช้เมื่อมีข้อผิดพลาดในระบบไฟล์ จากนั้นเราไปถึงส่วนของการเชื่อมต่อ STDOUT และ STDIN และฉันก็หลงทาง

คำตอบ:


25

อินพุตมาตรฐานและเอาต์พุตมาตรฐานไม่ใช่คำสั่ง

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

+-------+     +------------------+       +------------------+     +------+
| input |     |    machine A     |       |    machine B     |     |output|
| reser ­­­|=====|<stdin     stdout>|=======|<stdin     stdout>|=====|bucket|
| voir |    |      stderr      |      |      stderr      |    |      |
+-------+     +------------------+       +------------------+     +------+
                      ||                          ||

แผนภาพด้านบนแสดงสายพานลำเลียงที่ผ่านเครื่องสองเครื่อง ข้อมูลมาจากอ่างเก็บน้ำอินพุตด้านซ้ายถูกป้อนไปยังเครื่อง A จากนั้นเอาต์พุตจะถูกลำเลียงไปยังเครื่อง B (ซึ่งเป็นอินพุต) และเอาท์พุทของเครื่อง B ถูกฝากไว้ในฝากข้อมูลด้านขวา

ในแง่ยูนิกซ์นี้เรียกว่าท่อ อุปมาคือที่ของการประปา: ท่อเชื่อมต่อเครื่อง A ไปยังเครื่อง B ไวยากรณ์ของเชลล์สำหรับไปป์ไลน์ข้างต้นคือ

<input-file.txt commandA | commandB >output-file.txt

< เปลี่ยนเส้นทางสัญลักษณ์บอกเปลือกในการเชื่อมต่อcommandA's เข้ามาตรฐานไปยังแฟ้มก่อนที่จะเปิดตัวinput-file.txt commandA(คุณสามารถเปลี่ยนเส้นทางก่อนหรือหลังชื่อคำสั่ง) >สัญลักษณ์การเปลี่ยนเส้นทางบอกให้เชลล์เชื่อมต่อcommandBเอาต์พุตมาตรฐานoutput-file.txtของ สัญลักษณ์ไพพ์ (" |") ที่อยู่ตรงกลางบอกให้เชลล์เชื่อมต่อcommandAเอาต์พุตcommandBมาตรฐานของเข้ากับอินพุตมาตรฐานของก่อนที่จะเรียกใช้งาน

คำสั่งที่สามารถมีได้มากกว่าหนึ่งเข้าและส่งออกมากกว่าหนึ่ง แต่ที่วัสดุสำหรับวันอื่น


3
ภาพช่วยได้มาก
JohnMerlino

การเปรียบเทียบที่ดี ฉันเข้าใจแนวคิดของไปป์ไลน์เป็นเวลาหลายปีแล้ว แต่ไม่มีใครเคยใช้การเปรียบเทียบแบบโรงงาน / สายพานลำเลียงซึ่งทำให้เข้าใจได้ง่าย (และชัดถ้อยชัดคำ) ขอบคุณ!
Owen Blacker

1
การเปรียบเทียบที่ยอดเยี่ยม จะไปยืมอันนี้ถ้าคุณไม่รังเกียจ
Tivie

กิลส์ผมเคยถามคำถามเกี่ยวกับการใช้ถ้อยคำของคุณที่ด้านล่าง: unix.stackexchange.com/q/96724/29146 คุณช่วยอธิบายได้ไหม
strugee

@Gilles - คุณสามารถใส่ตัวอย่างที่แสดงตัวเลือกในการกำหนดการเปลี่ยนเส้นทางก่อนหรือหลังคำสั่งได้หรือไม่? ตัวอย่างเช่นไปป์ไลน์สามารถอ่านเป็น input-file.txt> commandA หรือ input-file.txt <commandA ได้หรือไม่
แรงบันดาลใจ

6

standard input is a command that allows user to write to a file

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

standard output is a command that has the bash shell write output to the shell

โปรแกรมไม่ทราบว่าที่จริงแล้วคะแนนมาตรฐาน เมื่อคุณไพพ์ A ถึง B (ดังใน$ A | B), เมื่อ A ใส่เมล์ลงในกล่องมันจะลงท้ายด้วย B in-box B ประมวลผลอินพุตและวางเมลของตัวเองในกล่องออกซึ่งเป็นสิ่งที่คุณเห็นบนเทอร์มินัล

หากต้องการวาง metaphore ดังที่กล่าวมามาตรฐานเข้า / ออกเป็นสตรีม กล่องจดหมายหรือตัวอธิบายไฟล์เป็นปลายด้านหนึ่งของกระแส ไปป์คือการเชื่อมต่อมาตรฐานจาก A กับมาตรฐานในของ B

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.