обработка вывода команды линию за линией, не смешивая стандартный вход

Если Вы хотите использовать 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";
        }
    }
'
5
13.04.2017, 15:36
3 ответа
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.

4
27.01.2020, 20:34

Можно использовать другой дескриптор файла:

exec 3< <(find-me-random-mp3s)
while IFS= read -r -u3 path; do mplayer "$path"; done
exec 3<&-
5
27.01.2020, 20:34

Более простое изменение @glenn-jackman's решения, которое должно работать также, я думаю:

while read -u3 path; do mplayer "$path"; done 3< <(find-me-random-mp3s)
2
27.01.2020, 20:34

Теги

Похожие вопросы