Bir komutun çıktısını gizleme


31

Bir paketin kurulu olup olmadığını ve 8080 numaralı bağlantı noktasının belirli bir işlem tarafından kullanılıp kullanılmadığını kontrol ettiği bir betik var. Ben hiç bash ile deneyimli değilim, bu yüzden böyle bir şey yaptım:

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

Komut yürütüldüğünde ancak ben hem olsun dpkg -s net-toolsve netstat -tlpn | grep 8080 | grep javaterminalde çıkışları, ve ben bunu istemiyorum, nasıl çıktı gizleyebilirsiniz ve sadece sonucu ile sopa ifs?

Ayrıca, yaptığım şeyi yapmanın daha zarif bir yolu var mı? Ve eğer varsa 8080 portunu hangi işlemin kullandığını (eğer kullanılıyorsa değil) kullanmanın daha zarif bir yolu var mı?

Yanıtlar:


53

Herhangi bir komutun çıktısını gizlemek için genellikle stdoutve stderryönlendirilir /dev/null.

command > /dev/null 2>&1

Açıklama:

1. command > /dev/null: yönlendirmeler çıktısı commandiçin (stdout'ta) /dev/null
2. 2>&1: yönlendirmeleri stderriçin stdout, bu yüzden hatalar (varsa) da gider/dev/null

Not

&>/dev/null: Yönlendirmeleri hem stdoutve stderriçin /dev/null. bir alternatif olarak kullanabilirsiniz/dev/null 2>&1

Sessizgrep : grep -q "string"standart çıktıya hiçbir şey olmadan dizgiyi sessizce veya sessizce eşleştirir. Çıktıyı gizlemek için de kullanılabilir.

Senin durumunda, onu kullanabilirsin

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

Burada if koşulları önceden olduğu gibi kontrol edilecek ancak herhangi bir çıktı olmayacaktır.

Yorumu yanıtla :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: grep javaİkinci borudan sonra yükselen çıkışı yönlendiriyor . Ama ondan aldığın mesaj netstat -tlpn. Çözelti kullanımı ikinci ifolarak

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

1
Ayrıca bahsedebilir grep -qve yeni bash &> ...eş anlamlısı olarak> ... 2>&1
steeldriver

teşekkür ederim, bu senaryoyu geliştirdi. Ancak yine de, kök olarak çalıştırılmadığından bazı işlemlerin gösterilemediğini belirten bir mesaj alıyorum. Bu ile olur netstat. Bunu da saklayabilmemin bir yolu var mı?
dabadaba

1

lsof -i :<portnumnber> İstedikleriniz doğrultusunda bir şeyler yapabilmeli.


üzgünüm yazıya gerçek soruyu eklemeyi unuttum, lütfen tekrar kontrol edin çünkü cevap sadece "ikincil" sorular için
dabadaba

Ayrıca, bu komutun çıktısından / PID işlem ismini çıkarmanın bir yolu var mı?
dabadaba '

Aynı şeyi yapmanın başka bir yolu fuser -n tcp 8080, çıktısının ayrıştırılması daha kolay olabilir.
fkraiem

0

Çıktıyı temizlemenin en /dev/nullkolay yolu olsa da, bazen /dev/nullkök izinsiz çıktıları oraya aktaramayacak şekilde ayarlanmış dosya izinleri vardır. Yani, bunu yapmak için başka bir kök olmayan yol

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

Bu çift grepkurulum abc, onlarla eşleşen çizgileri bulur ve -oSADECE ayarlandığından beri abcyalnızca bir kez yazdırılır -m 1. Daha sonra ya boş olan ya da abcsadece dizenin eşleşen parçalarını bulmak için grep'e gönderilen 123ve son komutun yalnızca abcboş dizge çıktılarından sonra geri döndürülmesi. Umarım yardımcı olur!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.