Pertanyaan Menyembunyikan output dari suatu perintah


Saya memiliki skrip di mana ia memeriksa apakah 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 dijalankan, saya mendapatkan keduanya dpkg -s net-tools dan netstat -tlpn | grep 8080 | grep java output di terminal, dan saya tidak mau itu, bagaimana saya bisa menyembunyikan output dan tetap dengan hasil ifs?

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


11
2018-05-30 17:44


asal




Jawaban:


Untuk menyembunyikan output dari setiap perintah biasanya stdout dan stderr dialihkan ke /dev/null.

command > /dev/null 2>&1

Penjelasan:

1command > /dev/null: mengalihkan output command(stdout) ke /dev/null
22>&1: arahan ulang stderr untuk stdout, jadi kesalahan (jika ada) juga berlaku /dev/null

Catatan

&>/dev/null: mengalihkan keduanya stdout dan stderr untuk /dev/null. seseorang dapat menggunakannya sebagai alternatif /dev/null 2>&1

Diam grep: grep -q "string" mencocokkan string diam-diam atau diam-diam tanpa apa pun ke output standar. Ini 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 ke komentar:

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: Ini mengarahkan output yang dihasilkan dari grep java setelah pipa kedua. Tetapi pesan yang Anda dapatkan dari netstat -tlpn. Solusinya adalah menggunakan kedua if sebagai,

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

21
2018-05-30 17:57



Anda juga bisa menyebutkan grep -q, dan bash yang lebih baru &> ... sebagai sinonim untuk > ... 2>&1 - steeldriver
terima kasih, yang meningkatkan skripnya. Tapi saya masih mendapat 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


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


1
2018-05-30 17:46



maaf saya lupa menambahkan pertanyaan nyata ke postingan, periksa lagi tolong karena Anda menjawab hanya untuk pertanyaan "sekunder" - dabadaba
juga ada cara saya bisa mengekstrak nama proses / PID dari output dari perintah itu? - dabadaba
Cara lain untuk melakukan hal yang sama adalah fuser -n tcp 8080, yang keluarannya mungkin lebih mudah diuraikan. - fkraiem


Saat menyiram output ke /dev/null mungkin adalah cara termudah, terkadang /dev/null memiliki hak akses file sehingga non-root tidak bisa menyiram output di sana. Jadi, cara non-root lain untuk melakukan ini adalah dengan

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

Ini gandagrep setup menemukan garis yang cocok dengan abc di dalamnya dan sejak itu -o diatur HANYA abc dicetak dan hanya sekali karena -m 1. Lalu output yang kosong atau abc dikirim ke grep hanya untuk menemukan bagian string yang cocok 123 dan karena keluaran perintah terakhir saja abc string kosong dikembalikan. Semoga itu membantu!


0
2017-08-24 18:33