A shell archive or shar file is a single file that contains one or more other files. Files are extracted from the archive with the standard UNIX . A shell archive usually doesn't let you save and restore complete directory hierarchies like and do, but it is completely portable and, as a result, is used extensively on Usenet, an international network with many UNIX systems.
|shar||In the Bourne shell, means to take the following lines, up to a specified string, as input to a command. (This is often called a here document.) Using this syntax and the and commands, you can write a simple shell archiver (shar) like the one below. Incidentally, many systems already have shar programs in place; there are several freely available versions, including the one on the CD-ROM. Just about any of them are likely to be more sophisticated than the version shown here - but this version shows the essence of how they work:|
#!/bin/sh for file do echo "echo restoring $file" echo "cat > $file << 'XxXxXxXxXx-EOF-XxXxXxXxXx'" cat $file echo "XxXxXxXxXx-EOF-XxXxXxXxXx" done
entirely arbitrary - it just needs to be a string that
won't otherwise appear in the input and can be used
by the shell to recognize when the here document is
When you give shar a list of filenames, it will string those files together on standard output, separating them with that arbitrary string and the commands to split them up again. Simply redirect this output stream to a file to create the archive. For example, the command:
shar file1 file2 > archive.shar
will produce a file called archive.shar that contains the following data:
echo restoring file1 cat > file1 << 'XxXxXxXxXx-EOF-XxXxXxXxXx' ... Text of file1 will be stored here ... XxXxXxXxXx-EOF-XxXxXxXxXx echo restoring file2 cat > file2 << 'XxXxXxXxXx-EOF-XxXxXxXxXx' ... Text of file2 will be stored here ... XxXxXxXxXx-EOF-XxXxXxXxXx
When this archive is run through sh, the commands
it contains will be executed.
Each here document
(the lines from each
cat up to the next
XxXxXxXxXx-EOF-XxXxXxXxXx) will be output
to a file:
sh archive.sharrestoring file1 restoring file2 $
lsarchive.shar file1 file2
Theprogram does essentially the same thing.
NOTE: You should never blindly run a shell archive supplied by someone you don't know personally. An unscrupulous prankster could easily include a "Trojan horse" command (like
rm *) in the middle of a seemingly innocuous archive, and cause you a lot of trouble. An easy way to do this is by browsing through the archive with the search command in a program like . Use the search command (in more, the command is
/) to find each end-of-file string (like
XxXxXxXxXx); look carefully at the commands between it and the
catthat starts the next file. Of course, if the files in the shell archive are programs themselves, you should also check them before they're executed.