Self-extracting script in sh shell

user2064000 picture user2064000 · Dec 24, 2013 · Viewed 8.7k times · Source

How would I go about making a self extracting archive that can be executed on sh?

The closest I have come to is:

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

Where <archive_contents> contains a tarball with null characters, %, ' and \ characters escaped and enclosed between single quotes.

Is there any better way to do this so that no escaping is required?

(Please don't point me to shar, makeself etc. I want to write it from scratch.)

Answer

loentar picture loentar · Dec 24, 2013

Alternative variant is to use marker for end of shell script and use sed to cut-out shell script itself.

Script selfextract.sh:

#!/bin/bash

sed '0,/^#EOF#$/d' $0 | tar zx; exit 0
#EOF#

How to use:

# create sfx
cat selfextract.sh data.tar.gz >example_sfx.sh

# unpack sfx
bash example_sfx.sh