bashコマンドの出力を抑制する方法

bashコマンドの出力を抑制する方法

私は見つけたこちらです特定のポートでホストにアクセスできるかどうかを確認する方法ですが、コマンドのステータス コードのみに関心があるため、次のような方法を試しています。

[CptBartender@somewhere ~]$ <dev/tcp/host/port ; echo $?
0

開いているポートで試すと正常に動作しますが、閉じているポートを確認すると次のようになります。

[CptBartender@somewhere ~]$ <dev/tcp/host/blocked_port ; echo $?
-bash: connect: Connection refused
-bash: /dev/tcp/host/blocked_port: Connection refused
1

次のステップでは、最初のコマンドの出力を破棄してみることにしました。そこで、次の操作を試しました。

[CptBartender@somewhere ~]$ <dev/tcp/host/blocked_port >/dev/null/ 2>&1; echo $?
-bash: connect: Connection refused
-bash: /dev/tcp/host/blocked_port: Connection refused
1

出力は同じです。私の質問は、最初のコマンドがなぜ何らかの出力を印刷するのか、そしてそれをどのように防ぐのかということです。

答え1

それは指示それは印刷出力です。どれでもコマンド – は< /dev/tcp/…単なる通常の入力リダイレクトシェル自体によって処理されます。

(それだけでなく、リダイレクトは左から右に処理されるため、<リダイレクトは前にリダイレクトできなかっ2>&1ともかく

この問題を回避するには、サブシェルで「コマンド」を実行します。例:

( </dev/tcp/$host/$port ) 2>/dev/null

実際のところ、この場合サブシェルは必要ないようです。コマンド グループは同じプロセス内にある場合でも機能しますが、それでも「外部」リダイレクトが最初に処理されるように強制します。

{ </dev/tcp/$host/$port; } 2>/dev/null

補足:/dev/tcpは bash 自体によって処理される魔法のパスです。Linux の /dev には実際には存在しませんが、bash のリダイレクトで使用できます。ただし、このトリックは では機能しません#!/bin/sh。また、一部の古いシステム (この機能が無効になっていた) や一部の非 Linux システム上の bash では機能しない可能性があります。

関連情報