"파일 설명자"를 "읽는 동안" 열 수 있는 경우 "실행"이 필요한 이유는 무엇입니까?

"파일 설명자"를 "읽는 동안" 열 수 있는 경우 "실행"이 필요한 이유는 무엇입니까?

bash, tail을 사용하고 다른 파일 설명자를 사용하여 파일을 한 줄씩 읽고 싶습니다. 모든 가이드는 다음 방법을 사용합니다.

방법 1:

echo 1111111 > z.txt
exec {newFD}< <(tail -f -c +0 "z.txt")

while IFS= read -r LINE0 <&${newFD}
do
    printf '%s' "$LINE0"
done

그러나 이 접근 방식은 다음과 같이 작동합니다.

방법 2:

echo 1111111 > z.txt
while IFS= read -r LINE0 <&${newFD}
do
    printf '%s' "$LINE0"
done {newFD}< <(tail -f -c +0 "z.txt")

두 번째 방법을 사용하는데 문제가 있나요?

exec왜 두 번째 방법이 필요하지 않습니까 ? 감사해요.


{newFD}가 자동으로 무료 파일 설명자를 제공했습니다. 이 기능은 bash 4.1+(2009-12-31)부터 사용할 수 있습니다. {varname} 스타일 자동 파일 설명자 할당

답변1

넌 몰라. 두 경우 모두 새 파일 설명자를 할당하고 에 저장하고 newFD프로세스 교체에서 읽습니다. 기능상의 차이는 없습니다. 오류 동작은 둘 사이에서 약간 다를 수 있지만 이 경우에는 명확하지 않습니다.

접근 방식 1은 fd의 수명 주기에 대해 더 투명할 수 있으며(어떤 경우에도 해당 범위는 while 루프로 제한되지 않음) 소스를 사용되는 위치에 더 가깝게 만들 수 있습니다. 명확성을 위해 이렇게 쓰는 것이 좋을 수도 있지만 실제로는 차이가 없습니다. 어느 쪽이든 나중에 파일 설명자를 닫아야 합니다.

원하는 스타일로 작성할 수 있습니다. 둘 다 괜찮습니다.


while read파일 설명 자는 열리지 않습니다.모든 명령에 대해 존재하는 일반적인 쉘 리디렉션 작업명령과 함께 while또는 명령으로 발생합니다. exec루프는 while단일 복합 명령으로 처리되며 호출 셸 내에서 실행됩니다. 명령에 첨부할 수 있는 모든 일반적인 항목은 while 루프와 함께 사용할 수도 있습니다.

가지다일부표준 IO 스트림(또는 다른 열린 FD)을 리디렉션할 때 리디렉션의 특수 동작 exec: 실제 명령을 실행하는 하위 쉘의 환경뿐만 아니라 현재 쉘의 환경을 영구적으로 조작합니다. 그러나 이 경우에는 적용되지 않습니다 {newFD}< ....

이와 같이 새 FD를 동적으로 할당할 때 FD는 항상 자식이 아닌 부모에 할당됩니다. 그렇지 않으면 변수가 쓸모 없게 됩니다. 이것은 의미한다어느명령은 작동합니다

: <{newFD} <(...)

같은 일을 하십시오 exec {newFD}< <(...).

관련 정보