sash - stand-alone shell with built-in commands
SYNOPSYS
sash [-c command] [-p prompt] [-q] [-a] [script]
DESCRIPTION
The sash program is a stand-alone shell which is useful
for recovering from certain types of system failures. In
particular, it was created in order to cope with the prob
lem of missing shared libraries or important executables.
Sash can execute external programs, as in any shell.
There are no restrictions on these commands, as the stan
dard shell is used to execute them if there are any non-
wildcard meta-characters in the command.
More importantly, however, is that many of the standard
system commands are built-in to sash. These built-in com
mands are:
-ar, -chattr, -chgrp, -chmod, -chown, -cmp, -cp,
-dd, -echo, -ed, -grep, -file, -find, -gunzip,
-gzip, -kill, -losetup, -ln, -ls, -lsattr, -mkdir,
-mknod, -more, -mount, -mv, -printenv, -pwd, -rm,
-rmdir, -sum, -sync, -tar, -touch, -umount, -where
These commands are generally similar to the standard pro
grams with similar names. However, they are simpler and
cruder than the external programs, and so many of the
options are not implemented. The restrictions for each
built-in command are described later.
The built-in commands which correspond to external pro
grams begin with a dash character in order to distinguish
them from the external programs. So typing "ls", for
example, will attempt to run the real ls program. If
"-ls" is typed, then the built-in command which mimics ls
is called.
For the built-in commands, file names are expanded so that
asterisks, question marks, and characters inside of square
brackets are recognised and are expanded. Arguments can
be quoted using single quotes, double quotes, or back
slashes. However, no other command line processing is
performed. This includes specifying of file redirection,
and the specifying of a pipeline.
If an external program is non-existant or fails to run
correctly, then the "alias" built-in command may be used
to redefine the standard command so that it automatically
runs the built-in command instead. For example, the com
mand "alias ls -ls" redefines "ls" to run the built-in
command. This saves you the pain of having to remember to
programs will not run, then the "aliasall" command may be
useful to create multiple aliases.
The "help" command will list all of the built-in commands
in sash . If an argument is given, it will list only
those built-in commands which contain the given argument
as a sub-string. Each built-in command is described below
in more detail.
alias [name [command]]
If name and command are provided, this defines an
alias for a command with the specified name which
executes the specified command with possible argu
ments. Arguments containing wildcards can be
quoted in order to defer their expansion until the
alias is invoked. If just name is provided, then
the definition of the specified command alias is
displayed. If nothing is provided, then the defi
nitions of all aliases are displayed.
aliasall
This defines aliases for all of the built-in com
mands that start with dashes to the corresponding
names without the dashes. This may be useful when
the system is so corrupted that no external pro
grams may be executed at all.
-ar [txp][v] arfile [filename]...
List or extract files from an ar archive. The
arfile argument specifies a file name which con
tains the archive. If no additional filenames are
specified, then all files in the archive are oper
ated on. Otherwise, only those archive members
which have the same name as one of the additional
filenames are operated on. Filenames which do not
appear in the archive are ignored. Archives cannot
be created or modified. The archiver correctly
handles 4.0BSD archives, and understands both the
SysV and 4.4BSD extensions for long file names.
The extended pseudo-BSD formats are not supported;
nor are the two antediluvian binary formats derived
from V7 and earlier. (The GNU archiver normally
creates archives in the 4.0BSD format with SysV
extensions.)
cd [dirName]
If dirName is provided, then the current directory
is changed to the dirName. If dirName is absent,
then the current directory is changed to the user's
home directory (value of the $HOME environment
variable).
Change the attributes of the specified files on the
ext2 file system. Using a plus sign adds the spec
ified attribute for the files. Using a minus sign
removes the specified attributes for the files.
The 'i' attribute makes a file immutable so that it
cannot be changed. The 'a' attribute makes a file
append-only.
-chgrp gid fileName ...
Change the group id for the specified list of
files. The gid can either be a group name, or a
decimal value.
-chmod mode fileName ...
Change the mode of the specified list of files.
The mode argument can only be an octal value.
-chown uid fileName ...
Change the owner id for the specified list of
files. The uid can either be a user name, or a
decimal value.
-cmp fileName1 fileName2
Determines whether or not the specified file names
have identical data. This says that the files are
links to each other, are different sizes, differ at
a particular byte number, or are identical.
-cp srcName ... destName
Copies one or more files from the srcName to the
destName. If more than one srcName is given, or if
destName is a directory, then all the srcNames are
copied into the destName directory with the same
names as the srcNames.
-dd if=name of=name [bs=n] [count=n] [skip=n] [seek=n]
Copy data from one file to another with the speci
fied parameters. The if and of arguments must be
provided, so stdin and stdout cannot be specified.
The bs argument is the block size, and is a numeric
value (which defaults to 512 bytes). Count is the
number of blocks to be copied (which defaults to
end of file for the input file). Skip is the num
ber of blocks to ignore before copying (seek is
used if possible, and the default is 0). Seek is
the number of blocks to seek in the output file
before writing (and defaults to 0). Any of the
numeric decimal values can have one or more trail
ing letters from the set 'kbw', which multiplies
the value by 1024, 512, and 2 respectively. The
command reports the number of full blocks read and
written, and whether or not any partial block was
read or written.
Echo the arguments to the -echo command. Wildcards
are expanded, so this is a convenient way to get a
quick list of file names in a directory. The out
put is always terminated with a newline.
-ed [fileName]
Edit the specified file using line-mode commands.
The following ed commands are provided: = c r w i a
d p l s f k z and q. Line numbers can be con
stants, ".", "$", "'x", /string/ and simple arith
metic combinations of these. The substitute com
mand and the search expression can only use literal
strings. There are some small differences in the
way that some commands behave.
exec fileName [args]
Execute the specified program with the specified
arguments. This replaces sash completely by the
executed program.
exit Quit from sash.
-file fileName ...
Examine the specified files and print out their
file type. This indicates whether the files are
regular files or not, whether they contain print
able text or shell scripts, are executables, or
contain binary data.
-find dirName [-xdev] [-type chars] [-name pattern]
[-size min Size]
Find all files contained within the specified
directory tree which meet all of the specified con
ditions. The -xdev option prevents crossing of
mount points. The -name option specifies a wild
card pattern to match the last component of the
file names. The -type option specifies that the
files must have a type matching the specified list
from the set: f d c b p s l. These represent regu
lar files, directories, character devices, block
devices, named pipes, sockets, and symbolic links.
The -size option specifies that the files must be
regular files or directories which contain at least
the specified number of bytes.
-grep [-in] word fileName ...
Display lines of the specified files which contain
the given word. If only one file name is given,
then only the matching lines are printed. If mul
tiple file names are given, then the file names are
printed along with the matching lines. Word must
be a single word, (ie, not a regular expression).
If -i is given, then case is ignored when doing the
the matching lines are also printed.
-gunzip inputFileName ... [-o outputPath]
Uncompress one or more files that had been com
pressed using the gzip or compress algorithms. If
the -o option is not given, then each of the input
file names must have one of the extensions ".gz",
".tgz", or ".Z", and those files will be replaced
by the uncompressed versions of those files. The
original files will be deleted after the output
files have been successfully created. The uncom
pressed versions of the files have the same names
as the original file names, except for a simple
modification of their extensions. If an extension
is ".tgz", then the extension is replaced by
".tar". Otherwise, the ".gz" or ".Z" extension is
removed.
If the -o option is given, then the input files
will not be deleted, and the uncompressed versions
of the files will be created as specified by out
putPath. If the output path is a directory, then
the uncompressed versions of the input files will
be placed in that directory with their file names
modified as described above, or with the same name
if the input file name does not have one of the
special extensions. If the output path is a regu
lar file, then only one input file is allowed, and
the uncompressed version of that input file is cre
ated as the output path exactly as specified. If
the output path is a block or character device,
then the uncompressed versions of the input files
are concatenated to the device.
-gzip inputFileName ... [-o outputPath]
Compresses one or more files using the gzip algo
rithm. If the -o option is not given, then each of
the input file names will be replaced by the com
pressed versions of those files, The original files
will be deleted after the output files have been
successfully created. The compressed versions of
the files have the same names as the original file
names, except for a simple modification of the
extensions. If an extension is ".tar", then the
extension is replaced by ".tgz". Otherwise, the
".gz" extension is added.
If the -o option is given, then the input files
will not be deleted, and the compressed versions of
the files will be created as specified by output
Path. If the output path is a directory, then the
compressed versions of the input files will be
placed in that directory with their file names
not a directory, then only one input file is
allowed, and the compressed version of that input
file is created as the output path exactly as spec
ified.
help [word]
Displays a list of built-in commands along with
their usage strings. If a word is given, then just
those commands whose name or usage contains the
word is displayed. If a word is specified which
exactly matches a built-in command name, then a
short description of the command and its usage is
given.
-kill [-signal] pid ...
Sends the specified signal to the specified list of
processes. Signal is a numeric value, or one of
the special values HUP, INT, QUIT, KILL, TERM,
STOP, CONT, USR1 or USR2. If no signal is speci
fied then SIGTERM is used.
-losetup [-d] loopDev [file]
Associates loopback devices with files on the sys
tem. If -d is not given, the loopback device
loopDev is associated with file. If -d is given,
loopDev is unassociated with the file it's cur
rently configured for.
-ln [-s] srcName ... destName
Links one or more files from the srcName to the
specified destName. If there are multiple src
Names, or destName is a directory, then the link is
put in the destName directory with the same name as
the source name. The default links are hard links.
Using -s makes symbolic links. For symbolic links,
only one srcName can be specified.
-ls [-lidFC] fileName ...
Display information about the specified list of
file names. The normal listing is simply a list of
file names, one per line. The options available
are -l, -i, -d, and -F. The -l option produces a
long listing giving the normal 'ls' information.
The -i option displays the inode numbers of the
files. The -d option displays information about a
directory, instead of the files within it. The -F
option appends a slash or asterisk to the file name
if the file is a directory or is executable. The
-C option displays the file names in a multi-column
format. The width of the output is calculated
using the COLS environment variable.
Display attributes for the specified files on the
ext2 file system. The letter 'i' indicates that
the file is immutable and cannot change. The let
ter 'a' indicates that the file is append-only.
Dashes are shown where the attributes are not set.
-mkdir dirName ...
Creates the specified directories. They are cre
ated with the default permissions.
-mknod fileName type major minor
Creates a special device node, either a character
file or a block file. Filename is the name of the
node. Type is either 'c' or 'd'. Major is the
major device number. Minor is the minor device
number. Both of these numbers are decimal.
-more fileName ...
Type out the contents of the specified file names,
one page at a time. For each page displayed, you
can type 'n' and a return to go to the next file,
'q' and a return to quit the command completely, or
just a return to go to the next page. The environ
ment variables LINES and COLS can be used to set
the page size.
-mount [-t type] [-r] [-m] devName dirName
Mount a filesystem on a directory name. The -t
option specifies the type of filesystem being
mounted, and defaults to "ext2". The -r option
indicates to mount the filesystem read-only. The
-m option indicates to remount an already mounted
filesystem.
-mv srcName ... destName
Moves one or more files from the srcName to the
destName. If multiple srcNames are given, or if
destName is a directory, then the srcNames are
copied into the destination directory with the same
names as the srcNames. Renames are attempted
first, but if this fails because of the files being
on different filesystems, then copies and deletes
are done instead.
-printenv [name]
If name is not given, this prints out the values of
all the current environment variables. If name is
given, then only that environment variable value is
printed.
prompt [word] ...
Sets the prompt string that is displayed before
reading of a command. A space is always added to
-pwd Prints the current working directory.
quit Exits from sash.
-rm fileName ...
Removes one or more files.
-rmdir dirName ...
Removes one or more directories. The directories
must be empty for this to be successful.
setenv name value
Set the value of an environment variable.
source fileName
Execute commands which are contained in the speci
fied file name.
-sum fileName ...
Calculates checksums for one or more files. This
is the 16 bit checksum compatible with the BSD sum
program.
-sync Do a "sync" system call to force dirty blocks out
to the disk.
-tar [ctxv]f tarFileName [fileName] ...
Create, list or extract files from a tar archive.
The f option must be specified, and accepts a
device or file name argument which contains the tar
archive. When creating, at least one file name
must be specified to be stored. If a file name is
a directory, then all the files and directories
within the directory are stored. Linked files and
other special file types are not handled properly.
When listing or extracting files, only those files
starting with the specified file names are pro
cessed. If no file names are specified, then all
files in the archive are processed. Leading
slashes in the tar archive file names are always
removed so that you might need to cd to "/" to
restore files which had absolute paths.
-touch fileName ...
Updates the modify times of the specifed files. If
a file does not exist, then it will be created with
the default protection.
umask [mask]
If mask is given, sets the "umask" value used for
initializing the permissions of newly created
files. If mask is not given, then the current
value.
-umount fileName
Unmounts a file system. The file name can either
be the device name which is mounted, or else the
directory name which the file system is mounted
onto.
unalias name
Remove the definition for the specified alias.
-where program
Prints out all of paths defined by the PATH envi
ronment variable where the specified program
exists. If the program exists but cannot be exe
cuted, then the reason is also printed.
OPTIONS
There are several command line options to sash. The -c
option executes the next argument as a command (including
embedded spaces to separate the arguments of the command),
and then exits.
The -p option takes the next argument as the prompt string
to be used when prompting for commands.
The -q option makes sash quiet, which simply means that it
doesn't print its introduction line when it starts.
The -a option creates aliases for the built-in commands so
that they replace the corresponding standard commands.
This is the same result as if the 'aliasall' command was
used.
A file name may be provided as the last argument to sash,
in which case sash's standard input is read from that
file. This allows #! scripts to use sash as their script
interpretor. Be aware that sash does not provide most nor
mal bourne-shell programming features, however.
SYSTEM RECOVERY
This section contains some useful information about using
sash with lilo to perform system recovery in some situa
tions.
When important shared libraries are being upgraded, it
might be a good idea to have sash already running on a
console by itself. Then if there is a problem with the
shared libraries sash will be unaffected and you may be
able to use it to fix the problem.
If a problem with the system shows up at boot time so that
first try booting into single-user mode by adding the sin
gle keyword after your kernel image name at the lilo
prompt. If you manage to reach a shell prompt, then you
can run sash from that shell (if necessary). One reason
for doing this is that you might need to use the -mount
command with the -m option to remount the root file system
so that it can be modified.
If you cannot reach the shell in single-user mode, then
you can try running sash directly as a replacement for the
init process. This is done by adding the init=/bin/sash
keyword after your kernel image name at the lilo prompt.
When this is done, then the use of the aliasall command
might be useful to reduce attempts to access the root file
system when running commands.
If your root file system is so corrupted that you cannot
get sash to run at all, then you will have to resort to a
system recovery floppy.
WARNINGS
Sash should obviously be linked statically, otherwise its
purpose is lost.
Several other system commands might be necessary for sys
tem recovery, but aren't built-in to sash.
AUTHOR
David I. Bell
dbell@canb.auug.org.au
2 October 1999
Man(1) output converted with
man2html