出力を2桁のファイル記述子にリダイレクト中に問題が発生しました。

出力を2桁のファイル記述子にリダイレクト中に問題が発生しました。
/tmp$ python
Python 2.7.6 (default, Nov 13 2018, 12:45:42)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> f1 = open("/tmp/doo1","w")
>>> f2 = open("/tmp/doo2","w")
>>> f3 = open("/tmp/doo3","w")
>>> f4 = open("/tmp/doo4","w")
>>> f5 = open("/tmp/doo5","w")
>>> f6 = open("/tmp/doo6","w")
>>> f7 = open("/tmp/doo7","w")
>>> f8 = open("/tmp/doo8","w")
>>> f9 = open("/tmp/doo9","w")
>>> f5.fileno()
7
>>> os.system("cat /file_to_copy >&7")  # works fine
0
>>> f7.fileno()
9
>>> os.system("cat /file_to_copy >&9")  # works fine
0
>>> f8.fileno()
10
>>> os.system("cat /file_to_copy >&10")  # does not work
sh: 1: Syntax error: Bad fd number
512
>>> f9.fileno()
11
>>> os.system("cat /file_to_copy >&11")  # does not work
sh: 1: Syntax error: Bad fd number
512

I / Oリダイレクトがfd <= 9のみをサポートするのはなぜですか?追跡を行いましたが、問題を特定できませんでした。 Pythonコードを貼り付けましたが、syscallシェルが原因でC ++コードでも同じ問題が発生します。

私のユースケースは、リモートコンピュータにSSH経由で接続することです。リモートファイルをローカルファイルに。ローカルファイルは、以前に作成された後に他のユーザー/プロセスが表示されないようにすぐにリンクが解除されます。したがって、cat出力はローカルファイルパスではなくローカルファイルfdにリダイレクトされます。

fd = open("/tmp/doo",O_CREAT|O_RDWR);
unlink("/tmp/doo");
...
...
system will run this - "ssh -n user@remotehost -- cat /remote_file >&fd"

編集 - fd 10以上が予約されているようです。から:https://github.com/MirBSD/mksh/blob/master/sh.h

/* first fd number usable by the shell for its own purposes */
#define FDBASE      10
/* … and last one */
#define FDMAXNUM    127 /* 0x7FU, cf. FDNUMMASK */

ベストアンサー1

おすすめ記事