การซ่อนเอาต์พุตของคำสั่ง


31

ฉันมีสคริปต์ที่ตรวจสอบว่ามีการติดตั้งแพคเกจหรือไม่และไม่ว่าจะใช้พอร์ต 8080 โดยกระบวนการเฉพาะหรือไม่ ฉันไม่เคยมีประสบการณ์กับทุบตีเลยดังนั้นฉันจึงทำสิ่งนี้:

if dpkg -s net-tools; then
    if  netstat -tlpn | grep 8080 | grep java; then
        echo "Shut down server before executing this script"
        exit
    fi
else
    echo "If the server is running please shut it down before continuing with the execution of this script"
fi

# the rest of the script...

อย่างไรก็ตามเมื่อสคริปต์ถูกเรียกใช้งานฉันได้รับทั้งdpkg -s net-toolsและnetstat -tlpn | grep 8080 | grep javaเอาต์พุตในเทอร์มินัลและฉันไม่ต้องการสิ่งนั้นฉันจะซ่อนเอาต์พุตและติดกับผลลัพธ์ของifs ได้อย่างไร

นอกจากนี้ยังมีวิธีที่สง่างามกว่าในการทำสิ่งที่ฉันกำลังทำอยู่หรือไม่? และมีวิธีที่ฉลาดกว่าที่จะทราบว่ากระบวนการใดที่ใช้พอร์ต 8080 (ไม่ใช่เฉพาะเมื่อมันถูกใช้) หากมี

คำตอบ:


53

หากต้องการซ่อนผลลัพธ์ของคำสั่งใด ๆ มักจะได้stdoutและจะถูกเปลี่ยนเส้นทางไปยังstderr/dev/null

command > /dev/null 2>&1

คำอธิบาย:

1. command > /dev/null: เปลี่ยนเส้นทางเอาต์พุตของcommand(stdout) เป็น/dev/null
2 2>&1: เปลี่ยนเส้นทางstderrไปที่stdoutดังนั้นข้อผิดพลาด (ถ้ามี) ก็ไปที่/dev/null

บันทึก

&>/dev/null: เปลี่ยนเส้นทางทั้งไปstdoutและกลับ หนึ่งสามารถใช้เป็นทางเลือกของstderr/dev/null/dev/null 2>&1

เงียบgrep :grep -q "string"จับคู่สตริงอย่างเงียบ ๆ หรือเงียบ ๆ โดยไม่มีสิ่งใดไปยังเอาต์พุตมาตรฐาน นอกจากนี้ยังสามารถใช้เพื่อซ่อนเอาต์พุต

ในกรณีของคุณคุณสามารถใช้มันเหมือน

if dpkg -s net-tools > /dev/null 2>&1; then
    if  netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1; then
    #rest thing
else
    echo "your message"
fi

นี่คือเงื่อนไขถ้าจะถูกตรวจสอบเหมือนเดิม แต่จะไม่มีผลลัพธ์ใด ๆ

ตอบกลับความคิดเห็น :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: มันกำลังเปลี่ยนทิศทางเอาต์พุตที่ยกมาจากgrep javaหลังจากไปป์ที่สอง netstat -tlpnแต่ข้อความที่คุณได้รับจาก การแก้ปัญหาคือการใช้ที่สองifเป็น

if  [[ `netstat -tlpn | grep 8080 | grep java` ]] &>/dev/null; then

1
คุณยังสามารถพูดถึงgrep -qและทุบตีใหม่&> ...เป็นคำพ้องสำหรับ> ... 2>&1
steeldriver

ขอบคุณที่ปรับปรุงสคริปต์ แต่ฉันยังคงได้รับข้อความแจ้งว่ากระบวนการบางอย่างไม่สามารถแสดงได้เนื่องจากไม่ได้ถูกเรียกใช้เป็นรูท netstatเรื่องนี้เกิดขึ้นกับ มีวิธีใดบ้างที่ฉันจะซ่อนมันได้ด้วย?
dabadaba

1

lsof -i :<portnumnber> ควรจะสามารถทำบางสิ่งตามแนวของสิ่งที่คุณต้องการ


ขอโทษฉันลืมที่จะเพิ่มคำถามที่แท้จริงที่จะโพสต์ให้ตรวจสอบ agin โปรดเพราะคุณคำตอบเป็นเพียงสำหรับคำถามที่ "รอง"
dabadaba

ฉันมีวิธีที่ฉันสามารถแยกชื่อกระบวนการ / PID จากผลลัพธ์ของคำสั่งนั้นได้หรือไม่
dabadaba

อีกวิธีในการทำสิ่งเดียวกันคือfuser -n tcp 8080การแยกวิเคราะห์ผลลัพธ์อาจง่ายกว่า
fkraiem

0

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

command | grep -m 1 -o "abc" | grep -o "123"

นี้สองครั้งgrepติดตั้งพบว่าสายการจับคู่ที่มีabcอยู่ในพวกเขาและตั้งแต่-oมีการตั้งค่าเฉพาะจะถูกพิมพ์และเพียงครั้งเดียวเพราะabc -m 1จากนั้นเอาต์พุตที่ว่างเปล่าหรือabcถูกส่งไปที่ grep เพื่อค้นหาเฉพาะส่วนของสตริงที่จับคู่123และเนื่องจากคำสั่งสุดท้ายเท่านั้นส่งออกabcสตริงว่างเปล่าจะถูกส่งกลับ หวังว่าจะช่วย!

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