Menyembunyikan output dari suatu perintah

31

Saya memiliki skrip tempat memeriksa apakah suatu paket diinstal atau tidak dan apakah port 8080 sedang digunakan oleh proses tertentu atau tidak. Saya tidak berpengalaman sama sekali dengan bash, jadi saya melakukan sesuatu seperti ini:

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

Namun ketika skrip dieksekusi saya mendapatkan keduanya dpkg -s net-toolsdan netstat -tlpn | grep 8080 | grep javaoutput di terminal, dan saya tidak ingin itu, bagaimana saya bisa menyembunyikan output dan tetap dengan hasil dari ifs?

Juga, apakah ada cara yang lebih elegan untuk melakukan apa yang saya lakukan? Dan apakah ada cara yang lebih elegan untuk mengetahui proses apa yang menggunakan port 8080 (bukan hanya jika sedang digunakan), jika ada?

dabadaba
sumber

Jawaban:

53

Untuk menyembunyikan output dari perintah apa pun biasanya perintah stdoutdan stderrdialihkan ke /dev/null.

command > /dev/null 2>&1

Penjelasan:

1 command > /dev/null.: mengarahkan ulang output dari command(stdout) ke /dev/null
2 2>&1.: mengalihkan stderrke stdout, jadi kesalahan (jika ada) juga menuju ke/dev/null

Catatan

&>/dev/null: mengarahkan ulang keduanya stdoutdan stderrke /dev/null. seseorang dapat menggunakannya sebagai alternatif/dev/null 2>&1

Diamgrep : grep -q "string"cocokkan string secara diam-diam atau diam-diam tanpa apa pun dengan output standar. Itu juga dapat digunakan untuk menyembunyikan output.

Dalam kasus Anda, Anda dapat menggunakannya seperti,

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

Di sini kondisi jika akan diperiksa seperti sebelumnya tetapi tidak akan ada output.

Balas komentar :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: Ini mengarahkan output yang dinaikkan dari grep javasetelah pipa kedua. Tapi pesan yang Anda terima berasal netstat -tlpn. Solusinya adalah gunakan kedua ifsebagai,

if  [[ `netstat -tlpn | grep 8080 | grep java` ]] &>/dev/null; then
souravc
sumber
1
Anda juga bisa menyebutkan grep -q, dan bash yang lebih baru &> ...sebagai sinonim untuk> ... 2>&1
steeldriver
terima kasih, skrip yang ditingkatkan. Tetapi saya masih mendapatkan pesan yang mengatakan bahwa beberapa proses tidak dapat ditampilkan karena tidak dieksekusi sebagai root. Ini terjadi dengan netstat. Apakah ada cara saya bisa menyembunyikan itu juga?
dabadaba
1

lsof -i :<portnumnber> harus dapat melakukan sesuatu sesuai dengan yang Anda inginkan.

Tim
sumber
maaf saya lupa menambahkan pertanyaan sebenarnya ke posting, silakan cek agin tolong karena jawaban Anda hanya untuk pertanyaan "sekunder"
dabadaba
juga adakah cara saya bisa mengekstrak nama proses / PID dari output perintah itu?
dabadaba
Cara lain untuk melakukan hal yang sama adalah fuser -n tcp 8080, yang keluarannya mungkin lebih mudah diurai.
fkraiem
0

Walaupun mem-flushing output ke /dev/nullmungkin merupakan cara termudah, kadang-kadang /dev/nullmemiliki hak akses file diatur sehingga non-root tidak dapat menyiram output di sana. Jadi, cara non-root lain untuk melakukan ini adalah dengan

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

grepPengaturan ganda ini menemukan garis yang cocok dengan abcmereka dan karena -odiatur HANYA abcdicetak dan hanya sekali karena -m 1. Kemudian output yang kosong atau abcdikirim ke grep hanya menemukan bagian-bagian dari string yang cocok 123dan karena perintah terakhir hanya menghasilkan abcstring kosong dikembalikan. Semoga itu bisa membantu!

BoomBoomPowe
sumber