일부 파일을 모니터링하기 위해 entr을 사용하려고 합니다.
내 스크립트는 다음 예를 기반으로 합니다.
do_it(){ echo Eita!; }
while true; do ls folder/* more-folder/* | entr -pd do_it; done
>> entr: exec do_it: No such file or directory
그러나 이것은 작동합니다:
while true; do ls folder1/* folder2/* | entr -pd echo Eita!; done
내가 뭘 잘못했나요?
답변1
"while" 루프의 파이프는 별도의 하위 쉘에서 실행됩니다. 함수가 내보내지지 않기 때문에 do_it
실행 중인 올바른 하위 쉘은 entr
이에 대해 알지 못합니다. 가장 짧은 해결책은 함수를 내보내는 것입니다(bash에서는 이를 허용합니다).
do_it(){ echo Eita!; }
export -f do_it
while true; do ls folder/* more-folder/* | entr -pd do_it; done
명령이 디스크에서 작업을 수행하려는 경우 entr
함수를 스크립트 파일에 넣고 entr
다음을 가리키는 것이 좋습니다.저것.
파일 이름은 /path/to/do_it입니다.
#!/bin/sh
echo Eita!
파일이 실행 가능한지 확인하십시오.
chmod +x /path/to/do_it
새로운 명령줄:
while true; do ls folder/* more-folder/* | entr -pd /path/to/do_it; done
답변2
entr의 프로그래머가 대답했습니다(https://github.com/eradman/entr/issues/6): "함수는 서브쉘로 내보낼 수 있지만 외부 프로그램에서는 함수를 실행할 수 없습니다. 쉘 함수를 실행하려면 다음과 같이 루프를 작성할 수 있습니다."
do_it(){ echo 'Eita!'; }
while true; do
ls folder1/* folder2/* | entr -pd -s 'kill $PPID'
do_it
done