Со следующим сценарием это работает (использование mplayer
, который является, вероятно, не подарком во многих системах).
#!/bin/sh
grep -A 1000 --text -m 1 ^Ogg "$0" | mplayer -
exit
OggS^@^B^@^@^@^@^@^@^@^@^]f<8a>g^@^@^@^@lY߸^A^^^Avorbis^@^@^@^@^A"V^@^@^...
Последняя строка является началом двоичного файла звукового файла.
grep
управляйте ищет первое вхождение Ogg в файле $0
(который является самим файлом сценария), и печатает 1 000 строк после той строки (достаточно для моего маленького аудио тестового файла). Вывод grep
затем передается по каналу к mplayer
который читает /dev/stdin
(сокращение для /dev/stdin
-
).
Я создал этот файл путем конкатенации файла сценария playmeBashScript.sh
со звуковым файлом sound.ogg
:
cat playmeBashScript.sh sound.ogg > playme.sh
Более общая и немного более короткая версия с sed
вместо grep
(благодаря Elias):
#!/bin/sh
sed 1,/^exit$/d "$0" | mplayer -
exit
OggS^@^B^@^@^@^@^@^@^@^@^]f<8a>g^@^@^@^@lY߸^A^^^Avorbis^@^@^@^@^A"V^@^@^...
В этом случае sed
выбирает все строки из номера один до строки, где это находит, что слово выходит, и удаляет их. Остальное вставляется и передается по каналу к mplayer
. Конечно, тот единственные работы, если выход слова происходит только однажды в сценарии перед двоичными данными.
Ваш сценарий должен содержать также связанные данные:
#!/bin/sh
TMPFILE=$(mktemp)
trap "rm ${TMPFILE}" 0 1 2 3 11 15
tail -n +7 $0 ${TMPFILE}
exec mplayer ${TMPFILE}
Давайте назовем сценарий omniplay
. Таким образом, Вам нужно кошке Ваше добавление ogg-файла к сценарию:
cat file.ogg >> omniplay
chmod +x omniplay
./omniplay
Это - стандартный метод, используемый многими install.sh файлами. Посмотрите также для gzexe
. Можно также скорректировать строки хвоста.
sed 1,/^Ogg/d "$0" | mplayer -
вместо этого. – elias 07.02.2014, 18:24Ogg
часть звукового файла (первые три байта из него), и Ваша команда удаляет эту строку (насколько я понимаю это). Если я применяю Вашу команду к своему playme.sh файлу, вывод к маленькому, не играет. очень верный – erik 07.02.2014, 18:42sed 1,/^BEGIN_FILE/d "$0" | mplayer -
. Я просто думал, что это могло быть более общее решение. =) – elias 07.02.2014, 18:44-A
опция. Я изменю свой ответ. – erik 07.02.2014, 18:46