Stdout/stderr リダイレクトは、/dev/tcp/host/port リダイレクトエラーを防ぎません。

Stdout/stderr リダイレクトは、/dev/tcp/host/port リダイレクトエラーを防ぎません。

これは通常のリダイレクトです。

user@linux:~$ randomcommand
randomcommand: command not found
user@linux:~$ 

2>

user@linux:~$ randomcommand 2> /dev/null
user@linux:~$ 

&>

user@linux:~$ randomcommand &> /dev/null
user@linux:~$ 

ただし、別のコマンドを使用して同じ操作を実行しようとすると、以下のようには機能しません。

&>

user@linux:~$ > /dev/tcp/127.0.0.1/22 &> /dev/null && echo open || echo closed
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/22: Connection refused
closed
user@linux:~$ 

2>

user@linux:~$ > /dev/tcp/127.0.0.1/22 2> /dev/null && echo open || echo closed
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/22: Connection refused
closed
user@linux:~$ 

この構文には何の問題があり、どのように解決しますか?

ベストアンサー1

bashリダイレクトが処理中で、> /dev/tcp/localhost/22stderr がまだリダイレクトされていない場合、エラーが出力されます。次の2つのリダイレクトの順序を変更するだけです。

if 2> /dev/null > /dev/tcp/127.0.0.1/22; then
  echo open
else
  echo closed
fi

実際のファイルでは/dev/tcp/host/portないことに注意してください。bash(またはkshその機能のソース)は、これらの特別なファイルにリダイレクトしようとしていることを検出し(変更または機能しなくなった場合はわかります)、これらのファイルを開くのではなく/dev/./tcpTCP/dev//tcpソケットワードを生成してconnect()試みます。ホストとポートで。connect失敗すると、bashエラーが報告されます。

zshモジュールztcpには、より直感的でサーバーサイド接続などのより多くの機能を可能にする組み込みコマンドがあります。zsh/net/tcp

おすすめ記事