입력이 기록될 때마다 명명된 파이프를 읽습니다.

입력이 기록될 때마다 명명된 파이프를 읽습니다.

읽는 명명된 파이프에 에코되는 명령을 실행하는 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줄의 주석 처리를 제거하는 것은 아마도 매우 나쁜 생각일 것입니다.

관련 정보