다음과 같은 while 루프가 있는 스크립트가 있습니다.
while IFS= read -r name; do
{body}
done < names.txt
루프 조건에서는 파일에서 이름을 읽어야 하지만 {body}
stdin에서 읽어야 합니다. 위의 스크립트는 {body}
파일에서 읽어야 하는데 이는 오류입니다.
다른 FD로 문제를 해결할 수 있습니다.
while IFS= read -r name <&3; do
{body}
done 3< names.txt
질문:
이것이 최선의 해결책입니까?
파일 설명자 3을 사용하는 것이 안전/권장됩니까? fd 번호가 높을수록 충돌이 발생할 확률이 낮아지지 않습니까?
답변1
명령에 대해 별도의 파일 설명자를 사용하는 것이 read
좋은 해결책입니다.
이를 수행하려면 3에서 9 사이의 파일 설명자를 사용할 수 있어야 합니다. 쉘은 이를 다른 목적으로 사용하지 않습니다. 파일 설명자 0, 1, 2만 미리 정의된 목적을 가지며가능한9보다 큰 값을 가진 설명자를 사용하는 것이 가능하다는 것이 밝혀졌지만 그러한 보장은 없습니다.
열린 파일은 0부터 시작하는 십진수로 표시됩니다. 그러나 가능한 최대값은 구현에 따라 정의됩니다.모든 구현은 애플리케이션에서 사용할 수 있도록 최소 0~9(포함)를 지원해야 합니다.이 숫자를 "파일 설명자"라고 합니다.0, 1, 2 값은 특별한 의미를 갖습니다.일반적인 용도로 사용되며 특정 리디렉션 작업에 의해 암시되며 각각 표준 입력, 표준 출력 및 표준 오류라고 합니다.
9보다 큰 파일 설명자를 사용하는 것은 사용하는 셸 수와 셸에 따라 위험할 수 있습니다.
bash
FD 255는 내부적으로 사용됩니다.zsh
, 내부적으로 fd 10을 사용dash
합니다pdksh
.ksh93
fd 3을 사용하는 것 같습니다(그러나 이것은 버그인 것 같습니다. 현재 파일 시스템 마운트 지점으로 사용되는 디렉터리에 연결됩니다).