파일 설명자 3-255에 대해 /dev/stdout에 해당하는 것이 있습니까?

파일 설명자 3-255에 대해 /dev/stdout에 해당하는 것이 있습니까?

/dev/stdout파일 이름을 전달하여 파일이 표준 출력으로 파이프될 것으로 예상하는 명령줄 유틸리티를 속일 수 있는 경우가 많다는 것을 알고 있습니다.

stdout/ 대신 번호가 매겨진 파일 설명자로 파이프되도록 도구를 설정할 수 있는지 궁금합니다. 대신 stderr파이프하려면 다음을 수행할 수 있습니다 .stderrstdout

command 2>&1 >/dev/null | grep 'something'

내 질문을 보다 구체적으로 만들려면(최소 재현 가능한 예): 파이핑을 위한 (특정 도구에 대해 묻는 것이 아닙니다. 어떤 아이디어라도 있는 것 같습니다) /dev/stdout대신 파일 설명자 번호 3에서 출력이 끝나도록 여기에서 무엇을 바꿔야 합니까 ? stdout를 사용할 수 있기 때문에 문자열을 fd 3에 추가합니다 /dev/stdout.

cp a /dev/stdout

cp일반적으로 파일 경로가 필요한 명령으로 대체되었습니다 .

효과적인가요 /dev/3? /dev/stdoutfd 1 대신 fd 3의 아날로그를 찾고 있습니다 .

질문을 다른 방식으로 바꾸려면 다음을 수행하십시오.

file descriptor 1 is to /dev/stdout 
what 
file descriptor 3 is to ???

대신 여기서 무엇을 사용해야합니까????

나는 광범위하게 검색했지만 아무것도 찾을 수 없었습니다.

답변1

많은 시스템(전부는 아님!)에서 /dev/fd/이는 파일 핸들의 디렉토리입니다. Linux에서는 일반적으로 에 대한 링크이지만 /proc/self/fdNetBSD9(예를 들어)에서는 실제 디렉터리입니다.

그래서

% ( cat a > /dev/fd/9) 9>&1 >/dev/null | grep .
foo

그러나 cp사용하는 쉘에 따라 달라지는 것 같습니다.

ksh93을 사용하는 CentOS7에서...

% cp a /dev/fd/9 9>&1 >/dev/null | cat
cp: cannot create regular file '/dev/fd/9': No such device or address

/dev/fd/9이는 일반 파일이 아니기 때문입니다 . 그러나 ~함에 따라 bash...

$ cp a /dev/fd/9 9>&1 >/dev/null | cat
foo

효율적인!

보시다시피, 이는 모든 플랫폼에서 존재한다고 보장되지 않으며, 동일한 플랫폼의 쉘 간에도 이식 가능하지 않습니다!

답변2

내가 아는 한 모든 시스템에 적용되는 것은 아닙니다. 그러나 Debian과 모든 Gnu/Linux에서는

/dev/stdout에 대한 심볼릭 링크입니다 /proc/self/fd/1. 디렉토리를 살펴보면 /proc/self/fd/다른 파일 설명자를 찾을 수 있습니다. 여기에는 사용 중인 파일 설명자만 포함됩니다. 이는 프로세스에 따라 달라집니다.

답변3

노력하다/proc/self/fd/«number»

실제로 프로세스 ID의 이름을 지정하면 이러한 방식으로 모든 프로세스 파일에 액세스할 수 있습니다.

이는 운영 체제에 따라 다르며 모든 Unix에서 작동하지 않을 수 있습니다.

관련 정보