如何制作可在sh
上执行的自解压存档?
我最接近的是:
extract_archive () {
printf '<archive_contents>' | tar -C "$extract_dir" -xvf -
}
<archive_contents>
包含带有空字符的tarball,%
,'
和\
字符转义并包含在单引号之间。
有没有更好的方法来做到这一点,以便不需要转义?
(请不要指向shar
,makeself
等。我想从头开始写。)
答案 0 :(得分:10)
替代变体是将标记用于shell脚本的结尾,并使用sed来剪切shell脚本本身。
脚本selfextract.sh
:
#!/bin/bash
sed '0,/^#EOF#$/d' $0 | tar zx; exit 0
#EOF#
使用方法:
# create sfx
cat selfextract.sh data.tar.gz >example_sfx.sh
# unpack sfx
bash example_sfx.sh
答案 1 :(得分:3)
由于shell脚本没有编译,但是逐个语句执行,你可以使用这样的模式混合二进制和文本内容(未经测试):
#!/bin/sh
sed -e '1,/^exit$/d' "$0" | tar -C "${1-.}" -zxvf -
exit
<binary tar gzipped content here>
您可以将这两行添加到几乎所有tar + gzip文件的顶部,以使其可自行提取。
测试:
$ cat header.sh
#!/bin/sh
sed -e '1,/^exit$/d' "$0" | tar -C "${1-.}" -zxvf -
exit
$ tar -czf header.tgz header.sh
$ cat header.sh header.tgz > header.tgz.sh
$ sh header.tgz.sh
header.sh
答案 2 :(得分:0)
有关如何做到这一点的一些好文章可以在以下网址找到:
答案 3 :(得分:0)
是的,您可以使用xtar
本机完成。
构建xtar
elf64 tar自解压程序头(您可以随意对其进行修改以支持elf32,pe和其他可执行格式),它基于轻量级bsdtar untar和std elf lib。
cc contrib/xtar.c -o ./xtar
将xtar
二进制文件复制到yourTar.xtar
cp ./xtar yourTar.xtar
将yourTar.tar
存档附加到yourTar.xtar
的末尾
cat yourTar.tar >> yourTar.xtar
chmod +x yourTar.xtar