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

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

我需要编写一个 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

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

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

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

答案1

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

tail -f $pipe | sh & 

不需要循环。

答案2

一种方法是:

#! /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

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

相关内容