쉘의 파일 디스크립터와 리디렉션 등을 위해 해당 파일 디스크립터를 조작하는 방법에 대한 많은 문서와 토론이 있습니다. 제 질문은 쉘 명령이 , 등과 같은
외부 프로그램인 경우 해당 명령에 파일 디스크립터가 있습니까? 쉘도 마찬가지죠? 구체적인 예를 들자면 터미널 프롬프트에서 이 명령을 실행하면rsync
cat
curl
% cat << EOF | php
<?php
echo "hello". PHP_EOL;
echo "another line" . PHP_EOL;
EOF
나는 이 heredoc의 내용이 STDIN에 공급되고 있다고 가정하고 있지만 어떤 프로세스의 프로세스입니까? 아니면 cat
파일 설명자가 있고 0
heredoc의 내용이 cat
's' 에 fd0
직접 공급됩니까?
답변1
파일 기반, 대화형 또는 다른 방식이든 모든 I/O에는 각각 고유한 파일 설명자가 필요하다는 점부터 시작하겠습니다.
대화형 파일 설명자의 표준화를 통해 리디렉션과 파이핑이 가능해졌습니다.
쉘은 표준 I/O 조작의 전문가입니다.
귀하의 예에서 는 cat
HEREDOC 스크립트를 나타내는 쉘의 출력으로 설정된 STDIN( a를 통해 전송됨 popen()
)과 STDOUT이 의 STDIN으로 파이프된(popen() 사용)으로 호출됩니다 php
. php
의 출력이 리디렉션되지 않는 경우, 쉘의 초기 STDOUT을 가리킵니다.