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

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

ตารางต่อไปนี้อธิบายตัวดำเนินการเปลี่ยนเส้นทางอินพุตและเอาต์พุตสตรีมของคำสั่ง

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

ตามค่าเริ่มต้น อินพุตคำสั่ง (หมายเลขอ้างอิง STDIN) จะถูกส่งจากแป้นพิมพ์ไปยังตัวแปลคำสั่ง Cmd.exe จากนั้น Cmd.exe จะส่งเอาต์พุตคำสั่ง (หมายเลขอ้างอิง STDOUT) ไปยังหน้าต่างพร้อมท์คำสั่ง

ตารางต่อไปนี้แสดงคำอธิบายที่มีอยู่

ตัวเลข 0 ถึง 9 แสดงถึงคำอธิบาย 10 ตัวแรก ตัวแปลคำสั่ง Cmd.exe ใช้เพื่อเรียกใช้โปรแกรม และเปลี่ยนเส้นทางใด ๆ ของหมายเลขอ้างอิง 10 หากต้องการระบุหมายเลขอ้างอิงที่ต้องการ ให้ป้อนหมายเลขก่อนตัวดำเนินการเปลี่ยนเส้นทาง หากไม่ได้กำหนดหมายเลขอ้างอิง ดังนั้นตามค่าเริ่มต้นตัวดำเนินการเปลี่ยนเส้นทางอินพุต "<» будет ноль (0), а оператором перенаправления вывода «>" จะเป็นหนึ่ง (1) หลังจากเข้าโอเปอเรเตอร์แล้ว”<» или «>“จำเป็นต้องระบุตำแหน่งที่จะอ่านและตำแหน่งที่จะเขียนข้อมูล คุณสามารถระบุชื่อไฟล์หรือคำอธิบายที่มีอยู่ได้

หากต้องการระบุการเปลี่ยนเส้นทางไปยังจุดจับที่มีอยู่ ให้ใช้เครื่องหมายแอมเพอร์แซนด์ (&) ตามด้วยหมายเลขของจุดจับที่ต้องการ (เช่น & หมายเลขอ้างอิง- ตัวอย่างเช่น หากต้องการเปลี่ยนทิศทางหมายเลขอ้างอิง 2 (STDERR) ไปยังหมายเลขอ้างอิง 1 (STDOUT) ให้ป้อน:

คำอธิบายที่ซ้ำกัน

ตัวดำเนินการเปลี่ยนเส้นทาง "&" ทำซ้ำเอาต์พุตหรืออินพุตจากหมายเลขอ้างอิงที่ระบุหนึ่งไปยังหมายเลขอ้างอิงที่ระบุอื่น ตัวอย่างเช่น หากต้องการส่งเอาต์พุตของคำสั่ง dir ไปยัง File.txt และส่งเอาต์พุตข้อผิดพลาดไปที่ File.txt ให้พิมพ์:

dir>c:\file.txt 2>&1

เมื่อทำซ้ำคำอธิบาย คุณลักษณะดั้งเดิมทั้งหมดจะถูกคัดลอก

ตัวอย่างเช่น หากหมายเลขอ้างอิงเป็นแบบเขียนอย่างเดียว รายการซ้ำทั้งหมดจะเป็นแบบเขียนเท่านั้น คุณไม่สามารถทำซ้ำหมายเลขอ้างอิงแบบอ่านอย่างเดียวลงในหมายเลขอ้างอิงแบบเขียนอย่างเดียวได้<)

