ในทางเทคนิค "/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 แบบดิจิทัล
มีบทความเต็มรูปแบบเกี่ยวกับ 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" มากมาย
ข้อผิดพลาดเหล่านี้ทำให้เอาต์พุตยุ่งเหยิงและยากที่จะเห็นผลลัพธ์ที่คุณต้องการ เนื่องจากข้อผิดพลาด "Permission denied" เป็นส่วนหนึ่งของ stderr คุณจึงสามารถเปลี่ยนทิศทางไปที่ "/dev/null" ได้
grep -r power /sys/ 2>/dev/null
เห็นได้ชัดว่าอ่านง่ายขึ้นมาก
ในบางกรณี อาจมีประโยชน์ที่จะทำ 반대로: กรอง standard output ออก เพื่อดูเฉพาะข้อผิดพลาด
ping google.com 1>/dev/null
คุณสามารถเปลี่ยนทิศทาง 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" แทน
wget -O /dev/null https://ftp.halifax.rwth-aachen.de/ubuntu-releases/18.04/ubuntu-18.04.2-desktop-amd64.iso
สรุป
หวังว่าตัวอย่างในบทความนี้จะให้คุณแรงบันดาลใจหาวิธีใช้ "/dev/null" อย่างสร้างสรรค์ของตัวเอง
รู้จักกรณีการใช้งานที่น่าสนใจสำหรับไฟล์อุปกรณ์พิเศษนี้ไหม? ให้ความคิดเห็นด้านล่างและแบ่งปันความรู้!