2>/dev/null ทำอะไรกันแน่?

What Exactly Does 2 Dev Null Do



ไม่ว่าคุณจะเป็นผู้ใช้ Linux ใหม่หรือโปรแกรมเมอร์ bash ที่มีประสบการณ์ มีความเป็นไปได้สูงที่คุณพบคำสั่งที่คลุมเครือ 2>/dev/null แม้ว่าคำสั่งนี้จะดูซับซ้อนในทางเทคนิค แต่จุดประสงค์ของคำสั่งนั้นง่ายมาก หมายถึงอุปกรณ์ null ที่ใช้ในการระงับเอาต์พุตของคำสั่งต่างๆ บทความนี้จะแบ่งย่อยแต่ละส่วนของคำสั่ง 2>/dev/null อธิบายวัตถุประสงค์ และดูตัวอย่างการใช้งาน

อุปกรณ์ Null – '/dev/null'

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







/dev/null เป็นอุปกรณ์ null ซึ่งเป็นอุปกรณ์เสมือนชนิดพิเศษ มีอยู่ในระบบลีนุกซ์ทุกระบบ และจุดประสงค์ของอุปกรณ์นี้คือเพื่อละทิ้งสิ่งที่ส่งไปและอ่านจุดสิ้นสุดของไฟล์ (EOF) อุปกรณ์เสมือนส่วนใหญ่จะใช้ในการอ่านข้อมูล อย่างไรก็ตาม /dev/null นั้นไม่ซ้ำกันเนื่องจากใช้เพื่อระงับข้อมูลใด ๆ ที่เขียนลงไป พูดง่ายๆ ก็คือ มันทำหน้าที่เป็นหลุมดำสำหรับข้อมูลใดๆ ที่เขียนลงในระบบปฏิบัติการ Linux



ตอนนี้เรามาดูส่วนที่เหลือของ 2 > /dev/null command



ตัวอธิบายไฟล์ - '2'

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





  • '0' สำหรับอินพุตมาตรฐาน
  • '1' สำหรับเอาต์พุตมาตรฐาน
  • '2' สำหรับข้อผิดพลาดมาตรฐาน

ข้อกำหนดทางเทคนิคสำหรับอินพุตมาตรฐาน เอาต์พุตมาตรฐาน และสตรีมข้อผิดพลาดมาตรฐานคือ stdin, stdout และ stderr ตามลำดับ

เรารู้ว่าตัวเลข '2' ในคำสั่ง '2>/dev/null' หมายถึงสตรีมข้อผิดพลาดมาตรฐาน (stderr)



ตัวดำเนินการเปลี่ยนเส้นทางไฟล์ – '>'

สัญลักษณ์ '>' เรียกว่าตัวดำเนินการเปลี่ยนเส้นทางไฟล์ จุดประสงค์คือสั่งให้สิ่งที่อยู่ทางซ้ายไปยังคำสั่งทางด้านขวา พูดง่ายๆ ก็คือ สตริงข้อมูลใดๆ ทางด้านซ้ายจะถูกนำไปทางด้านขวาของโอเปอเรเตอร์

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

$ลส -NS /dev/โมฆะ

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

ใช้ 2>/dev/null

เนื่องจากเรารู้ว่าคำสั่ง 2>/dev/null ใช้เพื่อละทิ้งข้อผิดพลาด จึงใช้ร่วมกับคำสั่งอื่นๆ เสมอ เราจะเห็นแนวทางที่คล้ายกันในตัวอย่างต่อไปนี้ คุณสามารถเปิดเทอร์มินัลได้โดยการเข้าถึงผ่านเมนูแอปพลิเคชันหรือใช้แป้นพิมพ์ลัด Ctrl + Alt + T

ในตัวอย่างแรก เราจะทำการค้นหาในไดเร็กทอรี /sys/ สำหรับสตริงสุ่ม (helloworld ในกรณีนี้) คำสั่งสำหรับการค้นหาคือ grep และอาร์กิวเมนต์จะเป็นสตริงการค้นหา ป้อนคำสั่งต่อไปนี้เพื่อค้นหาสตริงของคุณ

