วิธีการเปลี่ยนเส้นทางการส่งออกของคำสั่งใด ๆ


14

ฉันพยายามเขียนสคริปต์ง่าย ๆ เพื่อตรวจสอบสถานะเครือข่ายของฉันโดยไม่pingแสดงผลลัพธ์ทั้งหมด:

ping -q -c 1 google.com > /dev/null && echo online || echo offline

ปัญหาคือเมื่อฉันไม่ได้เชื่อมต่อฉันยังคงได้รับข้อความแสดงข้อผิดพลาดในผลลัพธ์ของฉัน:

ping: unknown host google.com
offline

ฉันจะป้องกันไม่ให้ข้อความแสดงข้อผิดพลาดนี้ออกจากผลลัพธ์ของฉันได้อย่างไร

คำตอบ:


28

เมื่อคุณทำงาน:

ping -q -c 1 google.com > /dev/null && echo online || echo offline

คุณจะได้เป็นหลักเพียงการเปลี่ยนเส้นทางการส่งออกของสตรีม 1 (คือstdout) /dev/nullเพื่อ

สิ่งนี้ใช้ได้เมื่อคุณต้องการเปลี่ยนทิศทางเอาต์พุตที่สร้างขึ้นโดยการเรียกใช้งานปกติของโปรแกรม อย่างไรก็ตามในกรณีที่คุณยังต้องการที่จะเปลี่ยนเส้นทางออกที่เกิดจากข้อผิดพลาดทุกคำเตือนหรือความล้มเหลวคุณควรเปลี่ยนเส้นทางหรือกระแสข้อผิดพลาดมาตรฐานstderr/dev/null

วิธีหนึ่งในการทำเช่นนี้คือการเพิ่มจำนวนสตรีมที่คุณต้องการเปลี่ยนเส้นทางไปยังผู้ให้บริการการเปลี่ยนเส้นทาง>เช่นนี้Command 2> /dev/null

ดังนั้นคำสั่งของคุณจะมีลักษณะดังนี้:

ping -q -c 1 google.com > /dev/null 2> /dev/null && echo online || echo offline

แต่โปรดสังเกตว่าเราได้เปลี่ยนเส้นทางไปหนึ่งสตรีมไป/dev/nullแล้ว ทำไมไม่เพียงแค่แบกลูกหมูบนการเปลี่ยนเส้นทางเดียวกัน Bash ช่วยให้เราสามารถทำได้โดยระบุหมายเลขสตรีมที่จะเปลี่ยนเส้นทาง 2>&1.

สังเกตุ&ตัวละครหลังตัวดำเนินการเปลี่ยนเส้นทาง สิ่งนี้บอกเชลล์ว่าสิ่งที่ปรากฏถัดไปไม่ใช่ชื่อไฟล์ แต่เป็นตัวบ่งชี้สำหรับเอาต์พุตสตรีม

ping -q -c 1 google.com > /dev/null 2>&1  echo online || echo offline

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

อีกวิธีหนึ่งที่คุณสามารถบรรลุความเงียบที่สมบูรณ์คือการเปลี่ยนเส้นทางกระแสข้อมูลทั้งหมดเพื่อ/dev/nullใช้ทางลัดนี้: &>/dev/null(หรือเปลี่ยนเส้นทางไปยังล็อกไฟล์ด้วย&>/path/to/file.log)

ดังนั้นเขียนคำสั่งของคุณเป็น:

ping -q -c 1 google.com &> /dev/null && echo online || echo offline

1
อ๊ะ&>/dev/nullมันเป็น ขอบคุณทุกท่านสำหรับความช่วยเหลือทันที!
operalala

4
Be careful with the redirection operators, their order matters a lot.แต่คุณไม่ได้รวมตัวอย่างการใช้งานจริง2>&1
Izkata

ฉันลืมที่จะเพิ่มที่! แก้ไขคำตอบเพื่อสะท้อนตัวอย่าง เมื่อฉันมีเวลาเพิ่มในมือของฉันอีกเล็กน้อยฉันจะอธิบายวิธีการสั่งซื้อด้วยเช่นกัน
darnir

9

คุณต้องเปลี่ยนเส้นทางทั้งเอาต์พุตมาตรฐาน ( >หรือ1>) และข้อผิดพลาดมาตรฐาน ( 2>):

ping -q -c 1 google.com > /dev/null 2>/dev/null && echo online || echo offline

หรือเปลี่ยนเส้นทางหนึ่งไปอีกอัน:

ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline

8
$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline

ตัวอย่าง

$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
online

$ ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline
offline

เร่งความเร็ว ping

ทั้งนี้ขึ้นอยู่กับpingการดำเนินการที่คุณอาจจะ จำกัด -c 1จำนวนเพียงครั้งเดียว การใช้งานบางอย่างจะช่วยให้คุณสามารถทำสิ่งนี้ได้ แต่คุณต้องรอการค้นหาที่ไม่เหมาะสม ดังนั้นแทนที่จะใช้pingคุณอาจต้องการใช้fingแทน

ความช้าของการ ping ล้มเหลว

$ date; ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:10 EST 2014
online
Tue Jan 28 13:51:10 EST 2014

$ date; ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:15 EST 2014
offline
Tue Jan 28 13:51:25 EST 2014

นิ้วเร็วกว่าที่จะล้มเหลว

$ date; fing -p google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:21 EST 2014
online
Tue Jan 28 13:49:22 EST 2014

$ date; fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:35 EST 2014
online
Tue Jan 28 13:49:38 EST 2014

1
ฉันควรใช้timeคำสั่งมากกว่าคำนวณเวลาต่างกันด้วยตนเองด้วยdate:time { fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; }
Ruslan

@Ruslan - ขอบคุณผมว่าวิธีนี้ B / C dateผมอยากส่งออกของ ง่ายกว่าสำหรับ IMO ที่จะให้คนอื่นอ่านเอาต์พุตที่สร้างขึ้น
slm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.