Bash

如何使用 inotifywait 呼叫從標準輸入讀取的腳本

  • June 22, 2020

我有這個程式碼:

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

引用自:https://unix.stackexchange.com/questions/594454