これは通常のリダイレクトです。
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/22
stderr がまだリダイレクトされていない場合、エラーが出力されます。次の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/./tcp
TCP/dev//tcp
ソケットワードを生成してconnect()
試みます。ホストとポートで。connect
失敗すると、bash
エラーが報告されます。
zsh
モジュールztcp
には、より直感的でサーバーサイド接続などのより多くの機能を可能にする組み込みコマンドがあります。zsh/net/tcp