Внедрение файла внутрь скрипта BASH
Требуется внедрить файл внутрь скрипта, чтобы у программы не имелось дополнительных файлов, кроме самого скрипта(test.sh)
У нас имеется скрипт следующего вида:
#!/bin/bash
play sound.mp3
printf "Успех"
Требуется заменить [play sound.mp3] на [play "$HEX_CODE"](заменить переменную названия файла на hex-код этого файла или что-то другое). Прошу не предлагать расположить файл в другой директории или инструменты упаковки. Хотелось бы сделать программу портативной и короссплатформенной
Ответы (2 шт):
Кодируешь файл в аски : можно хекс, но мне по душе base64.
base64 sound.mp3 > sound.mp3.b64
В своем bash скрипте пиши
(base64 -d | play -t mp3 - ) << EOFSOUND
EOFSOUND
Метка EOFSOUND не должна присутствовать в закодированном файле. Можно использовать любое слово, но если писать EOF, то скрипт будет понятнее(по буквам EOF хорошо гуглится эта конструкция для новичков). EOF переводится как конец файла. А оператор << указывает что дальше идет встроенный документ до следующей метки.
Переходишь на пустую строчку межжу словами-маркерами EOFSOUND и вставляй содержимое sound.mp3.b64
Получится простыня
(base64 -d | play -t mp3 - ) << EOFSOUND
//uQZAA....
....
VVVV
EOFSOUND
printf "Успех"
NB. Проверил на play из sox, libsox-fmt-mp3 нужен для проигрывания mp3. Для другого плеера приём выполняется аналогично. ffplay у меня работает лучше на коротких звуках.
Можно еще вот так, с предварительным вырезанием муз.файла, архива и т.д. добавленного в конец скрипта, подготовка скрипта с файлом:
cat script.sh sound.mp3 > script_with_sound.sh
Скрипт:
#!/bin/bash
cat $0 | sed '1,/__SOUND__/d; 1,/__SOUND__/d' > sound.mp3
play -t sound.mp3 && printf "Успех"
exit 0
__SOUND__