/dev/stdout
파일 이름을 전달하여 파일이 표준 출력으로 파이프될 것으로 예상하는 명령줄 유틸리티를 속일 수 있는 경우가 많다는 것을 알고 있습니다.
stdout
/ 대신 번호가 매겨진 파일 설명자로 파이프되도록 도구를 설정할 수 있는지 궁금합니다. 대신 stderr
파이프하려면 다음을 수행할 수 있습니다 .stderr
stdout
command 2>&1 >/dev/null | grep 'something'
내 질문을 보다 구체적으로 만들려면(최소 재현 가능한 예): 파이핑을 위한 (특정 도구에 대해 묻는 것이 아닙니다. 어떤 아이디어라도 있는 것 같습니다) /dev/stdout
대신 파일 설명자 번호 3에서 출력이 끝나도록 여기에서 무엇을 바꿔야 합니까 ? stdout
를 사용할 수 있기 때문에 문자열을 fd 3에 추가합니다 /dev/stdout
.
cp a /dev/stdout
cp
일반적으로 파일 경로가 필요한 명령으로 대체되었습니다 .
효과적인가요 /dev/3
? /dev/stdout
fd 1 대신 fd 3의 아날로그를 찾고 있습니다 .
질문을 다른 방식으로 바꾸려면 다음을 수행하십시오.
file descriptor 1 is to /dev/stdout
what
file descriptor 3 is to ???
대신 여기서 무엇을 사용해야합니까????
나는 광범위하게 검색했지만 아무것도 찾을 수 없었습니다.
답변1
많은 시스템(전부는 아님!)에서 /dev/fd/
이는 파일 핸들의 디렉토리입니다. Linux에서는 일반적으로 에 대한 링크이지만 /proc/self/fd
NetBSD9(예를 들어)에서는 실제 디렉터리입니다.
그래서
% ( 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에서 작동하지 않을 수 있습니다.