Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Linux

/dev/null ใน Linux คืออะไร?

/dev/null ใน Linux คืออะไร?

ในทางเทคนิค "/dev/null" เป็นไฟล์อุปกรณ์เสมือน (virtual device file) จะถูกจัดการเหมือนไฟล์จริงสำหรับโปรแกรม โปรแกรมยูทิลิตี้สามารถขอข้อมูลจากแหล่งข้อมูลประเภทนี้ และระบบปฏิบัติการจะส่งข้อมูลให้ แต่แทนที่จะอ่านจากดิสก์ ระบบปฏิบัติการจะสร้างข้อมูลนี้แบบไดนามิก ตัวอย่างของไฟล์ประเภทนี้คือ "/dev/zero"

ในกรณีนี้ คุณจะเขียนลงไฟล์อุปกรณ์ ไม่ว่าคุณจะเขียนอะไรไปที่ "/dev/null" จะถูกทิ้งทิ้ง ลืมเละ โยนเข้าไปในอантาระลึก เพื่อเข้าใจว่าทำไมสิ่งนี้ถึงมีประโยชน์ คุณต้องเข้าใจพื้นฐานของ standard output และ standard error ใน Linux หรือระบบปฏิบัติการประเภท *nix ก่อน

stdout และ stderr

โปรแกรมบรรทัดคำสั่งสามารถสร้างเอาต์พุต 2 ประเภท Standard output จะส่งไปที่ stdout ส่วนข้อผิดพลาดจะส่งไปที่ stderr

โดยค่าเริ่มต้น stdout และ stderr จะเชื่อมโยงกับหน้าต่างเทอร์มินัล (หรือคอนโซล) ของคุณ หมายความว่าสิ่งที่ส่งไปที่ stdout และ stderr จะแสดงบนหน้าจอปกติ แต่ผ่านการเปลี่ยนทิศทางของ shell (shell redirections) คุณสามารถเปลี่ยนพฤติกรรมนี้ได้ ตัวอย่างเช่น คุณสามารถเปลี่ยนทิศทาง stdout ไปยังไฟล์ วิธีนี้ แทนที่จะแสดงผลบนหน้าจอ จะถูกบันทึกลงไฟล์เพื่ออ่านภายหลัง หรือคุณสามารถเปลี่ยนทิศทาง stdout ไปยังอุปกรณ์ทางกายภาพ เช่น หน้าจอ LED หรือ LCD แบบดิจิทัล

/dev/null ใน Linux คืออะไร?

มีบทความเต็มรูปแบบเกี่ยวกับ pipes และ redirections หากคุณต้องการเรียนรู้เพิ่มเติม

  • ด้วย 2> คุณเปลี่ยนทิศทางข้อความข้อผิดพลาดมาตรฐาน ตัวอย่าง: 2>/dev/null หรือ 2>/home/user/error.log
  • ด้วย 1> คุณเปลี่ยนทิศทาง standard output
  • ด้วย &> คุณเปลี่ยนทิศทางทั้ง standard error และ standard output

ใช้ /dev/null เพื่อกำจัดเอาต์พุตที่ไม่ต้องการ

เนื่องจากมีเอาต์พุต 2 ประเภท คือ standard output และ standard error กรณีการใช้งานแรกคือการกรองเอาต์พุตประเภทใดประเภทหนึ่งออกไป เข้าใจง่ายผ่านตัวอย่างปฏิบัติ สมมติว่าคุณกำลังค้นหาสตริงใน "/sys" เพื่อหาไฟล์ที่อ้างอิงถึงการตั้งค่าพลังงาน

grep -r power /sys/

จะมีไฟล์มากมายที่ผู้ใช้ทั่วไป (non-root) ไม่สามารถอ่านได้ จะทำให้เกิดข้อผิดพลาด "Permission denied" มากมาย

/dev/null ใน Linux คืออะไร?

ข้อผิดพลาดเหล่านี้ทำให้เอาต์พุตยุ่งเหยิงและยากที่จะเห็นผลลัพธ์ที่คุณต้องการ เนื่องจากข้อผิดพลาด "Permission denied" เป็นส่วนหนึ่งของ stderr คุณจึงสามารถเปลี่ยนทิศทางไปที่ "/dev/null" ได้

