ฉันต้องการคำอธิบายสั้น ๆ ของบรรทัดคำสั่งต่อไปนี้:
grep -i 'abc' content 2>/dev/null
ฉันต้องการคำอธิบายสั้น ๆ ของบรรทัดคำสั่งต่อไปนี้:
grep -i 'abc' content 2>/dev/null
คำตอบ:
ตัวดำเนินการ> จะเปลี่ยนเส้นทางผลลัพธ์ไปที่ไฟล์ แต่สามารถไปที่อุปกรณ์ได้ คุณสามารถใช้ >> เพื่อต่อท้าย
หากคุณไม่ได้ระบุตัวเลขระบบจะถือว่าสตรีมเอาต์พุตมาตรฐาน แต่คุณสามารถเปลี่ยนเส้นทางข้อผิดพลาดได้
> file
เปลี่ยนเส้นทาง stdout ไปยังไฟล์
1> file
เปลี่ยนเส้นทาง stdout ไปยังไฟล์
2> file
เปลี่ยนเส้นทาง stderr ไปยังไฟล์
&> file
เปลี่ยนเส้นทาง stdout และ stderr ไปยังไฟล์
/dev/null
เป็นอุปกรณ์ว่างเปล่าที่จะรับอินพุตใด ๆ ที่คุณต้องการและโยนมันทิ้ง มันสามารถใช้ในการปราบปรามการส่งออกใด ๆ
2>&1
จะมีไวยากรณ์ที่เก่ากว่าดังนั้น&>
จะไม่ได้ทำงานหลายปีที่ผ่านมา แต่ทั้งสองจะเทียบเท่ากัน
ในระยะสั้นมันเปลี่ยนเส้นทาง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
> /dev/null 2>&1
แทน&> /dev/null
หรือไม่
&>
เป็นของใหม่ใน Bash 4 อดีตเป็นเพียงวิธีดั้งเดิมฉันคุ้นเคยกับมันมาก (จำได้ง่าย)
&> /dev/null
อาจไม่ทำงานในบางส่วน แต่เปลือกหอย> / dev / null 2> & 1 จะทำงานในทุกเปลือกหอยที่เข้ากันได้ POSIX
fn>target
ที่fn
เป็นหมายเลขไฟล์ (0-2 โดยทั่วไปบางโปรแกรมกำหนดหมายเลขเพิ่มเติม) และtarget
มักจะเป็นชื่อไฟล์ แต่ที่นี่มันเป็น filenumber อื่น - นำหน้าด้วย&
ซึ่งเป็น ไวยากรณ์สำหรับ "ฉันต้องการชื่อไฟล์แทนชื่อไฟล์"
/dev/null
ถือว่าเป็นหลุมดำใน Linux / Unix ดังนั้นคุณสามารถใส่อะไรลงไปในสิ่งนี้ได้ แต่คุณจะไม่สามารถนำมันกลับมา/dev/null
ได้
ยิ่งไปกว่านั้น2>
หมายความว่าคุณกำลังเปลี่ยนเส้นทาง (เช่น>
) stderr (ie 2
) ลงในหลุมดำ (เช่น/dev/null
)
คำสั่งของคุณคือ:
grep -i 'abc' content 2>/dev/null
อย่าพยายามปิดท้ายด้วยเครื่องหมายทับหน้าอื่นเช่นนี้ - 2>/dev/null/
(ไม่ใช่ไดเรกทอรี)
เนื้อหา grep -i 'abc' จะสร้างผลลัพธ์ที่แสดงบนคอนโซลของคุณรวมถึงข้อผิดพลาดใด ๆ
การระบุ2>/dev/null
จะกรองข้อผิดพลาดออกเพื่อไม่ให้ส่งออกไปยังคอนโซลของคุณ
รายละเอียดเพิ่มเติม: 2 แสดงถึงตัวบ่งชี้ข้อผิดพลาดซึ่งเป็นที่ที่ข้อผิดพลาดจะถูกเขียนไป โดยค่าเริ่มต้นพวกเขาจะพิมพ์ออกมาบนคอนโซล
\>
เปลี่ยนเส้นทางเอาต์พุตไปยังตำแหน่งที่ระบุในกรณีนี้ /dev/null
/dev/null
เป็นอุปกรณ์ Linux มาตรฐานที่คุณส่งเอาต์พุตที่คุณต้องการละเว้น
> /dev/null 2>&1
และ&> /dev/null