3

我将如何制作一个可以执行的自解压存档sh

我最接近的是:

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

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

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

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

4

4 回答 4

14

另一种变体是使用标记结束 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
于 2013-12-24T11:41:23.427 回答
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
于 2013-12-24T11:27:36.870 回答
1

一些关于如何做到这一点的好文章可以在以下位置找到:

于 2016-05-27T04:47:13.050 回答
0

是的,您可以使用xtar.

  1. 构建xtarelf64 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
    
于 2020-04-13T09:34:44.867 回答