grep -r power /sys/ 2>/dev/null
/dev/null ใน Linux คืออะไร?

เห็นได้ชัดว่าอ่านง่ายขึ้นมาก

ในบางกรณี อาจมีประโยชน์ที่จะทำ 반대로: กรอง standard output ออก เพื่อดูเฉพาะข้อผิดพลาด

ping google.com 1>/dev/null
/dev/null ใน Linux คืออะไร?

คุณสามารถเปลี่ยนทิศทาง stdout และ stderr ไปยังตำแหน่งที่ต่างกันได้

ping google.com 1>/dev/null 2>error.log

ในกรณีนี้ ข้อความ stdout จะไม่แสดงเลย และข้อความข้อผิดพลาดจะถูกบันทึกลงไฟล์ "error.log"

เปลี่ยนทิศทางเอาต์พุตทั้งหมดไปที่ /dev/null

บางครั้งมีประโยชน์ที่จะกำจัดเอาต์พุตทั้งหมด มี 2 วิธีในการทำ

grep -r power /sys/ >/dev/null 2>&1

สตริง >/dev/null หมายถึง "ส่ง stdout ไป /dev/null" และส่วนที่สอง 2>&1 หมายถึงส่ง stderr ไปที่ stdout ในกรณีนี้คุณต้องอ้างอิง stdout ว่า "&1" แทนที่จะเป็นแค่ "1" การเขียน "2>1" จะเพียงเปลี่ยนทิศทาง stdout ไปยังไฟล์ชื่อ "1" เท่านั้น

สิ่งสำคัญคือลำดับมีความสำคัญ หากคุณกลับลำดับพารามิเตอร์การเปลี่ยนทิศทางอย่างนี้:

grep -r power /sys/ 2>&1 >/dev/null

จะไม่ทำงานตามที่ต้องการ เพราะทันทีที่ 2>&1 ถูกตีความ stderr จะถูกส่งไป stdout และแสดงบนหน้าจอ ต่อมา stdout ถูกปิดเมื่อส่งไป "/dev/null" ผลลัพธ์สุดท้ายคือคุณจะเห็นข้อผิดพลาดบนหน้าจอแทนที่จะปิดเอาต์พุตทั้งหมด หากคุณจดลำดับที่ถูกต้องไม่ได้ มีการเปลี่ยนทิศทางที่ง่ายกว่ามาก:

grep -r power /sys/ &>/dev/null

ในกรณีนี้ &>/dev/null เทียบเท่ากับการพูดว่า "เปลี่ยนทิศทางทั้ง stdout และ stderr ไปยังตำแหน่งนี้"

ตัวอย่างอื่นๆ ที่การเปลี่ยนทิศทางไป /dev/null อาจมีประโยชน์

สมมติว่าคุณต้องการดูว่าไดรฟ์ของคุณอ่านข้อมูลลำดับ (sequential data) ได้เร็วแค่ไหน การทดสอบนี้ไม่แม่นยำมาก แต่พอเพียง คุณสามารถใช้ dd สำหรับสิ่งนี้ แต่ dd จะส่งเอาต์พุตไป stdout หรือสั่งให้เขียนไปไฟล์ ด้วย of=/dev/null คุณสามารถบอก dd ให้เขียนไปยังไฟล์เสมือนนี้ คุณไม่จำเป็นต้องใช้ shell redirections ที่นี่ if= ระบุตำแหน่งไฟล์อินพุตที่จะอ่าน of= ระบุชื่อไฟล์เอาต์พุต ที่จะเขียน

dd if=debian-disk.qcow2 of=/dev/null status=progress bs=1M iflag=direct
/dev/null ใน Linux คืออะไร?

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

wget -O /dev/null https://ftp.halifax.rwth-aachen.de/ubuntu-releases/18.04/ubuntu-18.04.2-desktop-amd64.iso

สรุป

หวังว่าตัวอย่างในบทความนี้จะให้คุณแรงบันดาลใจหาวิธีใช้ "/dev/null" อย่างสร้างสรรค์ของตัวเอง

รู้จักกรณีการใช้งานที่น่าสนใจสำหรับไฟล์อุปกรณ์พิเศษนี้ไหม? ให้ความคิดเห็นด้านล่างและแบ่งปันความรู้!