Fifo

每次寫入輸入時讀取一次命名管道

  • September 9, 2018

我需要編寫一個 bash 程序,該程序執行回顯到它讀取的命名管道的命令,但只有在發送命令時我才能讓它工作。它不斷重複上一個命令,直到寫入新命令。

那是:

  1. 執行./read_pipe.sh
  2. 它一直等到命令回顯pipe並讀取它。
  3. 它執行一次命令。<- 什麼不起作用。它永遠執行它。
  4. 從第 2 步開始重複。

我的read_pipe.sh

#!/bin/bash
pipe="mypipe"
if [ ! -p $pipe ]; then
 echo 'Creating pipe'
 mkfifo $pipe
fi

while true
do
 if read line &lt;$pipe; then
   COMMAND=$(cat $pipe)
   echo "Running $COMMAND ..."
   # sh -c $COMMAND
 fi
done

如果我cat "echo 'Hello World'" &gt; mypipe的輸出永遠是這樣:

Running "echo 'Hello World'" ...
Running "echo 'Hello World'" ...
Running "echo 'Hello World'" ...
Running "echo 'Hello World'" ...
...

如何執行命令一次並等待另一個回顯命令?

一種方法:

#! /usr/bin/env bash
pipe=/path/to/pipe
[ -p "$pipe" ] || mkfifo -m 0600 "$pipe" || exit 1
while :; do
   while read -r cmd; do
       if [ "$cmd" ]; then
           printf 'Running %s ...\n' "$cmd"
           # sh -c "$cmd" sh
       fi
   done &lt;"$pipe"
done

不過,取消註釋該sh行可能是一個非常糟糕的主意。

在您的情況下,您可以簡單地執行以下操作:

tail -f $pipe | sh & 

不需要循環。

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