Посмотрите Настраивают меню Xfce на сайте XFCE.
Вы правы в этом echo
И компания, кажется, не обрабатывает двоичный файл настолько хорошо. Я подозреваю, что нулевые символы повреждают поток слишком рано.
Можно преобразовать информацию об изображении в некотором основанном на ASCII формате. Например, это с base64
:
$ pic=`base64 pic.jpeg`
$ echo $pic | base64 --decode > pic2.jpeg
$ diff pic*
$ echo $?
0
Проблема в том, что нулевые байты не могут передаваться через аргументы командной строки, поскольку они используются внутри как терминаторы аргументов. Все остальные байты вроде в порядке. Таким образом, несколько более компактной (обычно) альтернативой использованию base64
было бы экранирование нулевых байтов, а затем использование printf
для преобразования данных в исходную форму:
pngString="$(sed 's/\\/\\\\/g;s/%/%%/g;s/\x00/\\x00/g' <example.png)"
printf "$pngString" >tmp.png
\
и %
символы являются специальными для printf
, поэтому их тоже нужно экранировать.
Также обратите внимание, что если входные данные заканчиваются новой строкой, они будут удалены при подстановке команд. Это не должно быть проблемой специально для PNG, поскольку последний байт в допустимом PNG должен иметь значение 0x82, младший байт в сумме CRC пустого блока IEND
.
echo "$pic" | base64 --decode > pic2.jpeg
– OldTimer 01.01.2014, 01:54