2> / dev / null หมายถึงอะไร


คำตอบ:


347

ตัวดำเนินการ> จะเปลี่ยนเส้นทางผลลัพธ์ไปที่ไฟล์ แต่สามารถไปที่อุปกรณ์ได้ คุณสามารถใช้ >> เพื่อต่อท้าย

หากคุณไม่ได้ระบุตัวเลขระบบจะถือว่าสตรีมเอาต์พุตมาตรฐาน แต่คุณสามารถเปลี่ยนเส้นทางข้อผิดพลาดได้

> fileเปลี่ยนเส้นทาง stdout ไปยังไฟล์
1> fileเปลี่ยนเส้นทาง stdout ไปยังไฟล์
2> fileเปลี่ยนเส้นทาง stderr ไปยังไฟล์
&> fileเปลี่ยนเส้นทาง stdout และ stderr ไปยังไฟล์

/dev/nullเป็นอุปกรณ์ว่างเปล่าที่จะรับอินพุตใด ๆ ที่คุณต้องการและโยนมันทิ้ง มันสามารถใช้ในการปราบปรามการส่งออกใด ๆ


6
จะมีความแตกต่างระหว่าง> /dev/null 2>&1และ&> /dev/null
อเล็กซานเดมิลส์

13
ในทางปฏิบัติในวันนี้ฉันไม่คิดว่า2>&1จะมีไวยากรณ์ที่เก่ากว่าดังนั้น&>จะไม่ได้ทำงานหลายปีที่ผ่านมา แต่ทั้งสองจะเทียบเท่ากัน
Warren Hill

28

ในระยะสั้นมันเปลี่ยนเส้นทางstderr(fd 2) ไปที่หลุมดำ (ยกเลิกการส่งออกของคำสั่ง)

กรณีการใช้งานทั่วไปบางอย่างสำหรับการเปลี่ยนเส้นทาง:

command > /dev/null 2>&1 &

ทำงานcommandในพื้นหลังทิ้งstdoutและstderr

command >> /path/to/log 2>&1 &

รันcommandและต่อท้าย stdout และ stderr ไปยังไฟล์บันทึก

ใน Bash 4+ รูปแบบที่สั้นกว่า (แต่อ่านง่ายกว่า) นั้นใช้งานได้

command &>> /path/to/log

3
มีเหตุผลที่ดีที่จะใช้> /dev/null 2>&1แทน&> /dev/nullหรือไม่
Craig McQueen

7
@CraigMcQueen &>เป็นของใหม่ใน Bash 4 อดีตเป็นเพียงวิธีดั้งเดิมฉันคุ้นเคยกับมันมาก (จำได้ง่าย)
เทอร์รี่วัง

@CraigMcQueen ตามความคิดเห็นในคำตอบนี้ , &> /dev/nullอาจไม่ทำงานในบางส่วน แต่เปลือกหอย> / dev / null 2> & 1 จะทำงานในทุกเปลือกหอยที่เข้ากันได้ POSIX
Stack Underflow

3
ทำไมถึงเป็น 2> & 1 และไม่ใช่ 2 & 1> ??
เรียนบาด

1
@marienbad ที่จริงคำถามที่มูลค่าการโพสต์ :-) ไวยากรณ์fn>targetที่fnเป็นหมายเลขไฟล์ (0-2 โดยทั่วไปบางโปรแกรมกำหนดหมายเลขเพิ่มเติม) และtargetมักจะเป็นชื่อไฟล์ แต่ที่นี่มันเป็น filenumber อื่น - นำหน้าด้วย&ซึ่งเป็น ไวยากรณ์สำหรับ "ฉันต้องการชื่อไฟล์แทนชื่อไฟล์"
toolforger

9

/dev/nullถือว่าเป็นหลุมดำใน Linux / Unix ดังนั้นคุณสามารถใส่อะไรลงไปในสิ่งนี้ได้ แต่คุณจะไม่สามารถนำมันกลับมา/dev/nullได้

ยิ่งไปกว่านั้น2>หมายความว่าคุณกำลังเปลี่ยนเส้นทาง (เช่น>) stderr (ie 2) ลงในหลุมดำ (เช่น/dev/null)

คำสั่งของคุณคือ:

grep -i 'abc' content 2>/dev/null 

อย่าพยายามปิดท้ายด้วยเครื่องหมายทับหน้าอื่นเช่นนี้ - 2>/dev/null/(ไม่ใช่ไดเรกทอรี)


2

เนื้อหา grep -i 'abc' จะสร้างผลลัพธ์ที่แสดงบนคอนโซลของคุณรวมถึงข้อผิดพลาดใด ๆ

การระบุ2>/dev/nullจะกรองข้อผิดพลาดออกเพื่อไม่ให้ส่งออกไปยังคอนโซลของคุณ

รายละเอียดเพิ่มเติม: 2 แสดงถึงตัวบ่งชี้ข้อผิดพลาดซึ่งเป็นที่ที่ข้อผิดพลาดจะถูกเขียนไป โดยค่าเริ่มต้นพวกเขาจะพิมพ์ออกมาบนคอนโซล

\> เปลี่ยนเส้นทางเอาต์พุตไปยังตำแหน่งที่ระบุในกรณีนี้ /dev/null

/dev/null เป็นอุปกรณ์ Linux มาตรฐานที่คุณส่งเอาต์พุตที่คุณต้องการละเว้น


กระชับและในหัวข้อ คำตอบที่ดี.
Sergiy Kolodyazhnyy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.