Я попытался написать сценарий оболочки, который создает еще один самораспаковывающийся tar-архив, заархивированный и закодированный в base64. Я не знаю, куда идти, и у меня практически нет опыта написания сценариев оболочки.
Так как этот скрипт создает tar-архив, который заархивирован и закодирован, но самораспаковка не работает, когда я пытаюсь запустить ./tarName
из терминала. Любой совет приветствуется
#!/bin/sh
tarName=$1;
if [ -e $tarName.tar.gz ]
then /bin/echo "$tarName already exists"
exit 0
fi
shift;
for files;
do
tar -czvf tmpTarBall.tar.gz $files;
done
echo "#!/bin/sh" >> $tarName.tar.gz;
echo "base64 -d $tarName.tar.gz" >> $tarName.tar.gz;
echo "tar -xzvf $tarName.tar.gz" >> $tarName.tar.gz;
chmod +x ./$tarName.tar.gz;
base64 tmpTarBall.tar.gz >> $tarName.tar.gz;
rm tmpTarBall.tar.gz;
----------ОБНОВИТЬ
Немного осмотрелся, и это то, что у меня есть сейчас, все еще не работает. Может ли кто-нибудь объяснить мне, почему?
#!/bin/sh
tarName=$1;
if [ -e $tarName.tar.gz ]
then /bin/echo "$tarName already exists"
exit 0
fi
shift;
for files;
do
tar -czvf tmpTarBall.tar.gz $files;
done
cat > extract.sh;
echo "#!/bin/sh" >> extract.sh;
echo "sed '0,/^#TARBALL#$/d' $0 | $tarName.tar.gz | base64 -d | tar -xzv; exit 0" >> extract.sh;
echo "#TARBALL#" >> extract.sh;
cat extract.sh tmpTarBall.tar.gz > $tarName.tar.gz;
chmod +x ./$tarName.tar.gz;
rm extract.sh tmpTarBall.tar.gz;
Когда я пытаюсь запустить tarName.tar.gz, я получаю ошибки: ./tarName.tar.gz: 2: ./tarName.tar.gz: tarName.tar.gz: not found gzip: stdin: неожиданный конец файла tar : дочерний элемент вернул статус 1 tar: ошибка неустранима: выход сейчас
exit 1
когда что-то идет не так —exit 0
указывает на успех. Вы должны заменить циклfor
только наtar -czvf tmpTarBall.tar.gz "$@"
, чтобы поместить все файлы в архив. Опцияc
каждый раз создает файл tar; поэтому вы сохранили только последний файл в списке. - person Jonathan Leffler   schedule 10.03.2016-b num
для установки длины строки в закодированном выводе изbase64
(это правильно для Mac OS X; есть шанс, что версия GNU использует другой параметр). - person Jonathan Leffler   schedule 11.03.2016