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}< <(...)
.