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