2011-10-14 13 views
26

この行はスクリプトで見つかりました。私はそれが何をしているか全世界的に理解していますが、双方向のTCP接続を開くのですが、私はその構文についていくつかの説明が必要です。ここでは行があります:TCP接続、bashのみ

exec 5<>"/dev/tcp/${SERVER}/${PORT}" 

そして、私の質問:

  1. <>は、通常のIOをリダイレクトするために使用されています。それはどういう意味ですか?それは別の文脈で使えますか?どうやって?
  2. /dev/tcpが存在しないのはなぜですか?
  3. なぜ5ですか?別の番号にすることはできますか?許可される値は何ですか?
  4. なぜexecが必要ですか? (何も実際にはを実行した

ありがとうございます。

答えて

17

<と>は、IOをリダイレクトするために通常使用されます。それはどういう意味ですか?それは別の文脈で使えますか?どうやって?

それは同じだ - 入力と出力はは/ dev/tcpのが存在しませんが、なぜそれが、動作しません。5.

をfdにリダイレクトされますか?

ホストが有効なホスト名またはインターネットアドレスで、portが整数のポート番号またはサービス名である場合、bashは対応するソケットへのTCP接続を開こうとします。

なぜ5ですか?別の番号にすることはできますか?許可される値は何ですか?

はい、任意の値にすることができますが、使用中のfdを使用しないようにする必要があります。

なぜexecが必要ですか? (実際に何も実行されていない場合)

execは、リダイレクトがサブシェル内ではなく現在のシェルで行われることを意味します。

+6

この回答への重要な注意点があります。bashは、/ bashが構築されたときにそれが有効になっている場合にのみ、 "/ dev/tcp" * if *サポートを尊重します。特に、Red Hatはそれを有効にしたままbashをビルドしていますが、Debianは(あるいは、少なくとも私がチェックしたのは、以前はなかった)これがすべてのシェルでもすべてのbashでも動作するとは思わないでください。 –

+0

@WilliamPursell合意しました! – trojanfoe

3

私はexecの一部に答えることができます与えられたコマンドなし

幹部は、I/Oリダイレクションを変更するために使用することができます。 <>はこの場合、読み取り+書き込みのためのオープンを意味します。 5はチャネル番号(またはファイル記述子)です。 "/ dev/tcp/$ {SERVER}/$ {PORT}"の場合は、特定のコマンドの機能であるかどうかわかりません。 Linuxのバージョンか、それともbashの機能か(私は後者を想定しています)。

- EDIT:bashのマニュアルページから: -

Bash handles several filenames specially when they are used 
in redirections, as described in the following table: 

     /dev/fd/fd 
      If fd is a valid integer, file descriptor fd is 
      duplicated. 
     /dev/stdin 
      File descriptor 0 is duplicated. 
     /dev/stdout 
      File descriptor 1 is duplicated. 
     /dev/stderr 
      File descriptor 2 is duplicated. 
     /dev/tcp/host/port 
      If host is a valid hostname or Internet address, 
      and port is an integer port number or service 
      name, bash attempts to open a TCP connection to 
      the corresponding socket. 
     /dev/udp/host/port 
      If host is a valid hostname or Internet address, 
      and port is an integer port number or service 
      name, bash attempts to open a UDP connection to 
      the corresponding socket. 
+5

これらは、bash( - enable-net-redirections)をコンパイルするときに有効にする必要のある拡張機能です。すべてのLinuxディストリビューションがそのようにbashをコンパイルするわけではありません。例えばDebianとUbuntuはそれを有効にしません。 –

+0

良い点!私は互換性に関する警告を本当に感謝します。 – ktf