每次写入输入时读取命名管道一次

Ped*_*ara 9 fifo

我需要编写一个 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 <$pipe; then
    COMMAND=$(cat $pipe)
    echo "Running $COMMAND ..."
    # sh -c $COMMAND
  fi
done
Run Code Online (Sandbox Code Playgroud)

如果我cat "echo 'Hello World'" > mypipe的输出永远是这样:

Running "echo 'Hello World'" ...
Running "echo 'Hello World'" ...
Running "echo 'Hello World'" ...
Running "echo 'Hello World'" ...
...
Run Code Online (Sandbox Code Playgroud)

如何运行命令一次并等待另一个回显命令?

Sat*_*ura 7

一种方法:

#! /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 <"$pipe"
done
Run Code Online (Sandbox Code Playgroud)

sh不过,取消注释该行可能是一个非常糟糕的主意。


Gnu*_*iff 7

在您的情况下,您可以简单地执行以下操作:

tail -f $pipe | sh & 
Run Code Online (Sandbox Code Playgroud)

不需要循环。