/dev/null คืออะไรและจะใช้งานอย่างไร

What Is Dev Null How Use It



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

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







ทำไมคุณถึงต้องการทิ้งบางสิ่งลงในความว่างเปล่า? มาดูกันว่า /dev/null คืออะไรและใช้งานอย่างไร



ข้อกำหนดเบื้องต้น

ก่อนเจาะลึกการใช้งาน /dev/null เราจะต้องเข้าใจ . ให้ชัดเจนก่อน stdout และ stderr กระแสข้อมูล. ตรวจสอบสิ่งนี้ คำแนะนำเชิงลึกเกี่ยวกับ stdin , stderr , และ stdout .



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





ตัวอย่างเช่น คำสั่งต่อไปนี้จะพิมพ์สตริงภายในเครื่องหมายอัญประกาศคู่ ที่นี่เอาต์พุตจะถูกเก็บไว้ใน stdout .

$โยนออกสวัสดีชาวโลก



คำสั่งถัดไปจะแสดงสถานะการออกของคำสั่งที่เรียกใช้ก่อนหน้านี้

$โยนออก $?

เนื่องจากคำสั่งก่อนหน้านี้ทำงานสำเร็จ สถานะการออกจะเป็น 0 มิฉะนั้น สถานะการออกจะแตกต่างออกไป จะเกิดอะไรขึ้นเมื่อคุณพยายามเรียกใช้คำสั่งที่ไม่ถูกต้อง

$ adfadsf
$โยนออก $?

ตอนนี้ เราต้องรู้เกี่ยวกับ file descriptor ในระบบนิเวศ UNIX ค่าเหล่านี้เป็นค่าจำนวนเต็มที่กำหนดให้กับไฟล์ ทั้งคู่ stdout (ตัวอธิบายไฟล์ = 1) และ stderr (file descriptor = 2) มี file descriptor เฉพาะ โดยใช้ file descriptor (1 และ 2 ในสถานการณ์นี้) เราสามารถเปลี่ยนเส้นทาง stdout และ stderr ไปยังไฟล์อื่นๆ

สำหรับผู้เริ่มต้น ตัวอย่างต่อไปนี้จะเปลี่ยนเส้นทาง stdout ของคำสั่ง echo ไปยังไฟล์ข้อความ ในที่นี้ เราไม่ได้ระบุตัวอธิบายไฟล์ หากไม่ระบุ bash จะใช้ stdout โดยค่าเริ่มต้น.

$โยนออกสวัสดีชาวโลก>log.txt

คำสั่งต่อไปนี้จะเปลี่ยนเส้นทาง stderr ไปยังไฟล์ข้อความ

$asdfadsa2>error.txt

ใช้ /dev/null

กำลังเปลี่ยนเส้นทางเอาต์พุตไปที่ /dev/null

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

$กริป -NSสวัสดี/sys/

อย่างไรก็ตาม มันจะสร้างข้อผิดพลาดมากมายเนื่องจากไม่มีสิทธิ์รูท grep ไม่สามารถเข้าถึงไฟล์จำนวนหนึ่งได้ ในกรณีนี้จะส่งผลให้ Permission ถูกปฏิเสธข้อผิดพลาด ตอนนี้ การใช้การเปลี่ยนเส้นทาง เราจะได้ผลลัพธ์ที่ชัดเจนขึ้น

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

ผลลัพธ์ดูดีขึ้นมากใช่ไหม? ไม่มีอะไร! ในกรณีนี้ grep ไม่มีสิทธิ์เข้าถึงไฟล์จำนวนมากและไฟล์ที่เข้าถึงได้จะไม่มีสตริงสวัสดี

ในตัวอย่างต่อไปนี้ เราจะทำการ ping Google

$ปิงGoogle com

อย่างไรก็ตาม เราไม่ต้องการเห็นผลลัพธ์ ping ที่ประสบความสำเร็จทั้งหมด เราต้องการเน้นเฉพาะข้อผิดพลาดเมื่อ ping ไม่สามารถเข้าถึง Google ได้ เราจะทำอย่างนั้นได้อย่างไร?

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

ที่นี่เนื้อหาของ stdout ถูกทิ้งไปที่ /dev/null เหลือแต่ข้อผิดพลาดเท่านั้น

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

ในบางสถานการณ์ ผลลัพธ์อาจไม่มีประโยชน์เลย การใช้การเปลี่ยนเส้นทาง เราสามารถดัมพ์เอาต์พุตทั้งหมดลงในช่องว่าง

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

มาทำลายคำสั่งนี้กันสักหน่อย อันดับแรก เรากำลังทิ้งทั้งหมด stdout ถึง /dev/null. จากนั้นในส่วนที่สองเรากำลังบอกให้ bash ส่ง stderr ถึง stdout . ในตัวอย่างนี้ ไม่มีอะไรจะแสดงผล อย่างไรก็ตาม หากคุณสับสน คุณสามารถตรวจสอบว่าคำสั่งทำงานสำเร็จหรือไม่

$โยนออก $?

ค่าคือ 2 เนื่องจากคำสั่งสร้างข้อผิดพลาดจำนวนมาก

หากคุณมักจะลืม file descriptor ของ stdout และ stderr คำสั่งต่อไปนี้จะทำงานได้ดี เป็นรูปแบบทั่วไปของคำสั่งก่อนหน้า ทั้งคู่ stdout และ stderr จะถูกเปลี่ยนเส้นทางไปที่ /dev/null

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

ตัวอย่างอื่นๆ

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

$dd ถ้า=<big_file> ของ=/dev/โมฆะสถานะ=ความคืบหน้าbs=1Miflag=โดยตรง

ที่นี่ฉันใช้ Ubuntu 18.04.4 ISO เป็นไฟล์ขนาดใหญ่

ในทำนองเดียวกัน คุณสามารถทดสอบความเร็วในการดาวน์โหลดของการเชื่อมต่ออินเทอร์เน็ตของคุณได้

$wget -หรือ /dev/โมฆะ<big_file_link>

ความคิดสุดท้าย

หวังว่าคุณจะเข้าใจอย่างชัดเจนว่าไฟล์ /dev/null นี้คืออะไร เป็นอุปกรณ์พิเศษที่หากเขียนลงไป ให้ทิ้ง และหากอ่านแล้ว จะอ่านค่าเป็นโมฆะ ศักยภาพที่แท้จริงของคุณสมบัติที่น่าสนใจนี้อยู่ในสคริปต์ทุบตีที่น่าสนใจ

คุณสนใจสคริปต์ทุบตีหรือไม่? เช็คเอาท์ คู่มือเริ่มต้นสำหรับการเขียนสคริปต์ทุบตี .

สนุก!