ในแง่เทคนิค “/dev/null” เป็นไฟล์อุปกรณ์เสมือน สำหรับโปรแกรมที่เกี่ยวข้อง โปรแกรมเหล่านี้จะถือว่าเหมือนกับไฟล์จริง ยูทิลิตีสามารถขอข้อมูลจากแหล่งที่มาประเภทนี้ได้ และระบบปฏิบัติการจะดึงข้อมูลเหล่านั้น แต่แทนที่จะอ่านจากดิสก์ ระบบปฏิบัติการจะสร้างข้อมูลนี้แบบไดนามิก ตัวอย่างของไฟล์ดังกล่าวคือ “/dev/zero”
อย่างไรก็ตาม ในกรณีนี้ คุณจะเขียนลงในไฟล์อุปกรณ์ สิ่งที่คุณเขียนถึง “/dev/null” จะถูกละทิ้ง ถูกลืม โยนลงไปในความว่างเปล่า เพื่อให้เข้าใจว่าทำไมสิ่งนี้ถึงมีประโยชน์ ก่อนอื่นคุณต้องมีความเข้าใจพื้นฐานเกี่ยวกับเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐานในระบบปฏิบัติการประเภท Linux หรือ *nix
stdout และ stder
ยูทิลิตีบรรทัดคำสั่งสามารถสร้างเอาต์พุตได้สองประเภท เอาต์พุตมาตรฐานถูกส่งไปยัง stdout ข้อผิดพลาดถูกส่งไปยัง stderr
โดยค่าเริ่มต้น stdout และ stderr จะเชื่อมโยงกับหน้าต่างเทอร์มินัล (หรือคอนโซล) ซึ่งหมายความว่าปกติทุกอย่างที่ส่งไปยัง stdout และ stderr จะแสดงบนหน้าจอของคุณ แต่ด้วยการเปลี่ยนเส้นทางเชลล์ คุณสามารถเปลี่ยนลักษณะการทำงานนี้ได้ ตัวอย่างเช่น คุณสามารถเปลี่ยนเส้นทาง stdout ไปยังไฟล์ได้ ด้วยวิธีนี้ แทนที่จะแสดงเอาต์พุตบนหน้าจอ ไฟล์จะถูกบันทึกลงในไฟล์เพื่อให้คุณอ่านในภายหลัง หรือคุณสามารถเปลี่ยนเส้นทาง stdout ไปยังอุปกรณ์จริง เช่น จอ LED หรือ LCD แบบดิจิทัล
มีบทความฉบับเต็มเกี่ยวกับไปป์และการเปลี่ยนเส้นทางหากคุณต้องการเรียนรู้เพิ่มเติม
- ด้วย
2>
คุณเปลี่ยนเส้นทางข้อความแสดงข้อผิดพลาดมาตรฐาน ตัวอย่าง:2>/dev/null
หรือ2>/home/user/error.log
. - ด้วย
1>
คุณเปลี่ยนเส้นทางเอาต์พุตมาตรฐาน - ด้วย
&>
คุณเปลี่ยนเส้นทางทั้งข้อผิดพลาดมาตรฐานและเอาต์พุตมาตรฐาน
ใช้ /dev/null เพื่อกำจัดผลลัพธ์ที่คุณไม่ต้องการ
เนื่องจากมีเอาต์พุตสองประเภท เอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐาน กรณีใช้งานครั้งแรกคือการกรองประเภทใดประเภทหนึ่งออก เข้าใจง่ายผ่านตัวอย่างที่ใช้ได้จริง สมมติว่าคุณกำลังมองหาสตริงใน “/sys” เพื่อค้นหาไฟล์ที่อ้างถึงการตั้งค่าพลังงาน
grep -r power /sys/
จะมีไฟล์จำนวนมากที่ผู้ใช้ทั่วไปที่ไม่ใช่รูทไม่สามารถอ่านได้ ซึ่งจะส่งผลให้เกิดข้อผิดพลาด "การอนุญาตถูกปฏิเสธ" มากมาย
สิ่งเหล่านี้ทำให้ผลลัพธ์ยุ่งเหยิงและทำให้มองเห็นผลลัพธ์ที่คุณต้องการได้ยากขึ้น เนื่องจากข้อผิดพลาด "การปฏิเสธการอนุญาต" เป็นส่วนหนึ่งของ stderr คุณจึงเปลี่ยนเส้นทางไปที่ "/dev/null" ได้
grep -r power /sys/ 2>/dev/null
อย่างที่คุณเห็น มันอ่านง่ายกว่ามาก
ในกรณีอื่นๆ การทำแบบย้อนกลับอาจเป็นประโยชน์:กรองเอาต์พุตมาตรฐานออกเพื่อให้คุณเห็นแต่ข้อผิดพลาดเท่านั้น
ping google.com 1>/dev/null
ภาพหน้าจอด้านบนแสดงให้เห็นว่าโดยไม่ต้องเปลี่ยนเส้นทาง ping จะแสดงเอาต์พุตปกติเมื่อสามารถเข้าถึงเครื่องปลายทางได้ ในคำสั่งที่สอง จะไม่มีสิ่งใดปรากฏขึ้นในขณะที่เครือข่ายออนไลน์ แต่ทันทีที่ยกเลิกการเชื่อมต่อ จะแสดงเฉพาะข้อความแสดงข้อผิดพลาดเท่านั้น
คุณสามารถเปลี่ยนเส้นทางทั้ง stdout และ stderr ไปยังตำแหน่งที่แตกต่างกันสองแห่ง
ping google.com 1>/dev/null 2>error.log
ในกรณีนี้ ข้อความ stdout จะไม่แสดงเลย และข้อความแสดงข้อผิดพลาดจะถูกบันทึกลงในไฟล์ “error.log”
เปลี่ยนเส้นทางเอาต์พุตทั้งหมดไปที่ /dev/null
บางครั้งการกำจัดเอาต์พุตทั้งหมดก็มีประโยชน์ มีสองวิธีในการทำเช่นนี้
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
สมมติว่าคุณต้องการดูว่าดิสก์ของคุณสามารถอ่านข้อมูลตามลำดับได้เร็วเพียงใด การทดสอบไม่แม่นยำอย่างยิ่งแต่แม่นยำเพียงพอ คุณสามารถใช้ dd
สำหรับสิ่งนี้ แต่ dd ส่งออกไปยัง stdout หรือสามารถสั่งให้เขียนไปยังไฟล์ได้ ด้วย of=/dev/null
คุณสามารถบอกให้ dd เขียนไปยังไฟล์เสมือนนี้ได้ คุณไม่จำเป็นต้องใช้การเปลี่ยนเส้นทางของเชลล์ที่นี่ด้วยซ้ำ 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”
รู้จักกรณีการใช้งานที่น่าสนใจสำหรับไฟล์อุปกรณ์พิเศษนี้หรือไม่? แสดงความคิดเห็นด้านล่างและแบ่งปันความรู้!