Bash가 스크립트를 실행하면 ls -la /proc/<pid of bash>/fd
"255 -> /path/to/script"가 표시됩니다. 나는 bash가 파일 설명자 255를 통해 스크립트를 읽고 명령을 한 줄씩 실행한다고 생각합니다.
그러나 bash가 스크립트를 받았을 때 나는 ls -la /proc/<pid of bash>/fd
그것을 찾을 수 없습니다 cat /proc/<pid of bash>/maps
.
질문이 있습니다. bash가 스크립트를 받으면 bash는 스크립트를 어떻게 읽나요? 스크립트 파일을 읽는 특별한 방법이 있나요?
답변1
문득 상황을 분석해 보고 싶은 생각이 떠올랐다 strace
.
처음 실행하면 출력은 strace -f -p <pid>
다음과 같습니다.
openat(AT_FDCWD, "./test", O_RDONLY) = 3...
[pid 3408] dup2(3, 255) = 255
[pid 3408] 닫힘(3) = 0
"test"는 실행할 쉘 스크립트입니다. "3408"은 서브쉘의 pid입니다. "test"는 파일 설명자 3에서 열리고 파일 설명자 255에 복사됩니다. 따라서 ls -la /proc/<pid of bash>/fd
"255 -> /some/directory/test"가 표시됩니다.
그러나 스크립트를 가져올 때 "test"가 열리고 버퍼로 읽혀진 다음 즉시 닫힙니다. 따라서 ls -la /proc/<pid of bash>/fd
위와 같은 항목은 표시되지 않습니다.
bash가 왜 이런 식으로 구현하는지 모르겠습니다.