Объясните поведение bash
mplayer захавывает stdin и остальные аргументы идут не в read, а в mplayer.
Хотя aplay вроде так не поступает. Пока он проигрывает звук, я могу печатать в консоли.
А можно как-нибудь организовать построчное считывание файла в shell, чтобы не задействовать потоки ввода-вывода?
for i in `cat filename`; do echo $i; done
А чем такой вариант не устраивает?
Вероятно, тем, что оно не построчное.
Я в общем-то таким вариантом и воспользовался, но он не будет работать, если строка содержит whitespaces. Хотелось бы узнать универсальный вариант.
А тогда просто в твоем варианте заставить mplayer не портить stdin чем не подходит?
/usr/bin/mplayer sound.wav 0</dev/null
ну либо скажи, чего в итоге то должно получиться, тогда будет проще предлагать варианты
Не очень понял, что тут перестает работать, если будут whitespac-ы, ну да ладно.Ну представь, что будет, если во входном файле будут не просто слова, а целые предложения. А хочется, чтобы в $i была строка. Получится же:
$ cat input.txt
the first
the second
the third
the fourth
the fifth
$ for i in `cat input.txt`; do echo "line: $i"; done
line: the
line: first
line: the
line: second
line: the
line: third
line: the
line: fourth
line: the
line: fifth
А тогда просто в твоем варианте заставить mplayer не портить stdin чем не подходит?Так это как раз и есть то самое универсальное решение, которое я хотел услышать!
Оно оказалось несколько очевиднее, чем я предполагал.
ну либо скажи, чего в итоге то должно получиться, тогда будет проще предлагать вариантыВообще говоря, я перебирал различные параметры для модуля драйвера звуковой карты.
IFS The Internal Field Separator that is used for word splitting after expansion and to split lines into words with the read builtin command. The default value is ``<space><tab><newline>''.
#!/bin/bash
DEFAULT_IFS=$IFS
IFS=$'\n'
for i in $(cat input.txt)
do
echo "line: $i"
done
IFS=$DEFAULT_IFS
$ ./play.sh
line: the first
line: the second
line: the third
line: the 500
Оставить комментарий
dangerr
Допустим, есть файл такого содержания:Если я напишу такой скрипт:
то получу такой вывод:
То есть цикл выполнится один раз.
То же самое будет, если заменить mplayer на aplay.
Если же закоментить строку с воспроизведением звука, либо заменить например на sleep 5, то цикл, как и предполагалось, проходит нормально:
Что за...
Я, может, где-то туплю, но получается, что воспроизведение звука как-то влияет на работу цикла while в bash... либо read начинает ненулевое значение возвращать...