我需要编写一个 bash 程序,该程序运行的命令回显到它读取的命名管道,但仅在发送命令时我无法让它工作。它不断重复上一个命令,直到写入新命令。
那是:
- 执行
./read_pipe.sh
- 它会等待直到命令被回显
pipe
并读取它。 - 它执行该命令一次。 <- 什么不起作用。它会永远执行它。
- 从步骤 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
行可能是一个非常糟糕的主意。