추가 배경에 대해 묻습니다.이것이전에 질문을 하고 내용을 이해했다고 생각했지만 더 이상은 아닙니다.
나는 echo
무시한다는 것을 안다 stdin
. 나는 stdin
, stderr
그리고 stdout
존재한다는 것을 알고 있으며, 이 경우에는 이것들 이외의 "사물"이 존재한다는 것을 모릅니다.
따라서 echo
ignores 라면 stdin
어디서 입력을 얻나요? stdin
전체적인 이야기는 전해 stdout
지지 않은 것 같습니다 stderr
.
답변1
혼란스러운 원인을 제가 이해했는지 잘 모르겠습니다. 하지만 명심하세요.유닉스에서는명령줄 인수( foo
및 bar
from echo foo bar
)와 환경 문자열( FOO=bar
from env - FOO=bar printenv
)은 간단합니다.복사이는 다른 메모리와 마찬가지로(포인터 등을 통해) 프로세스의 주소 공간에서 커널에 의해 액세스됩니다. 표준 stdin, stdout, stderr 또는 추가 파일 설명자와 같은 프로세스에서는 읽거나 쓰거나 읽을 수 없습니다. 또는 메모리 매핑된 파일 전달.
이것은 자연 법칙이 아니라 유닉스에서 작동하는 방식일 뿐입니다. 이는 틀림없이 오래되고 일관성이 없으며 비효율적입니다(전체 또는 대부분을 무시하더라도 각 프로세스에 대해 전체 환경의 복사본을 생성함).
다양한 구성이 가능합니다 -계획 9, 환경 문자열은 실제로 파일입니다 /env
(이는 프로세스 간에 공유될 수도 있음을 의미함).
또한 LD_PRELOAD
Linux에서 해킹을 사용하여 argv+env 제한을 우회할 수 있습니다 memfd_create
.