bash: 루프 조건과 본문에 서로 다른 입력 스트림을 사용합니다.

bash: 루프 조건과 본문에 서로 다른 입력 스트림을 사용합니다.

다음과 같은 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

질문:

  1. 이것이 최선의 해결책입니까?

  2. 파일 설명자 3을 사용하는 것이 안전/권장됩니까? fd 번호가 높을수록 충돌이 발생할 확률이 낮아지지 않습니까?

답변1

명령에 대해 별도의 파일 설명자를 사용하는 것이 read좋은 해결책입니다.

이를 수행하려면 3에서 9 사이의 파일 설명자를 사용할 수 있어야 합니다. 쉘은 이를 다른 목적으로 사용하지 않습니다. 파일 설명자 0, 1, 2만 미리 정의된 목적을 가지며가능한9보다 큰 값을 가진 설명자를 사용하는 것이 가능하다는 것이 밝혀졌지만 그러한 보장은 없습니다.

이것POSIX 표준에 따르면:

열린 파일은 0부터 시작하는 십진수로 표시됩니다. 그러나 가능한 최대값은 구현에 따라 정의됩니다.모든 구현은 애플리케이션에서 사용할 수 있도록 최소 0~9(포함)를 지원해야 합니다.이 숫자를 "파일 설명자"라고 합니다.0, 1, 2 값은 특별한 의미를 갖습니다.일반적인 용도로 사용되며 특정 리디렉션 작업에 의해 암시되며 각각 표준 입력, 표준 출력 및 표준 오류라고 합니다.

9보다 큰 파일 설명자를 사용하는 것은 사용하는 셸 수와 셸에 따라 위험할 수 있습니다.

  • bashFD 255는 내부적으로 사용됩니다.
  • zsh, 내부적으로 fd 10을 사용 dash합니다 pdksh.
  • ksh93fd 3을 사용하는 것 같습니다(그러나 이것은 버그인 것 같습니다. 현재 파일 시스템 마운트 지점으로 사용되는 디렉터리에 연결됩니다).

관련 정보