การเปลี่ยนเส้นทางอินพุตคำสั่ง (<». Например, для ввода команды sort из файла List.txt введите:

หากต้องการเปลี่ยนเส้นทางคำสั่งแป้นพิมพ์ตัวเลขไปยังไฟล์หรืออุปกรณ์ ให้ใช้ปุ่ม "

เรียงลำดับ

เนื้อหาของ File.txt จะปรากฏบนบรรทัดคำสั่งเป็นรายการตามลำดับตัวอักษร<» открывает заданное имя файла с доступом только для чтения. Поэтому с его помощью нельзя записывать в файл. Например, при запуске программы с оператором <&2 все попытки прочитать дескриптор 0 ни к чему не приведут, так как изначально он был открыт с доступом только для записи.

โอเปอเรเตอร์ "

  • บันทึก<».

หมายเลขอ้างอิง 0 เป็นค่าเริ่มต้นสำหรับตัวดำเนินการเปลี่ยนเส้นทางอินพุต "

เอาต์พุตคำสั่งเปลี่ยนเส้นทาง (>)

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

หากต้องการเปลี่ยนเส้นทางเอาต์พุตของคำสั่งจากหน้าต่างพร้อมรับคำสั่งไปยังไฟล์หรืออุปกรณ์ ให้ใช้ตัวดำเนินการ ">" โอเปอเรเตอร์นี้ใช้กับคำสั่งส่วนใหญ่ ตัวอย่างเช่น หากต้องการเปลี่ยนทิศทางเอาต์พุตของคำสั่ง dir ไปยังไฟล์ Dirlist.txt ให้ป้อน:

dir>dirlist.txt หากไม่มีไฟล์ Dirlist.txt ตัวแปลคำสั่ง Cmd.exe จะสร้างมันขึ้นมา หากมีไฟล์อยู่ Cmd.exe จะแทนที่ข้อมูลในไฟล์ด้วยข้อมูลที่ได้รับจากคำสั่ง.

ผบ เพื่อรันคำสั่งดัมพ์การกำหนดเส้นทาง netsh

จากนั้นส่งผลการทำงานไปที่ Route.cfg ให้ป้อน:

ดัมพ์การกำหนดเส้นทาง netsh > c:\route.cfg<&0 все попытки записать дескриптор 1 ни к чему не приведут, так как изначально дескриптор 0 был открыт с доступом только для чтения.

ตัวดำเนินการ ">" เปิดไฟล์ที่ระบุด้วยการเข้าถึงแบบเขียนอย่างเดียว ดังนั้นจึงไม่สามารถอ่านไฟล์ได้โดยใช้โอเปอเรเตอร์นี้ ตัวอย่างเช่น เมื่อรันโปรแกรมด้วยตัวดำเนินการเปลี่ยนเส้นทาง

  • บันทึก.

หมายเลขอ้างอิง 1 เป็นค่าเริ่มต้นสำหรับตัวดำเนินการเปลี่ยนเส้นทางเอาต์พุต ">"<&» для перенаправления ввода и дублирования

การใช้โอเปอเรเตอร์ "

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

ตัวอย่างเช่น หากต้องการอ่าน File.txt ลงในตัวอธิบายอินพุต 0 (STDIN) ให้ป้อน:

หากต้องการเปลี่ยนเส้นทางคำสั่งแป้นพิมพ์ตัวเลขไปยังไฟล์หรืออุปกรณ์ ให้ใช้ปุ่ม "< file.txt

หากต้องการเปิดไฟล์ File.txt ให้จัดเรียงเนื้อหา จากนั้นส่งไปที่หน้าต่างพร้อมรับคำสั่ง (STDOUT) ให้พิมพ์:

หากต้องการค้นหา File.txt และหมายเลขอ้างอิง 1 (STDOUT) และหมายเลขอ้างอิง 2 (STDERR) ไปยัง Search.txt ให้ป้อน:<&1

หากต้องการทำซ้ำ descriptor 3 ที่ผู้ใช้กำหนดเป็นอินพุตไปยัง descriptor 0 (STDIN) ให้ป้อน:

การใช้ตัวดำเนินการ ">&" เพื่อเปลี่ยนเส้นทางอินพุตและทำซ้ำ

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

หากต้องการทำซ้ำ descriptor 3 ที่ผู้ใช้กำหนดลงใน descriptor 1 ให้ป้อน:


หากต้องการเปลี่ยนทิศทางเอาต์พุตทั้งหมด รวมถึงเอาต์พุต descriptor 2 (STDERR) ให้ใช้คำสั่ง ไอพีคอนฟิกเข้าสู่หมายเลขอ้างอิง 1 (STDOUT) จากนั้นเปลี่ยนทิศทางเอาต์พุตไปที่ Output.log ให้ป้อน:


ipconfig.exe >>output.log 2>&1

การใช้ตัวดำเนินการ ">>" เพื่อผนวกเอาต์พุต

หากต้องการเพิ่มเอาต์พุตของคำสั่งต่อท้ายไฟล์โดยไม่สูญเสียข้อมูลที่เก็บไว้ในนั้น ให้ใช้อักขระที่มากกว่าสองเท่า (>>) ตัวอย่างเช่น คำสั่งต่อไปนี้จะเพิ่มรายการไดเร็กทอรีที่สร้างโดยคำสั่ง หากไม่มีไฟล์ Dirlist.txt ตัวแปลคำสั่ง Cmd.exe จะสร้างมันขึ้นมา หากมีไฟล์อยู่ Cmd.exe จะแทนที่ข้อมูลในไฟล์ด้วยข้อมูลที่ได้รับจากคำสั่งไปยังไฟล์ Dirlist.txt:


dir>>dirlist.txt

เพื่อเพิ่มเอาต์พุตคำสั่ง เน็ตสแตทที่ท้ายไฟล์ Tcpinfo.txt ให้ป้อน:


netstat >> tcpinfo.txt

บางครั้งการเขียนแบบนี้จะสะดวกกว่า:

ตั้งค่า OutFile="%~n0.html"> %OutFile% ECHO ^ >> %OutFile% เอคโค่ ^ >> %OutFile% เอคโค่ ^ หน้าดีที่สุด^>> %OutFile% เอคโค่ ^>> %OutFile% เอคโค่ ^ >> %OutFile% ECHO สวัสดีชาวโลก >> %OutFile% ECHO ^>> %OutFile% เอคโค่ ^

การใช้โอเปอเรเตอร์ช่องสัญญาณ (|)

ตัวดำเนินการไปป์เส้นแนวตั้ง (|) รับเอาต์พุตของคำสั่งหนึ่งคำสั่ง (STDOUT เริ่มต้น) และนำไปยังอินพุตของคำสั่งอื่น (STDIN เริ่มต้น) ตัวอย่างเช่น คำสั่งต่อไปนี้จะเรียงลำดับไดเร็กทอรี:

ในตัวอย่างนี้ ทั้งสองคำสั่งจะทำงานพร้อมกัน แต่คำสั่ง เรียงลำดับหยุดชั่วคราวจนกว่าจะได้รับเอาต์พุตคำสั่ง หากไม่มีไฟล์ Dirlist.txt ตัวแปลคำสั่ง Cmd.exe จะสร้างมันขึ้นมา หากมีไฟล์อยู่ Cmd.exe จะแทนที่ข้อมูลในไฟล์ด้วยข้อมูลที่ได้รับจากคำสั่ง- ทีม เรียงลำดับใช้เอาต์พุตคำสั่ง หากไม่มีไฟล์ Dirlist.txt ตัวแปลคำสั่ง Cmd.exe จะสร้างมันขึ้นมา หากมีไฟล์อยู่ Cmd.exe จะแทนที่ข้อมูลในไฟล์ด้วยข้อมูลที่ได้รับจากคำสั่งเป็นอินพุตแล้วส่งเอาต์พุตไปยัง descriptor 1 (STDOUT)

การรวมคำสั่งกับตัวดำเนินการเปลี่ยนเส้นทาง

ด้วยการรวมคำสั่งตัวกรองเข้ากับคำสั่งและชื่อไฟล์อื่นๆ คุณจะสามารถสร้างคำสั่งแบบกำหนดเองได้ ตัวอย่างเช่น หากต้องการบันทึกชื่อไฟล์ที่มีสตริง "LOG" ให้ใช้คำสั่งต่อไปนี้:

ผบ. /b | ค้นหา "LOG" > loglist.txt

เอาต์พุตคำสั่ง หากไม่มีไฟล์ Dirlist.txt ตัวแปลคำสั่ง Cmd.exe จะสร้างมันขึ้นมา หากมีไฟล์อยู่ Cmd.exe จะแทนที่ข้อมูลในไฟล์ด้วยข้อมูลที่ได้รับจากคำสั่งส่งไปยังคำสั่งกรอง หา- ชื่อไฟล์ที่มีสตริง "LOG" จะถูกจัดเก็บไว้ในไฟล์ Loglist.txt เป็นรายการ (เช่น NetshConfig.log, Logdat.svd และ Mylog.bat)

เมื่อใช้มากกว่าหนึ่งตัวกรองในคำสั่งเดียว จะต้องแยกตัวกรองเหล่านั้นโดยใช้ไปป์ (|) ตัวอย่างเช่น คำสั่งต่อไปนี้ค้นหาแต่ละไดเร็กทอรีบนไดรฟ์ C เพื่อหาไฟล์ที่มีสตริง “Log” ในชื่อ และแสดงทีละหน้า:

dir c:\ /s /b | ค้นหา "LOG" | มากกว่า

การมีอยู่ของไปป์ (|) จะบอก cmd.exe ว่าควรส่งเอาต์พุตของคำสั่ง DIR ไปยังคำสั่ง filter หา- คำสั่ง find จะเลือกเฉพาะชื่อไฟล์ที่มีสตริง "LOG" คำสั่ง more จะแสดงชื่อไฟล์ที่ได้รับจากคำสั่ง หาโดยหยุดชั่วคราวหลังจากแต่ละหน้าจอเต็มแล้ว สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งตัวกรอง โปรดดูที่

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

ตารางต่อไปนี้อธิบายตัวดำเนินการเปลี่ยนเส้นทางอินพุตและเอาต์พุตสตรีมของคำสั่ง

ตัวดำเนินการเปลี่ยนเส้นทาง

คำอธิบาย

เขียนเอาต์พุตของคำสั่งแทนบรรทัดคำสั่งไปยังไฟล์หรืออุปกรณ์ เช่น เครื่องพิมพ์

อ่านสตรีมอินพุตคำสั่งจากไฟล์แทนที่จะอ่านจากคีย์บอร์ด

ผนวกเอาต์พุตคำสั่งต่อท้ายไฟล์โดยไม่ต้องลบข้อมูลที่มีอยู่ออกจากไฟล์

อ่านเอาต์พุตของคำอธิบายหนึ่งเป็นอินพุตไปยังคำอธิบายอื่น

อ่านอินพุตของหมายเลขอ้างอิงหนึ่งเป็นเอาต์พุตของหมายเลขอ้างอิงอื่น

อ่านเอาต์พุตของคำสั่งหนึ่งและเขียนลงในอินพุตของคำสั่งอื่น ขั้นตอนนี้เรียกว่าการแชนเนล

ตามค่าเริ่มต้น อินพุตคำสั่ง (หมายเลขอ้างอิง STDIN) จะถูกส่งจากแป้นพิมพ์ไปยังตัวแปลคำสั่ง Cmd.exe จากนั้น Cmd.exe จะส่งเอาต์พุตคำสั่ง (หมายเลขอ้างอิง STDOUT) ไปยังหน้าต่างพร้อมท์คำสั่ง

ตารางต่อไปนี้แสดงคำอธิบายที่มีอยู่

ตัวเลข 0 ถึง 9 แสดงถึงคำอธิบาย 10 ตัวแรก ตัวแปลคำสั่ง Cmd.exe ใช้เพื่อเรียกใช้โปรแกรมและเปลี่ยนเส้นทางหมายเลขอ้างอิง 10 ตัวใด ๆ หากต้องการระบุหมายเลขอ้างอิงที่ต้องการ ให้ป้อนหมายเลขก่อนตัวดำเนินการเปลี่ยนเส้นทาง หากไม่ได้กำหนดหมายเลขอ้างอิง ดังนั้นตามค่าเริ่มต้นตัวดำเนินการเปลี่ยนเส้นทางอินพุต "<» будет ноль (0), а оператором перенаправления вывода «>" จะเป็นหนึ่ง (1) หลังจากเข้าโอเปอเรเตอร์แล้ว”<» или «>“จำเป็นต้องระบุตำแหน่งที่จะอ่านและตำแหน่งที่จะเขียนข้อมูล คุณสามารถระบุชื่อไฟล์หรือคำอธิบายที่มีอยู่ได้

หากต้องการระบุการเปลี่ยนเส้นทางไปยังจุดจับที่มีอยู่ ให้ใช้เครื่องหมายแอมเพอร์แซนด์ (&) ตามด้วยหมายเลขของจุดจับที่ต้องการ (เช่น & หมายเลขอ้างอิง- ตัวอย่างเช่น หากต้องการเปลี่ยนทิศทางหมายเลขอ้างอิง 2 (STDERR) ไปยังหมายเลขอ้างอิง 1 (STDOUT) ให้ป้อน:

คำอธิบายที่ซ้ำกัน

ตัวดำเนินการเปลี่ยนเส้นทาง "&" ทำซ้ำเอาต์พุตหรืออินพุตจากหมายเลขอ้างอิงที่ระบุหนึ่งไปยังหมายเลขอ้างอิงที่ระบุอื่น เช่น ส่งออกคำสั่ง หากไม่มีไฟล์ Dirlist.txt ตัวแปลคำสั่ง Cmd.exe จะสร้างมันขึ้นมา หากมีไฟล์อยู่ Cmd.exe จะแทนที่ข้อมูลในไฟล์ด้วยข้อมูลที่ได้รับจากคำสั่งไปที่ File.txt และส่งเอาต์พุตข้อผิดพลาดไปที่ File.txt ให้ป้อน:

dir>c:\file.txt 2>&1

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

ตัวอย่างเช่น หากหมายเลขอ้างอิงเป็นแบบเขียนอย่างเดียว รายการซ้ำทั้งหมดจะเป็นแบบเขียนเท่านั้น คุณไม่สามารถทำซ้ำหมายเลขอ้างอิงแบบอ่านอย่างเดียวลงในหมายเลขอ้างอิงแบบเขียนอย่างเดียวได้<)

หากต้องการเปลี่ยนเส้นทางอินพุตแป้นพิมพ์ตัวเลขไปยังไฟล์หรืออุปกรณ์ ให้ใช้ปุ่ม "<». Например, для ввода команды เรียงลำดับจากไฟล์ List.txt ให้ป้อน:

หากต้องการเปลี่ยนเส้นทางคำสั่งแป้นพิมพ์ตัวเลขไปยังไฟล์หรืออุปกรณ์ ให้ใช้ปุ่ม "

เรียงลำดับ

เนื้อหาของ File.txt จะปรากฏบนบรรทัดคำสั่งเป็นรายการตามลำดับตัวอักษร<» открывает заданное имя файла с доступом только для чтения. Поэтому с его помощью нельзя записывать в файл. Например, при запуске программы с оператором <&2 все попытки прочитать дескриптор 0 ни к чему не приведут, так как изначально он был открыт с доступом только для записи.

โอเปอเรเตอร์ "

  • บันทึก<».

หมายเลขอ้างอิง 0 เป็นค่าเริ่มต้นสำหรับตัวดำเนินการเปลี่ยนเส้นทางอินพุต "

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

หากต้องการเปลี่ยนเส้นทางเอาต์พุตของคำสั่งจากหน้าต่างพร้อมรับคำสั่งไปยังไฟล์หรืออุปกรณ์ ให้ใช้ตัวดำเนินการ ">" โอเปอเรเตอร์นี้ใช้กับคำสั่งส่วนใหญ่ ตัวอย่างเช่น เมื่อต้องการเปลี่ยนเส้นทางเอาต์พุตคำสั่ง หากไม่มีไฟล์ Dirlist.txt ตัวแปลคำสั่ง Cmd.exe จะสร้างมันขึ้นมา หากมีไฟล์อยู่ Cmd.exe จะแทนที่ข้อมูลในไฟล์ด้วยข้อมูลที่ได้รับจากคำสั่งในไฟล์ Dirlist.txt ให้ป้อน:

dir>dirlist.txt

หากไม่มีไฟล์ Dirlist.txt ตัวแปลคำสั่ง Cmd.exe จะสร้างมันขึ้นมา หากมีไฟล์อยู่ Cmd.exe จะแทนที่ข้อมูลในไฟล์ด้วยข้อมูลที่ได้รับจากคำสั่ง หากไม่มีไฟล์ Dirlist.txt ตัวแปลคำสั่ง Cmd.exe จะสร้างมันขึ้นมา หากมีไฟล์อยู่ Cmd.exe จะแทนที่ข้อมูลในไฟล์ด้วยข้อมูลที่ได้รับจากคำสั่ง.

ผบ เพื่อรันคำสั่งจากนั้นส่งผลการทำงานไปที่ Route.cfg ให้ป้อน:

เพื่อรันคำสั่ง>c:\route.cfg

ตัวดำเนินการ ">" เปิดไฟล์ที่ระบุด้วยการเข้าถึงแบบเขียนอย่างเดียว ดังนั้นจึงไม่สามารถอ่านไฟล์ได้โดยใช้โอเปอเรเตอร์นี้ ตัวอย่างเช่น เมื่อรันโปรแกรมด้วยตัวดำเนินการเปลี่ยนเส้นทาง<&0 все попытки записать дескриптор 1 ни к чему не приведут, так как изначально дескриптор 0 был открыт с доступом только для чтения.

ตัวดำเนินการ ">" เปิดไฟล์ที่ระบุด้วยการเข้าถึงแบบเขียนอย่างเดียว ดังนั้นจึงไม่สามารถอ่านไฟล์ได้โดยใช้โอเปอเรเตอร์นี้ ตัวอย่างเช่น เมื่อรันโปรแกรมด้วยตัวดำเนินการเปลี่ยนเส้นทาง

  • บันทึก.

หมายเลขอ้างอิง 1 เป็นค่าเริ่มต้นสำหรับตัวดำเนินการเปลี่ยนเส้นทางเอาต์พุต ">"<&» для перенаправления ввода и дублирования

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

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

< ไฟล์.txt

หากต้องการเปิดไฟล์ File.txt ให้จัดเรียงเนื้อหาแล้วส่งไปที่หน้าต่างพร้อมรับคำสั่ง (STDOUT) ให้พิมพ์:

หากต้องการเปลี่ยนเส้นทางคำสั่งแป้นพิมพ์ตัวเลขไปยังไฟล์หรืออุปกรณ์ ให้ใช้ปุ่ม "< ไฟล์.txt

หากต้องการค้นหา File.txt และหมายเลขอ้างอิง 1 (STDOUT) และหมายเลขอ้างอิง 2 (STDERR) ไปยัง Search.txt ให้ป้อน:

หากต้องการค้นหา File.txt และหมายเลขอ้างอิง 1 (STDOUT) และหมายเลขอ้างอิง 2 (STDERR) ไปยัง Search.txt ให้ป้อน:<&1

หากต้องการทำซ้ำ descriptor 3 ที่ผู้ใช้กำหนดเป็นอินพุตไปยัง descriptor 0 (STDIN) ให้ป้อน:

การใช้ตัวดำเนินการ ">&" เพื่อเปลี่ยนเส้นทางอินพุตและทำซ้ำ

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

หากต้องการทำซ้ำ descriptor 3 ที่ผู้ใช้กำหนดลงใน descriptor 1 ให้ป้อน:

หากต้องการเปลี่ยนทิศทางเอาต์พุตทั้งหมด รวมถึงเอาต์พุต descriptor 2 (STDERR) ให้ใช้คำสั่ง ไอพีคอนฟิกเข้าสู่หมายเลขอ้างอิง 1 (STDOUT) จากนั้นเปลี่ยนทิศทางเอาต์พุตไปที่ Output.log ให้ป้อน:

ipconfig.exe >>output.log 2>&1

การใช้ตัวดำเนินการ ">>" เพื่อผนวกเอาต์พุต

หากต้องการเพิ่มเอาต์พุตของคำสั่งต่อท้ายไฟล์โดยไม่สูญเสียข้อมูลที่เก็บไว้ในนั้น ให้ใช้อักขระที่มากกว่าสองเท่า (>>) ตัวอย่างเช่น คำสั่งต่อไปนี้จะเพิ่มรายการไดเร็กทอรีที่สร้างโดยคำสั่ง หากไม่มีไฟล์ Dirlist.txt ตัวแปลคำสั่ง Cmd.exe จะสร้างมันขึ้นมา หากมีไฟล์อยู่ Cmd.exe จะแทนที่ข้อมูลในไฟล์ด้วยข้อมูลที่ได้รับจากคำสั่งไปยังไฟล์ Dirlist.txt:

dir>>dirlist.txt

เพื่อเพิ่มเอาต์พุตคำสั่ง เน็ตสแตทที่ท้ายไฟล์ Tcpinfo.txt ให้ป้อน:

netstat >> tcpinfo.txt

การใช้โอเปอเรเตอร์ช่องสัญญาณ (|)

ตัวดำเนินการไปป์เส้นแนวตั้ง (|) รับเอาต์พุตของคำสั่งหนึ่งคำสั่ง (STDOUT เริ่มต้น) และนำทางไปยังอินพุตของคำสั่งอื่น (STDIN เริ่มต้น) ตัวอย่างเช่น คำสั่งต่อไปนี้จะเรียงลำดับไดเร็กทอรี:

ผบ. | เรียงลำดับ

ในตัวอย่างนี้ ทั้งสองคำสั่งจะทำงานพร้อมกัน แต่คำสั่ง เรียงลำดับหยุดชั่วคราวจนกว่าจะได้รับเอาต์พุตคำสั่ง หากไม่มีไฟล์ Dirlist.txt ตัวแปลคำสั่ง Cmd.exe จะสร้างมันขึ้นมา หากมีไฟล์อยู่ Cmd.exe จะแทนที่ข้อมูลในไฟล์ด้วยข้อมูลที่ได้รับจากคำสั่ง- ทีม เรียงลำดับใช้เอาต์พุตคำสั่ง หากไม่มีไฟล์ Dirlist.txt ตัวแปลคำสั่ง Cmd.exe จะสร้างมันขึ้นมา หากมีไฟล์อยู่ Cmd.exe จะแทนที่ข้อมูลในไฟล์ด้วยข้อมูลที่ได้รับจากคำสั่งเป็นอินพุตแล้วส่งเอาต์พุตไปยัง descriptor 1 (STDOUT)

การรวมคำสั่งกับตัวดำเนินการเปลี่ยนเส้นทาง

ด้วยการรวมคำสั่งตัวกรองเข้ากับคำสั่งและชื่อไฟล์อื่นๆ คุณจะสามารถสร้างคำสั่งแบบกำหนดเองได้ ตัวอย่างเช่น หากต้องการบันทึกชื่อไฟล์ที่มีสตริง "LOG" ให้ใช้คำสั่งต่อไปนี้:

ผบ. /b | ค้นหา "LOG" > loglist.txt

เอาต์พุตคำสั่ง หากไม่มีไฟล์ Dirlist.txt ตัวแปลคำสั่ง Cmd.exe จะสร้างมันขึ้นมา หากมีไฟล์อยู่ Cmd.exe จะแทนที่ข้อมูลในไฟล์ด้วยข้อมูลที่ได้รับจากคำสั่งส่งไปยังคำสั่งกรอง หา- ชื่อไฟล์ที่มีสตริง "LOG" จะถูกจัดเก็บไว้ในไฟล์ Loglist.txt เป็นรายการ (เช่น NetshConfig.log, Logdat.svd และ Mylog.bat)

เมื่อใช้มากกว่าหนึ่งตัวกรองในคำสั่งเดียว จะต้องแยกตัวกรองเหล่านั้นโดยใช้ไปป์ (|) ตัวอย่างเช่น คำสั่งต่อไปนี้ค้นหาแต่ละไดเร็กทอรีบนไดรฟ์ C เพื่อหาไฟล์ที่มีสตริง “Log” ในชื่อ และแสดงทีละหน้า:

dir c:\ /s /b | ค้นหา "LOG" | มากกว่า

การมีอยู่ของไปป์ (|) บ่งชี้ถึง Cmd.exe ว่าคำสั่งส่งออก หากไม่มีไฟล์ Dirlist.txt ตัวแปลคำสั่ง Cmd.exe จะสร้างมันขึ้นมา หากมีไฟล์อยู่ Cmd.exe จะแทนที่ข้อมูลในไฟล์ด้วยข้อมูลที่ได้รับจากคำสั่งจำเป็นต้องส่งไปยังคำสั่ง filter หา- ทีม หาเลือกเฉพาะชื่อไฟล์ที่มีสตริง "LOG" ทีม มากกว่าแสดงชื่อไฟล์ที่ได้รับจากคำสั่ง หาโดยหยุดชั่วคราวหลังจากแต่ละหน้าจอเต็มแล้ว

ช่วงเวลาที่ดีผู้อ่านของฉัน!
ในบทความนี้ฉันต้องการจัดระบบความรู้ของฉันตามหลักการพื้นฐาน การทำงานของสตรีมและช่องรายการในล่ามและโดยทั่วไปใน Linux OS รวมถึงความเป็นไปได้ต่างๆ เปลี่ยนเส้นทางข้อมูล ลำธาร.
ในตอนแรก ฉันอยากจะทราบว่าล่ามทำงานร่วมกับสตรีมมาตรฐานสามสตรีม:

  1. มาตรฐาน นี้ เอาต์พุตมาตรฐานซึ่งจัดเตรียมเอาต์พุตของคำสั่ง ตัวอธิบายสตรีมคือ 1
  2. stderr นี้ กระแสข้อผิดพลาดมาตรฐานซึ่งพิมพ์คำสั่งผิดพลาด ตัวบ่งชี้คือ 2
  3. มาตรฐาน นี้ อินพุตมาตรฐานซึ่งทำหน้าที่ป้อนคำสั่งต่างๆ ตัวบ่งชี้ของมันคือ 0

ตอนนี้เรามาอธิบายด้วยคำง่ายๆ ว่าประเด็นทั้งสามนี้หมายถึงอะไร:

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

stderr- กระแสข้อผิดพลาด นี่เป็นข้อผิดพลาดเมื่อดำเนินการคำสั่งใน bash ซึ่งโดยค่าเริ่มต้นจะส่งออกไปยัง stdout นั่นคือไปยังเทอร์มินัล (อีกครั้ง เว้นแต่จะระบุเอาต์พุตไปยังตำแหน่งอื่น)

มาตรฐาน- สตรีมอินพุต พูดง่ายๆ ก็คือสิ่งที่เราป้อนจากแป้นพิมพ์ไปยังล่ามเพื่อดำเนินการคำสั่ง

โฟลว์เหล่านี้แสดงให้เห็นได้ดีมากในรูปแบบที่นำมาจาก http://rus-linux.net/:

ในภาพนี้: Stdin แสดงเป็นสีเขียว มีหมายเลขอ้างอิง 0
Stdout แสดงด้วยสีแดง มีที่จับ 1
Stderr แสดงเป็นสีน้ำเงิน มีที่จับ 2

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

ดังนั้นการเปลี่ยนเส้นทางเธรดจึงทำได้ดังนี้:

$ คำสั่ง n> ไฟล์

บรรทัดนี้แสดง: การดำเนินการคำสั่ง สั่งการและการเปลี่ยนเส้นทางการไหล (โดยที่ n= stream handle) ไปยังไฟล์ ไฟล์.เมื่อดำเนินการเปลี่ยนเส้นทางนี้ หากมีไฟล์ปลายทางอยู่ ไฟล์นั้นก็จะทำเช่นนั้น เขียนทับ- ในกรณีนี้ หากไม่ได้ระบุ n จะใช้เอาต์พุตมาตรฐานแทน

$ คำสั่ง n>> ไฟล์

คำสั่งนี้มีไวยากรณ์คล้ายกัน แต่มีการระบุสัญลักษณ์ ">>" ในที่นี้ ด้วยการเปลี่ยนเส้นทางนี้ หากมีไฟล์ปลายทางอยู่ ผลลัพธ์ของคำสั่งจะถูกผนวกเข้ากับข้อมูลที่มีอยู่

คำสั่ง $< file

ในตัวอย่างนี้คำสั่ง สั่งการถูกดำเนินการและใช้ไฟล์เป็นแหล่งอินพุต ไฟล์,แทนการป้อนข้อมูลด้วยแป้นพิมพ์

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

ค้นหา / -name .name_file > /path/to/file 2>&1

เมื่อดำเนินการคำสั่งนี้ ไฟล์จะถูกค้นหาจากรากของระบบไฟล์ด้วยชื่อ .name_fileและเปลี่ยนเส้นทางผลการค้นหา (stdout และ stderr) ไปยังไฟล์ /path/to/file- ออกแบบ > /path/to/file 2>&1เปลี่ยนเส้นทางเอาต์พุตมาตรฐานไปที่ /path/to/fileและข้อผิดพลาดในการพิมพ์ไปยังเอาต์พุตมาตรฐาน ที่กล่าวว่า: การเขียน 2>&1 ก่อนหน้า > จะไม่ทำงาน เพราะเมื่อล่ามอ่าน 2>&1 ยังไม่ทราบว่าสตรีมเอาต์พุตมาตรฐานถูกเปลี่ยนเส้นทางไปที่ใด ดังนั้นข้อผิดพลาดและสตรีมเอาต์พุตจะไม่ถูกรวมเข้าด้วยกัน

คำสั่ง $ > ไฟล์ 2>&1

คล้ายกับการเขียน:

$ คำสั่ง &> ไฟล์

$ คำสั่ง 2>&ไฟล์

หากจำเป็นต้องละเว้นเอาต์พุต ก็สามารถนำไปยังอุปกรณ์ /dev/null ได้ นี่เป็น "หลุมดำ" ประเภทหนึ่งที่รับข้อมูลจำนวนเท่าใดก็ได้และเปลี่ยนให้กลายเป็นความว่างเปล่า

ฉันคิดว่าข้อมูลที่ให้ไว้เกี่ยวกับการเปลี่ยนเส้นทางโฟลว์จะเพียงพอที่จะเข้าใจสาระสำคัญ ตอนนี้ฉันจะเล่าให้คุณฟัง การถ่ายโอนสายพานลำเลียง.

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

$command1 | คำสั่ง2

ในตัวอย่างนี้ คำสั่งจะถูกดำเนินการ คำสั่ง1สตรีมเอาต์พุตจะถูกใช้เป็นสตรีมอินพุตเมื่อดำเนินการ คำสั่ง2.

นั่นคือทั้งหมดสำหรับวันนี้ ฉันยินดีที่จะรับความคิดเห็นและข้อมูลเพิ่มเติม ขอบคุณ

ขอแสดงความนับถือ McSim!

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

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

จากบรรทัดคำสั่ง คุณลักษณะเหล่านี้จะถูกนำไปใช้ดังนี้ ในการเปลี่ยนเส้นทางข้อความที่ส่งออกโดยคำสั่งใด ๆ จากบรรทัดคำสั่งไปยังไฟล์ข้อความ คุณต้องใช้โครงสร้าง คำสั่ง > ชื่อไฟล์หากไฟล์ที่ระบุสำหรับเอาต์พุตมีอยู่แล้ว ไฟล์นั้นจะถูกเขียนทับ (เนื้อหาเก่าจะหายไป) หากไม่มีอยู่ ไฟล์นั้นจะถูกสร้างขึ้น คุณไม่สามารถสร้างไฟล์อีกครั้งได้ แต่ให้ผนวกข้อมูลที่ส่งออกด้วยคำสั่งต่อท้ายไฟล์ที่มีอยู่ เมื่อต้องการทำเช่นนี้ ต้องระบุคำสั่งการเปลี่ยนเส้นทางเอาต์พุตดังนี้: คำสั่ง >> ชื่อไฟล์- การใช้สัญลักษณ์< можно прочитать входные данные для заданной команды не с клавиатуры, а из определенного (заранее подготовленного) файла: команда < имя_файла

ตัวอย่างของการเปลี่ยนเส้นทาง I/O บนบรรทัดคำสั่ง

นี่คือตัวอย่างบางส่วนของการเปลี่ยนเส้นทาง I/O

1. ผลลัพธ์ของผลลัพธ์ คำสั่งปิงเพื่อยื่น ปิง ya.ru > ping.txt

2. เพิ่มข้อความช่วยเหลือสำหรับ คำสั่ง XCOPY ไปยังไฟล์ copy.txt: XCOPY /? >> สำเนา.txt

หากจำเป็น ข้อความแสดงข้อผิดพลาด (สตรีมข้อผิดพลาดมาตรฐาน) สามารถเปลี่ยนเส้นทางไปยังไฟล์ข้อความได้โดยใช้คำสั่ง 2> โครงสร้างชื่อไฟล์ ในกรณีนี้ เอาต์พุตมาตรฐานจะถูกพิมพ์ไปที่หน้าจอ นอกจากนี้ยังสามารถส่งออกข้อความข้อมูลและข้อความแสดงข้อผิดพลาดไปยังไฟล์เดียวกันได้ ทำได้ดังนี้: คำสั่ง > ชื่อไฟล์ 2 >&1

ตัวอย่างเช่น คำสั่งต่อไปนี้เปลี่ยนเส้นทางเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐานไปที่ copy.txt: XCOPY A:\1.txt C: > copy.txt 2>&1

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

แต่ละโปรแกรมทำงานกับข้อมูลบางประเภท: ข้อความ กราฟิก เสียง ฯลฯ ดังที่ได้ชัดเจนแล้วว่าอินเทอร์เฟซการจัดการระบบหลักใน Linux คือเทอร์มินัลซึ่งออกแบบมาเพื่อถ่ายโอนข้อมูลข้อความจากผู้ใช้ไปยังระบบและ กลับ. เนื่องจากสามารถป้อนและเอาต์พุตจากเทอร์มินัลได้เฉพาะข้อมูลข้อความเท่านั้น อินพุตและเอาต์พุตของโปรแกรมที่เกี่ยวข้องกับเทอร์มินัลจึงต้องเป็นข้อความด้วย อย่างไรก็ตามความจำเป็นในการใช้งานข้อมูลข้อความไม่ได้จำกัดความสามารถในการจัดการระบบ แต่กลับขยายความสามารถออกไป บุคคลสามารถอ่านผลลัพธ์ของโปรแกรมใด ๆ และดูว่าเกิดอะไรขึ้นในระบบและโปรแกรมต่าง ๆ กลับกลายเป็นว่าเข้ากันได้เนื่องจากใช้การแสดงข้อมูลประเภทเดียวกัน - ข้อความ

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

ขั้นแรกเรามาดูคำสั่งสองสามคำสั่งที่สามารถใช้เพื่อจัดระเบียบ I/O กันก่อน

คำสั่งเอาท์พุตไปยังอุปกรณ์เอาท์พุตมาตรฐาน

Linux จัดเตรียมคำสั่งต่างๆ เพื่อพิมพ์ข้อความไปยังเอาต์พุตมาตรฐาน:

  • echo - พิมพ์สตริงไปยังเอาต์พุตมาตรฐาน
  • printf - พิมพ์ข้อความที่จัดรูปแบบไปยังเอาต์พุตมาตรฐาน
  • ใช่ - พิมพ์ข้อความซ้ำไปยังเอาต์พุตมาตรฐาน
  • seq - พิมพ์ลำดับของตัวเลขไปยังเอาต์พุตมาตรฐาน
  • clear ล้างหน้าจอหรือหน้าต่าง

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

$ echo "คุณชื่ออะไร?\c"

คุณชื่ออะไร?$

$ คือสัญลักษณ์คำเชิญ

บรรทัดยังสามารถคำนวณค่าของตัวแปรล่ามเชลล์และแม้แต่คำสั่งอื่น ๆ ตัวอย่างเช่น คำสั่งต่อไปนี้จะบอกคุณว่าโฮมไดเร็กทอรีของผู้ใช้ปัจจุบันคืออะไร (ตัวแปรสภาพแวดล้อม $HOME) และเทอร์มินัลใดที่เขาเชื่อมต่ออยู่ (คำสั่ง tty อยู่ในเครื่องหมายคำพูดย้อนกลับ เพื่อให้ล่ามใส่เอาต์พุตในบรรทัด)

$ echo "โฮมไดเร็กทอรีของคุณคือ $HOME คุณเชื่อมต่อกับเทอร์มินัลแล้ว - `tty` "

โฮมไดเร็กตอรี่ของคุณคือ /home/knoppix คุณเชื่อมต่อกับเทอร์มินัล - /dev/tty1

เนื่องจากเครื่องหมายคำพูดคู่มีวัตถุประสงค์พิเศษในตัวแปลเชลล์ เพื่อรวมเครื่องหมายคำพูดคู่ในสตริงเอาต์พุต คุณจะต้องเลิกทำวัตถุประสงค์พิเศษโดยใช้เครื่องหมายแบ็กสแลช (\) การดำเนินการนี้จะยกเลิกการกำหนดอักขระพิเศษใดๆ

ตัวอย่างเช่น หากต้องการแสดงสตริง “/dev/tty1” คุณต้องรัน:

$echo “\”/dev/tty1\””

คำสั่งอินพุตจากอุปกรณ์อินพุตมาตรฐาน

คำสั่ง read อ่านหนึ่งบรรทัดจากอินพุตมาตรฐานและเขียนเนื้อหาไปยังตัวแปรที่ระบุ เมื่อระบุตัวแปรหลายตัว คำแรกจะถูกเขียนไปที่ตัวแรก คำที่สองจะถูกเขียนไปยังคำที่สอง ฯลฯ อันสุดท้ายประกอบด้วยบรรทัดที่เหลือ

สคริปต์ต่อไปนี้เรียกคำสั่ง read แยกต่างหากเพื่ออ่านตัวแปรแต่ละตัว


$ การทดสอบแมว
#!/bin/bash
สะท้อน “ชื่อ: \c”
อ่านชื่อ
สะท้อน “นามสกุล: \c”
อ่านนามสกุล
สะท้อน “ชื่อ=” $ชื่อ “นามสกุล=” $นามสกุล

จากนั้นในการรันสคริปต์นี้ คุณจะต้องให้สิทธิ์ในการดำเนินการกับไฟล์ทดสอบ: chmod 0755 test and run it./test.

ผลการดำเนินการ: ชื่อ: อีวาน นามสกุล: เปตรอฟ ชื่อ=อีวาน นามสกุล=เปตรอฟ

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

แต่ละโปรแกรมที่เรียกใช้จากตัวแปลคำสั่งจะได้รับสตรีม I/O แบบเปิดสามสตรีม:

อินพุตมาตรฐาน (sldin) - เอาต์พุตมาตรฐาน (sldout) - เอาต์พุตข้อผิดพลาดมาตรฐาน (stderr)

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

นอกจากนี้ แต่ละกระบวนการ (คำสั่ง สคริปต์ ฯลฯ) ที่ดำเนินการในเชลล์ล่ามจะเชื่อมโยงกับไฟล์ที่เปิดอยู่จำนวนหนึ่งซึ่งกระบวนการสามารถอ่านข้อมูลและเขียนลงในนั้นได้ แต่ละไฟล์เหล่านี้จะถูกระบุด้วยตัวเลขที่เรียกว่า file descriptor แต่สามไฟล์แรกเป็นสตรีม I/O เริ่มต้น:
ตัวอธิบายไฟล์
สตรีมอินพุตมาตรฐาน 0
เอาต์พุตมาตรฐาน 1

สตรีมข้อผิดพลาดมาตรฐาน 2

ในความเป็นจริง มีการสร้างไฟล์ที่เปิดอยู่ 12 ไฟล์ แต่ไฟล์ที่มีคำอธิบาย 0, 1 และ 2 สงวนไว้สำหรับอินพุต เอาต์พุต และข้อผิดพลาดมาตรฐาน ผู้ใช้ยังสามารถทำงานกับไฟล์ที่มีตัวอธิบายไฟล์ 3 ถึง 9 (สงวนไว้)

ไฟล์เอาต์พุตมาตรฐาน (stdout) มีหมายเลขอ้างอิง 1 เอาต์พุตกระบวนการทั้งหมดถูกเขียนลงในไฟล์นี้ ตามค่าเริ่มต้น ข้อมูลจะถูกส่งออกไปยังหน้าจอเทอร์มินัล (อุปกรณ์/dev/tty) แต่ยังสามารถเปลี่ยนเส้นทางไปยังไฟล์หรือไพพ์ไปยังกระบวนการอื่นได้

ไฟล์สตรีมข้อผิดพลาดมาตรฐาน (siderr) มีคำอธิบาย 2 ข้อความแสดงข้อผิดพลาดที่เกิดขึ้นระหว่างการดำเนินการคำสั่งจะถูกเขียนลงในไฟล์นี้ ตามค่าเริ่มต้น ข้อความแสดงข้อผิดพลาดจะถูกส่งไปที่หน้าจอเทอร์มินัล (อุปกรณ์ /dev/tty) แต่สามารถเปลี่ยนเส้นทางไปยังไฟล์ได้เช่นกัน เหตุใดจึงต้องจัดสรรไฟล์พิเศษสำหรับบันทึกข้อผิดพลาด ความจริงก็คือนี่เป็นวิธีที่สะดวกมากในการแยกข้อมูลเอาต์พุตจริงออกจากผลลัพธ์ของการทำงานของคำสั่งรวมถึงโอกาสที่ดีในการจัดระเบียบการบำรุงรักษาไฟล์บันทึกประเภทต่างๆ อย่างมีประสิทธิภาพ

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

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

กรณีพิเศษที่มีประโยชน์ของการใช้กลไกการเปลี่ยนเส้นทางเธรดคือการเปลี่ยนเส้นทางไปที่ /dev/null ซึ่งช่วยให้คุณกำจัดข้อความที่ไม่จำเป็นบนหน้าจอได้ คุณสามารถสร้างไฟล์เปล่าได้โดยใช้กลไกเดียวกัน:

% cat myfile - จะสร้างไฟล์ว่าง myfile ในไดเร็กทอรีปัจจุบัน

/dev/null เป็นไฟล์พิเศษที่เรียกว่า "เครื่องเปล่า" การเขียนสามารถทำได้สำเร็จ ไม่ว่าข้อมูลที่ "บันทึกไว้" จะมีจำนวนเท่าใดก็ตาม การอ่านจาก /dev/null เทียบเท่ากับการอ่านส่วนท้ายของไฟล์ EOF

การเปลี่ยนเส้นทางสตรีม I/Oดำเนินการคล้ายกับ DOS (อย่างแม่นยำยิ่งขึ้น DOS OS ใช้ไวยากรณ์สำหรับการเปลี่ยนเส้นทางสตรีมจาก UNIX) โดยใช้สัญลักษณ์:

- เปลี่ยนเส้นทางสตรีมเอาต์พุตมาตรฐาน
- การเปลี่ยนเส้นทางของสตรีมเอาต์พุตมาตรฐานในโหมดผนวก
- เปลี่ยนเส้นทางสตรีมอินพุตมาตรฐาน
- รับข้อมูลจากอินพุตมาตรฐานจนกระทั่งพบตัวคั่น

อย่างไรก็ตาม ไม่เหมือนกับ DOS เมื่อสร้างช่องโปรแกรมระหว่างสองกระบวนการ UNIX/Linux OS จะเปิดตัวทั้งสองกระบวนการพร้อมกันและถ่ายโอนข้อมูลผ่านบัฟเฟอร์ระบบ (โดยไม่ต้องบันทึกระหว่างกลางไปยังฮาร์ดดิสก์) ดังนั้นช่องทางซอฟต์แวร์ใน UNIX/Linux OS จึงเป็นวิธีการแลกเปลี่ยนที่มีประสิทธิภาพมาก หากบัฟเฟอร์ของระบบล้น (เช่น หากโปรแกรม ``การส่ง'' ส่งข้อมูลไปยังช่องสัญญาณเร็วกว่าที่โปรแกรม ``รับ'' สามารถประมวลผลได้) ระบบปฏิบัติการจะระงับกระบวนการที่เขียนไปยังช่องสัญญาณโดยอัตโนมัติจนกระทั่งบัฟเฟอร์ ได้รับการปลดปล่อย

ตัวดำเนินการเปลี่ยนเส้นทางที่พบบ่อยที่สุด

ลำดับที่ คำอธิบายไวยากรณ์
ไฟล์คำสั่ง 1 กำหนดทิศทางเอาต์พุตมาตรฐานไปยังไฟล์ใหม่

2 คำสั่ง 1 ไฟล์ กำหนดทิศทางเอาต์พุตมาตรฐานไปยังไฟล์ที่ระบุ

คำสั่งไฟล์ 3 กำหนดทิศทางเอาต์พุตมาตรฐานไปยังไฟล์ที่ระบุ (โหมดแนบ)

ไฟล์คำสั่ง 4 2&1 กำหนดทิศทางเอาต์พุตมาตรฐานและข้อผิดพลาดไปยังไฟล์ที่ระบุ

5 คำสั่ง 2 ไฟล์ กำหนดข้อผิดพลาดมาตรฐานไปยังไฟล์ที่ระบุ

6 คำสั่ง 2 ไฟล์ กำหนดข้อผิดพลาดมาตรฐานไปยังไฟล์ที่ระบุ (โหมดผนวก)

ไฟล์คำสั่ง 7 2&1 กำหนดทิศทางเอาต์พุตมาตรฐานและข้อผิดพลาดไปยังไฟล์ที่ระบุ (โหมดแนบ)

8 คำสั่ง file1 file2 รับอินพุตจากไฟล์แรกและส่งเอาต์พุตไปยังไฟล์ที่สอง

ไฟล์คำสั่ง 9 เป็นอินพุตมาตรฐานรับข้อมูลจากไฟล์ที่ระบุ

คำสั่งตัวคั่น 10 รับข้อมูลจากอินพุตมาตรฐานจนกระทั่งพบตัวคั่น

11 command &m รับข้อมูลจากไฟล์ที่มี descriptor m เป็นอินพุตมาตรฐาน

12 คำสั่ง &m กำหนดทิศทางเอาต์พุตมาตรฐานไปยังตัวอธิบายไฟล์ m

ตัวดำเนินการ n&m อนุญาตให้เปลี่ยนเส้นทางไฟล์ที่มี descriptor n ไปยังตำแหน่งเดียวกันกับไฟล์ที่มี descriptor m อาจมีตัวดำเนินการที่คล้ายกันหลายตัวบนบรรทัดคำสั่ง ซึ่งในกรณีนี้จะคำนวณจากซ้ายไปขวา

คำสั่ง exec และการใช้ตัวอธิบายไฟล์

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

เช่น คำสั่งเช่น

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

Exec & – ซึ่งปิดสตรีมอินพุตมาตรฐาน (ในกรณีนี้คือไฟล์) มีการใช้เทคนิคที่คล้ายกัน
ส่วนใหญ่อยู่ในสคริปต์ที่ทำงานเมื่อคุณออกจากระบบ

คำสั่ง exec เป็นตัวชี้ไปยังไฟล์ที่มี descriptor 0 (stdin) ตัวชี้นี้สามารถกู้คืนได้หลังจากที่สคริปต์ทำงานเสร็จแล้วเท่านั้น
หากสคริปต์ตั้งใจที่จะอ่านข้อมูลจากคีย์บอร์ดต่อไป คุณจะต้องบันทึก
ตัวชี้ไปยังสตรีมอินพุตก่อนหน้า ด้านล่างนี้เป็นสคริปต์สั้นๆ ที่สาธิตวิธีการดำเนินการนี้

$ แมว f_desc
#!/bin/bash
exec 3&0 0 ไฟล์
อ่านผ้าลินิน
อ่านบรรทัดที่ 2
ดำเนินการ 0&3
สะท้อน $1inel
เสียงสะท้อน $line2

คำสั่ง exec แรกจะจัดเก็บตัวชี้ไปยังอินพุตมาตรฐาน (stdin) ในตัวอธิบายไฟล์ 3
(อนุญาตให้ใช้จำนวนเต็มระหว่าง 3 ถึง 9) จากนั้นเปิดไฟล์เพื่ออ่าน คำสั่งอ่านสองคำสั่งถัดไป
อ่านข้อความสองบรรทัดจากไฟล์ คำสั่ง exec ที่สองคืนค่าตัวชี้เป็นอินพุตมาตรฐาน: ทันที
มันเชื่อมโยงกับไฟล์ stdin ไม่ใช่ไฟล์ คำสั่ง echo สุดท้ายจะแสดงเนื้อหาของบรรทัดที่อ่านบนหน้าจอ
ซึ่งถูกเก็บไว้ในตัวแปร linel และ Iine2

ผลลัพธ์ของสคริปต์:
$./f_desc
สวัสดี!
ลาก่อน!