Если Вы хотите использовать sed, можно читать из именованного канала. Остерегайтесь тот этот код не пытается справиться с ошибками. Сценарий заблокируется, если динамический заголовок блока будет присутствовать несколько раз.
CONTENT_URL="http://$SERVER/get_config.php"
tmp=$(mktemp -d)
(
cd "$tmp"
mkfifo dynamic_seen dynamic_content
: >dynamic_seen & seen_pid=$!
wget -O dynamic_content "$CONTENT_URL" & wget_pid=$!
sed -e '/^# BEGIN DYNAMIC BLOCK - DO NOT EDIT MANUALLY$/ p' \
-e '/^# END DYNAMIC BLOCK$/ {'
-e p -e 'r dynamic_seen' -e 'r dynamic_content' -e '}' \
-e '/^# BEGIN DYNAMIC BLOCK - DO NOT EDIT MANUALLY$/, /^# END DYNAMIC BLOCK$/ d'
if ! kill $dynamic_seen 2>/dev/null; then
# The pipe hasn't been read, so there was no dynamic block. Add one.
echo "# BEGIN DYNAMIC BLOCK - DO NOT EDIT MANUALLY"
cat dynamic_pipe
echo "# END DYNAMIC BLOCK - DO NOT EDIT MANUALLY"
fi
)
rm -rf "$tmp"
Но я пошел бы для awk.
export CONTENT_URL="http://$SERVER/get_config.php"
awk '
$0 == "# END DYNAMIC BLOCK - DO NOT EDIT MANUALLY" {skip=0; system("wget \"$CONTENT_URL\""); substituted=1}
!skip {print}
$0 == "# BEGIN DYNAMIC BLOCK - DO NOT EDIT MANUALLY" {skip=1}
END {
if (!substituted) {
print "# BEGIN DYNAMIC BLOCK - DO NOT EDIT MANUALLY";
system("wget \"$CONTENT_URL\"");
print "# END DYNAMIC BLOCK - DO NOT EDIT MANUALLY";
}
}
'
exec 3<&0
while read line
do
mplayer "$line" <&3
done < <(find-me-random-mp3s)
Это копирует терминальный вход в дескриптор файла 3. В цикле с условием продолжения stdin везде читается из Вашего find-me-random-mp3s
программа за исключением mplayer
строка, которая получает ее stdin от дескриптора файла 3, который является Вашим терминалом. Следовательно, можно все еще взаимодействовать с mplayer
.
Можно использовать другой дескриптор файла:
exec 3< <(find-me-random-mp3s)
while IFS= read -r -u3 path; do mplayer "$path"; done
exec 3<&-
Более простое изменение @glenn-jackman's решения, которое должно работать также, я думаю:
while read -u3 path; do mplayer "$path"; done 3< <(find-me-random-mp3s)