Ẩn đầu ra của một lệnh


31

Tôi có một tập lệnh trong đó nó kiểm tra xem một gói có được cài đặt hay không và liệu cổng 8080 có được sử dụng bởi một quy trình cụ thể hay không. Tôi hoàn toàn không có kinh nghiệm với bash, vì vậy tôi đã làm một cái gì đó như thế này:

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...

Tuy nhiên, khi tập lệnh được thực thi, tôi nhận được cả đầu ra dpkg -s net-toolsnetstat -tlpn | grep 8080 | grep javađầu ra trong thiết bị đầu cuối và tôi không muốn điều đó, làm thế nào tôi có thể ẩn đầu ra và chỉ gắn với kết quả của ifs?

Ngoài ra, có cách nào thanh lịch hơn để làm những gì tôi đang làm không? Và đó là một cách thanh lịch để biết những gì quá trình đang sử dụng cổng 8080 (không chỉ là nếu nó đang được sử dụng), nếu có?

Câu trả lời:


53

Để ẩn đầu ra của bất kỳ lệnh nào thường stdoutstderrđược chuyển hướng đến /dev/null.

command > /dev/null 2>&1

Giải trình:

1 . command > /dev/null: chuyển hướng đầu ra của command(stdout) thành /dev/null
2 . 2>&1: chuyển hướng stderrđến stdout, do đó, lỗi (nếu có) cũng xảy ra/dev/null

chú thích

&>/dev/null: chuyển hướng cả stdoutstderrđến /dev/null. người ta có thể sử dụng nó như là một thay thế của/dev/null 2>&1

Im lặnggrep : grep -q "string"khớp chuỗi âm thầm hoặc lặng lẽ mà không có bất cứ điều gì với đầu ra tiêu chuẩn. Nó cũng có thể được sử dụng để ẩn đầu ra.

Trong trường hợp của bạn, bạn có thể sử dụng nó như,

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

Ở đây, các điều kiện if sẽ được kiểm tra như trước đây nhưng sẽ không có bất kỳ đầu ra nào.

Trả lời bình luận :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: Nó đang chuyển hướng đầu ra được nâng lên từ grep javasau ống thứ hai. Nhưng tin nhắn bạn đang nhận được từ netstat -tlpn. Giải pháp là sử dụng thứ hai ifnhư,

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

1
Bạn cũng có thể đề cập grep -q, và bash mới hơn &> ...như là một từ đồng nghĩa với> ... 2>&1
Steeldo

cảm ơn bạn, điều đó đã nâng cao kịch bản Nhưng tôi vẫn nhận được một thông báo nói rằng một số quy trình không thể được hiển thị vì nó không được thực thi như root. Điều này xảy ra với netstat. Có cách nào tôi có thể che giấu điều đó quá?
dabadaba

1

lsof -i :<portnumnber> sẽ có thể làm một cái gì đó dọc theo dòng của những gì bạn muốn.


xin lỗi tôi đã quên thêm câu hỏi thực sự vào bài đăng, vui lòng kiểm tra lại vì bạn trả lời chỉ dành cho câu hỏi "phụ"
dabadaba

cũng có cách nào để tôi có thể trích xuất tên tiến trình / PID từ đầu ra của lệnh đó không?
dabadaba

Một cách khác để làm điều tương tự là fuser -n tcp 8080, đầu ra của nó có thể dễ phân tích cú pháp hơn.
fkraiem

0

Mặc dù việc xóa đầu ra /dev/nullcó lẽ là cách dễ nhất, đôi khi /dev/nullcó các quyền của tệp được đặt để không phải root không thể xóa đầu ra ở đó. Vì vậy, một cách không root khác để làm điều này là

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

grepThiết lập kép này tìm thấy các dòng phù hợp với abcchúng và vì -ođược đặt CHỈ abcđược in và chỉ một lần vì -m 1. Sau đó, đầu ra trống hoặc abcđược gửi đến grep để chỉ tìm các phần của chuỗi khớp 123và vì lệnh cuối cùng chỉ xuất ra abcchuỗi trống được trả về. Mong rằng sẽ giúp!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.