$กริป -NSสวัสดีชาวโลก/sys/

คำสั่งค้นหานี้ถูกผูกไว้เพื่อแสดงข้อผิดพลาดมากมาย เนื่องจากมีการใช้งานโดยไม่มีการเข้าถึงรูท เราจะส่งสตรีมข้อผิดพลาดไปที่ /dev/null โดยใช้คำสั่ง 2>/dev/null เพื่อยกเลิกข้อผิดพลาดเหล่านี้

$กริป -NSสวัสดีชาวโลก/sys/ 2> /dev/โมฆะ

เราจะเห็นได้ว่าผลลัพธ์ของคำสั่งนั้นดูเรียบร้อยและเรียบง่ายกว่าคำสั่งที่แล้วมาก เหตุผลก็คือข้อผิดพลาดถูกละทิ้งโดยใช้ 2> /dev/null และเนื่องจากคำสั่ง grep ไม่พบไฟล์ใดๆ ที่ตรงกับสตริง 'helloworld' ของเรา จึงไม่แสดงผลลัพธ์ใดๆ

เพื่อให้เข้าใจการใช้งานของ /dev/null ดีขึ้น เราจะดูตัวอย่างต่อไปนี้ของการ ping เว็บไซต์ใดๆ (ในกรณีของเรา google.com) คุณสามารถ ping google.com ได้โดยดำเนินการคำสั่งต่อไปนี้:

$ปิงGoogle com

หากเราต้องการยกเว้นการปิงที่ล้มเหลวทั้งหมด เราสามารถใช้ 2>/dev/null คำสั่ง:

$ปิงGoogle com2> /dev/โมฆะ

ในกรณีนี้ สตรีมข้อผิดพลาดมาตรฐาน (ซึ่งแสดง ping ที่ล้มเหลวไปยัง google.com) จะถูกส่งไปยังอุปกรณ์เสมือน /dev/null ที่ละทิ้ง

อย่างไรก็ตาม หากเราต้องการเห็นเฉพาะการปิงที่ล้มเหลว เราสามารถดำเนินการคำสั่งต่อไปนี้:

$ปิงGoogle com1> /dev/โมฆะ

ที่นี่ เราส่งเอาต์พุตสตรีมมาตรฐาน (stdout) ไปยังอุปกรณ์ /dev/null ที่ละทิ้ง ด้วยเหตุนี้ เราจึงเหลือเพียง ping ที่ไม่สามารถเข้าถึงเซิร์ฟเวอร์ google.com ได้ อย่างไรก็ตาม ในกรณีของเรา ไม่มีการปิงที่ล้มเหลว นอกจากนี้เรายังสามารถนำ stdout และ stderr ไปยังตำแหน่งต่างๆ ได้อีกด้วย สิ่งนี้มีประโยชน์หากเราต้องการละทิ้งเอาต์พุตและเก็บข้อผิดพลาดในบันทึกหรือในทางกลับกัน คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อเก็บ ping ที่ล้มเหลวในบันทึกข้อผิดพลาดขณะละทิ้งเอาต์พุตมาตรฐานของคำสั่ง ping:

$ปิงGoogle com1> /dev/โมฆะ2>บันทึกข้อผิดพลาด

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

$ปิงGoogle com> /dev/โมฆะ2> &1

โปรดทราบว่าลำดับของคำสั่งที่นี่มีความสำคัญมาก หลังจากรันคำสั่ง ping แล้ว '>/dev/null' จะบอกให้ระบบระงับเอาต์พุต และ '2>&1' จะนำสตรีมข้อผิดพลาดมาตรฐานไปยังเอาต์พุตมาตรฐาน ด้วยวิธีนี้ เอาต์พุตทั้งหมดของคำสั่งจะถูกยกเลิก

บทสรุป

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