Bash
如何使用 inotifywait 呼叫從標準輸入讀取的腳本
我有這個程式碼:
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;
這就是我在這裡問的原因。更新:
我的實際問題是我想在每次文件更改時執行腳本,並且腳本需要讀取標準輸入,我實際上不在乎它是否是 inotifywait,但這是我發現的在文件更改時執行的唯一解決方案。
inotifywait -m -e close_write src/lips.js ./test_port.scm | while read x; do ./test_port.scm </dev/tty done
一般的方法是將整個管道包裝為一個列表,複製用作其標準輸入的文件描述符,並將命令的標準輸入重定向到循環體中,以使其從新的讀取:
{ inotifywait -m -e close_write src/lips.js ./test_port.scm | while read x; do ./test_port.scm 0<&3 done } 3<&0
這基本上相當於 using
/dev/tty
,就像Hauke Laging 的回答一樣,但它也允許外部標準輸入不是終端。但是請注意,此解決方案要求文件名不包含換行符:它們會使循環的主體對每個事件執行不止一次(
x
變數的虛假值)。根據您的案例,您可以通過其選項阻止inotifywait
列印文件名。--format