Внедрение файла внутрь скрипта BASH

Требуется внедрить файл внутрь скрипта, чтобы у программы не имелось дополнительных файлов, кроме самого скрипта(test.sh)

У нас имеется скрипт следующего вида:

#!/bin/bash

play sound.mp3

printf "Успех"

Требуется заменить [play sound.mp3] на [play "$HEX_CODE"](заменить переменную названия файла на hex-код этого файла или что-то другое). Прошу не предлагать расположить файл в другой директории или инструменты упаковки. Хотелось бы сделать программу портативной и короссплатформенной


Ответы (2 шт):

Автор решения: eri

Кодируешь файл в аски : можно хекс, но мне по душе 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 у меня работает лучше на коротких звуках.

→ Ссылка
Автор решения: Ivan

Можно еще вот так, с предварительным вырезанием муз.файла, архива и т.д. добавленного в конец скрипта, подготовка скрипта с файлом:

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__
→ Ссылка