while цикл работает только один раз?

Я пытаюсь сделать клип из видеофайла, играя его только на определенный интервал.

make_mclip.sh

#!/bin/bash mediafile=$@ mediafile_fullpath=$PWD/./$mediafile tmpedlfile=$(mktemp) mplayer -edlout $tmpedlfile "$mediafile" &> /dev/null cat $tmpedlfile | while read f do startpos=$(echo $f | awk '{print $1}') endpos=$(echo $f | awk '{print $2}') length=$(echo "$endpos-$startpos" | bc) tmpclip=$(mktemp --suffix='.mclip' --tmpdir=$PWD) echo -e "$mediafile_fullpath\t$startpos\t$length" > $tmpclip mplayer_clip.sh "$tmpclip" &>/dev/null echo -n "clip name : " read clipname < /dev/tty mv -nv "$tmpclip" "$clipname.mclip" done echo doing rm "$tmpedlfile" 

mplayer_mclip.sh

 #!/bin/bash mediafile=$(cat "$@" | awk -F'\t' '{print $1}') startpos=$(cat "$@" | awk -F'\t' '{print $2}') length=$(cat "$@" | awk -F'\t' '{print $3}') mplayer -ss $startpos -endpos $length "$mediafile" &> /dev/null 

Но по какой-то причине цикл while в make_mclip.sh запускается только один раз, даже если $ tempedlfile содержит более одной строки; единственное исключение – если строка

  mplayer_clip.sh "$tmpclip" &>/dev/null 

удален.

Что не так ?

пс. Я также хотел бы знать, есть ли для этого программа.

One Solution collect form web for “while цикл работает только один раз?”

mplayer «потребляет» оставшееся содержимое tmpedlfile. Вам нужно добавить параметр, чтобы он не игнорировал его stdin:

 mplayer -noconsolecontrols -ss $startpos -endpos $length "$mediafile" &> /dev/null 
  • Как отправить часть данных через канал / файл, а затем в интерактивном режиме?
  • автоматически записывать ответы на программу, которая уже читает со стандарта в
  • Необходимо перенаправить ввод из файла, а также из tty
  • Запустить скрипт heredoc через su, прикрепленный к текущему tty
  • Как программы с программным обеспечением с оболочкой уравновешивают скорость вывода / ввода?
  • Каковы некоторые практические применения перенаправления STDIN?
  • Ввод трубы в нано
  • Инструмент для сжатия / распаковки STDIN
  • Текст заменяет буквально * все * экземпляры строки через stdin, stdout
  • Как перенаправить STDIN фонового процесса?
  • Сценарий Bash, который может направлять поток stdin в программу
  • Linux и Unix - лучшая ОС в мире.