sh shell中的自解压脚本

时间:2013-12-24 10:11:30

标签: shell sh self-extracting

如何制作可在sh上执行的自解压存档?

我最接近的是:

extract_archive () {
    printf '<archive_contents>' | tar -C "$extract_dir" -xvf -
}

<archive_contents>包含带有空字符的tarball,%'\字符转义并包含在单引号之间。

有没有更好的方法来做到这一点,以便不需要转义?

(请不要指向sharmakeself等。我想从头开始写。)

4 个答案:

答案 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本机完成。

  1. 构建xtar elf64 tar自解压程序头(您可以随意对其进行修改以支持elf32,pe和其他可执行格式),它基于轻量级bsdtar untar和std elf lib。

    cc contrib/xtar.c -o ./xtar
    
  2. xtar二进制文件复制到yourTar.xtar

    cp ./xtar yourTar.xtar
    
  3. yourTar.tar存档附加到yourTar.xtar的末尾

    cat yourTar.tar >> yourTar.xtar
    chmod +x yourTar.xtar