나는 이 코드를 가지고 있습니다 :
inotifywait -m -e close_write src/lips.js ./test_port.scm | \
while read x; do ./test_port.scm; done
문제는 내 스크립트가 inotifywait가 생성하는 것을 읽는다는 것입니다. 그래서 내 질문은: 이 스크립트가 표준 입력에서 읽는 경우 모든 파일 변경 시 test_port.scm을 실행하는 올바른 방법은 무엇입니까?
고쳐 쓰다:
글쎄요, 이렇게 작동합니다. 입력을 기다리기 위해 스크립트를 실행하도록 변경했습니다. 하지만 텍스트 입력이 작동하지 않습니다. 다시 저장하면 다음과 같은 결과를 얻습니다.
./test_port.scm CLOSE_WRITE,CLOSE
>>> ./test_port.scm CLOSE_WRITE,CLOSE
내 코드는 다음과 같습니다
(display (string-append ">>> " (read-line)))
(newline)
한 줄을 읽고 인쇄하기 위한 구성표 코드, 코드는 이면에서 더 복잡합니다. 실제로 한 줄을 읽어야 하는 것은 Node.js + Readline입니다.
var interp = Interpreter('repl', {
stdin: InputPort(function() {
return new Promise(function(resolve) {
rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('', function(data) {
resolve(data);
rl.close();
});
});
}),
문제가 있는 것 같아서 while read x;
여기에 질문을 드립니다.
고쳐 쓰다:
내 실제 문제는 모든 파일 변경 시 스크립트를 실행하고 스크립트가 stdin을 읽어야 한다는 것입니다. 실제로 inotifywait인지는 상관하지 않지만 이것이 파일 변경 시 실행되는 유일한 솔루션입니다.
답변1
일반적인 접근 방식은 전체 파이프를 목록으로 래핑하고 표준 입력으로 사용되는 파일 설명자를 복사한 다음 명령의 표준 입력을 루프 본문으로 리디렉션하여 새 파이프에서 읽도록 하는 것입니다.
{
inotifywait -m -e close_write src/lips.js ./test_port.scm |
while read x; do
./test_port.scm 0<&3
done
} 3<&0
이는 기본적으로 를 사용하는 것과 동일합니다 /dev/tty
.호크 라킨의 답변이는 사실이지만 터미널이 아닌 외부 표준 입력도 허용합니다.
그러나 이 솔루션에서는 파일 이름에 개행 문자가 포함되지 않아야 합니다. 각 이벤트에 대해 루프 본문이 여러 번 실행되도록 합니다(변수에 대해 거짓 값 사용 x
). 사용법에 따라 옵션을 inotifywait
통해 --format
파일 이름이 인쇄되지 않도록 할 수 있습니다.
답변2
inotifywait -m -e close_write src/lips.js ./test_port.scm |
while read x; do
./test_port.scm </dev/tty
done
답변3
방금 슈퍼유저에서 찾았어요파일이 변경될 때 명령을 실행하는 방법은 무엇입니까?
대체 호출도 있습니다.
while inotifywait -q -e close_write myfile.py; do ./myfile.py; done
또는 inotifywait
아무것도 인쇄하지 않으려면 다음을 수행하세요.
while inotifywait -qq -e ...