コマンドの出力を隠す


31

パッケージがインストールされているかどうか、ポート8080が特定のプロセスで使用されているかどうかを確認するスクリプトがあります。私はbashをまったく経験していないので、次のようなことをしました。

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-toolsnetstat -tlpn | grep 8080 | grep java出力の両方を取得しますが、それを望んでいません。出力を非表示にして、ifsの結果だけを保持するにはどうすればよいですか?

また、私がやっていることを行うためのよりエレガントな方法はありますか?また、ポート8080が使用されている場合だけでなく、ポート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

サイレントgrepgrep -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

ここでは、if条件が以前と同じようにチェックされますが、出力はありません。

コメントへの返信

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1grep java2番目のパイプの後から発生した出力をリダイレクトしています。しかし、あなたからのメッセージですnetstat -tlpn。解決策は次のifように使用されます、

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

1
あなたも言及できgrep -q、以降はbash &> ...の同義語として> ... 2>&1
steeldriver

スクリプトを強化してくれてありがとう。しかし、ルートとして実行されていないため、一部のプロセスは表示できないというメッセージが表示されます。これはで起こりnetstatます。私もそれを隠すことができる方法はありますか?
ダバダバ

1

lsof -i :<portnumnber> あなたが望むものの線に沿って何かをすることができるはずです。


申し訳ありませんが、私はポストに本当の問題を追加するのを忘れ、あなたの答えは単に「二次」の質問のためにあるので、それは喜ばaginチェック
dabadaba

また、そのコマンドの出力からプロセス名/ PIDを抽出できる方法はありますか?
ダバダバ

同じことを行うもう1つの方法はfuser -n tcp 8080、その出力の解析が容易になる可能性があることです。
fkraiem

0

出力をフラッシュするの/dev/nullがおそらく最も簡単な方法ですが、/dev/null非rootがそこに出力をフラッシュできないようにファイルのアクセス権を設定している場合があります。したがって、これを行う別の非ルート方法は

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

このダブルgrepセットアップはと一致する行を見つけabc、その中および以来-oONLYに設定されてabc印刷され、だけのための一回-m 1。次に、空の出力またはabcgrepに送信されて、一致する文字列の部分のみを検索し123、最後のコマンドabcは空の文字列のみを出力するため、出力が返されます。お役に立てば幸いです!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.