출력을 두 자리 파일 설명자로 리디렉션하는 중에 문제가 발생했습니다.

출력을 두 자리 파일 설명자로 리디렉션하는 중에 문제가 발생했습니다.
/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 */

관련 정보