Com o script a seguir, ele funciona (usando mplayer
, que provavelmente não está presente em muitos sistemas).
#!/bin/sh
grep -A 1000 --text -m 1 ^Ogg "$0" | mplayer -
exit
OggS^@^B^@^@^@^@^@^@^@^@^]f<8a>g^@^@^@^@lY߸^A^^^Avorbis^@^@^@^@^A"V^@^@^...
A última linha é o começo do binário do arquivo de áudio.
O comando grep
procura a primeira ocorrência de Ogg no arquivo $0
(que é o próprio arquivo de script) e imprime 1000 linhas depois dessa linha (é suficiente para meu pequeno áudio arquivo de teste). A saída de grep
é então canalizada para mplayer
, que está lendo /dev/stdin
(abreviação de /dev/stdin
is -
).
Eu criei esse arquivo concatenando o arquivo de script playmeBashScript.sh
com o arquivo de áudio sound.ogg
:
cat playmeBashScript.sh sound.ogg > playme.sh
Uma versão mais geral e um pouco mais curta com sed
em vez de grep
(graças ao Elias):
#!/bin/sh
sed 1,/^exit$/d "$0" | mplayer -
exit
OggS^@^B^@^@^@^@^@^@^@^@^]f<8a>g^@^@^@^@lY߸^A^^^Avorbis^@^@^@^@^A"V^@^@^...
Nesse caso, sed
seleciona todas as linhas do número um até a linha onde encontra a palavra exit e as exclui. O restante é colado e canalizado para mplayer
. É claro que isso só funciona se a palavra sair ocorrer apenas uma vez no script antes dos dados binários.