2016-07-09 3 views
0

이것이 가능한지 확신 할 수는 없지만 나는 종종 그런 생각을하고 일부 솔루션은 저를 놀라게했습니다. while 루프 안에 내가 원하는 않는여분의 프로세스를 만들지 않고 스크립트에서 inotifywait -m을 사용 하시겠습니까?

#!/bin/bash 

EVENTS="CREATE,CLOSE_WRITE,DELETE,MODIFY,MOVED_FROM,MOVED_TO" 
inotifywait -e "$EVENTS" -m -r ~/Desktop/testing | \ 
    while true; do 
    read TMP 
    echo "${TMP}" >> ~/Desktop/eventlog 
    done 

주 : 두 개의 프로세스를 생성하지 않고 다음 스크립트의 동등한를 만들 수 있습니다 (이 경우, 파이프가 있기 때문에 두 개의 프로세스가 생성됩니다 분명하다) 이벤트에 액세스 할 수 있습니다.

우리는 하나의 프로세스로 작성하고 다른 프로세스에서 읽을 필요가 있기 때문에 파이프가 필요하다고 생각됩니다. 그러나 트릭이있을 수 있습니까?

답변

2

을 할 찾고있는 무슨에 관한 세부 사항을 수행 할 수 있습니다 추가하십시오 - 당신이 다른 뭔가가 있다면 나에게 예를

도중 밖으로 낚시를하려면 아래의 lastpipe 옵션을 설정하여 while 루프를 별도의 프로세스 대신 현재 셸에서 실행할 수있게하십시오.

shopt -s lastpipe 
inotifywait -e "$EVENTS" -m -r ~/Desktop/testing | 
    while true; do 
    read TMP 
    echo "${TMP}" >> ~/Desktop/eventlog 
    done 

은 (bash이 선는 문자로 끝날 수 없습니다 것을 알고 있기 때문에 당신의 | 후 명시 적으로 행 계속 필요하지 않습니다.)

+0

아, 네, 제가이 일을 성취하려고 노력하고 있습니다. 흥미롭게도, 어떻게 구현할 수 있는지 궁금합니다. 나는 그들이 새로운 프로세스를 만드는 대신 새로운 스레드를 생성한다고 생각하니? 사람이 글을 쓰고 있고 읽는다면 두 가지 "일이 있어야합니다"라고 생각됩니다. 나는 두 개의 스레드를 추측한다. –

+0

아니요. 두 개의 새 프로세스를 포크하지 않고 대기중인 대신 현재 프로세스의 첫 번째 명령을 새 프로세스와 루프에서 실행합니다. – chepner

1

루프가 완료되면 for 루프에서 수정 된 변수가 값을 잃지 않도록 보조 스크립트를 피한다고 가정하는 것이 맞습니까? 그냥 교환 할 수있는 경우

while read TMP; do 
    echo "${TMP}" >> ~/Desktop/eventlog 
done < <(inotifywait -e "$EVENTS" -m -r ~/Desktop/testing) 

같은하지만 당신이 핸들에서 읽은 후 파일 핸들로 리디렉션 할 수 있습니다 당신은 당신의 코드 흐름의 유연성에 대해 우려하는 경우 때마다 코멘트 , bash 4.2에서 실제로

+0

이 대답을 당신을 감사드립니다. 나는 그것을 공부할 것이다. 내 요청에 명확하지 못한 점에 대해 유감스럽게 생각합니다. 루프에서 두 개의 프로세스를 실행하고 싶지 않았습니다. chepner는 내가 바라는 해답을 가지고 있습니다. 친절합니다. –