2014-12-08 8 views
2

나는 주어진 스크립트에서 내가 추론하고있는 것을 검증하기위한 명확한 단서를 찾을 수 없었다.Bash file descriptor 3 and read line

그래서 file.txt는 파일 설명자 3에 의해 열린 파일이고 타임 스탬프를 기록하는 스크립트로 끊임없이 새 줄을 추가합니다. 새로운 라인이 파일에 추가 될 때마다 다음과 같은 부분이 while 루프를 만드는가?

exec 3 < /path/file.txt 
while read <&3 
    command 
    command.. 
done 

파일 설명자를 닫지 않으면 내 file.txt에 추가 된 새로운 줄은 항상 while 루프를 활성화합니다. 맞습니까?

제발 도와주세요. 감사합니다

+0

자세한 내용은'exec'에 대한 자세한 설명이 필요합니다. http://stackoverflow.com/questions/18351198/what-are-the-uses-of-the-exec-command-in-shell-scripts – xiaowl

답변

4

파일 설명자 3에서 읽으려면 read -u 3 (Bash builtins 참조)을 사용하십시오. 값을 읽을 변수 이름을 지정하는 것을 잊지 마십시오.

read이 EOF를 감지하면 EOF로 유지됩니다. 그 후에 파일에 추가 사항을 추가하지 않습니다. 따라서 파일에 행을 추가하는 코드가이 스크립트의 코드보다 느리면 도달하고 끝 점이되고 루프가 종료됩니다. tail -f 루프까지 완료되지 않을 것

exec 3< <(tail -f /path/file.txt) 

while read -u 3 line 
do 
    command1 
    command2 
done 

참고 : exec을 수행하려는 경우,

while read -u 3 line 
do 
    command1 
    command2 
done 3< <(tail -f /path/file.txt) 

을 또는 : 당신이 원하지 않는 경우, tail -f /path/file.txt 사용을 고려, 너무 어쩌면 process substitution 당신은 어떤 식 으로든 스크립트를 중단합니다.

+0

' read -u 3 '은'exec'으로 디스크립터를 수동으로 열지 않고도 파일 코드 디스크립션으로부터'코드 블록 단위로'리다이렉션을 허용한다. '읽는 동안 <& 3'은 설명자가'exec'으로 열리고'exec 3> & -'와 함께 닫아야합니다. –

2

파일 설명자를 닫지 않으면 새 줄을 내 file.txt에 추가하면 항상 while 루프가 활성화됩니다. 맞습니까?

답변 : 잘못되었습니다. exec 3 < /path/file.txt 리디렉션하는 당신에게 파일 기술자를 사용하여 /path/file.txt에서을 읽을 할 수있는 기능을 제공하지만, 모든 유형의 코드에 /path/file.txt에서을 트리거 할 수 있도록 아무것도하지 않습니다

. 이런 식으로 생각하십시오. 새로운 라인을 /path/file.txt에서가있는 경우 , 당신은 그것을 읽을 수 있지만, 리디렉션은 새로운 라인에 대응하는 코드의 파일에 추가되었는지 여부을 알 수있는 방법을 제공하지 않습니다. 확인하는 것은 귀하의 코드에 달려 있습니다.