Cамораспаковывающийся архив
Привожу заготовку для скрипта который содержит в себе архив.
#!/bin/sh sed -e '1,/^END_OF_SCRIPT$/d' $0 | base64 -d | tar -xj exit END_OF_SCRIPT
после слова "END_OF_SCRIPT" можно запулять какой нибудь tar.bz2 архивчег. например так
$ cat myrch.tar.bz2 | base64 >> scriptname.shв зависимости от того какой архив и как вы его туда запулили меняется также и комманды распаковки.
авторство скрипта пренадлежит ramok
- 2237 просмотров
Страница для печати

Возможно, я что-то делаю не так, но у меня скрипт нормально заработал только в таком виде:
все верно. если tar берет архив из стандартного потока то флаг -f можно не указывать, и не нужно ставить -. если указывать -f то вместо имени файла нужно -
PS
и вообще тут можно обойтись без base64. конечно не кошерно когда в скрипте будет двоичный файл, но например инсталятор от nvidia так и делает
Без exit перед END_OF_SCRIPT и тоже не обойтись -- ругается на много неизвестных команд
Видимо, exec перед командой и предназначался для того, чтобы заместить текущий шелл и прекратить работу скрипта на этой команде, однако на практике этого не происходит, поскольку exec относится только к первой команде (
sed -e '1,/^END_OF_SCRIPT$/d' $0). Например, в результате выполнения скрипта:#!/bin/bash
exec echo 1
echo a
будет показано только число 1, а следующий скрипт:
#!/bin/bash
exec echo 1|sed s/1/2/
echo a
покажет две строки: "2" и "a".
Обойти такое поведение не получится, поскольку exec не позволяет использовать пайпы в команде, поэтому лучше не заморачиваться с one-liner'ами, а добавить exit для нормального выхода перед строками, не предназначающимися для выполнения.
да ты прав
я подправил как надо
О! сспасиб огромное! давно, ну не то чтобы искал, но очень хотел знать как это делается.
Отправить комментарий