Bourne | Ash |  #!  | find | ARG_MAX | Shells | portability | permissions | UUOC | - | ../Various | HOME
"$@" | echo/printf | set -e | test | tty defs | tty chars | $() vs ) | IFS | using siginfo | nanosleep | line charset | locale


Manual of the Thompson Shell on Version 2

released under the license of Caldera

This is a reproduction of a scan of the Version 2 manual.


SH (I)                       3/15/72                       SH (I)


NAME		sh  --	shell (command interpreter)

SYNOPSIS	sh [ name [ arg	 ... [ arg  ] ]	]
			       1	  9
DESCRIPTION
	sh is the standard command interpreter.	 It is	the  pro-
	gram  which  reads and arranges	the execution of the com-
	mand lines typed by most users.	 It may	itself be  called
	as a command to	interpret files	of commands.  Before dis-
	cussing	the arguments to the shell used	as a command, the
	structure of command lines themselves will be given.

	Command	lines

	Command	lines are sequences of commands	separated by com-
	mand delimiters.  Each command is a sequence of	non-blank
	command	arguments separated by blanks.	The  first  argu-
	ment  specifies	 the  name  of	a command to be	executed.
	Except for certain types of special  arguments	discussed
	below,	the  arguments	other  than  the command name are
	passed without interpretation to the invoked command.

	If the first argument is the name of an	executable  file,
	it  is invoked;	otherwise the string "/bin/" is	prepended
	to the argument.  (In this way	most  standard	commands,
	which  reside  in "/bin", are found.)  If no such command
	is found, the string "/usr" is further prepended (to give
	"/usr/bin/command")  and  another attempt is made to exe-
	cute the resulting file.   (Certain  "overflow"	 commands
	live  in "/usr/bin".)  If the "/usr/bin" file exists, but
	is not executable, it is used by the shell as  a  command
	file.	That  is  to say it is executed	as though it were
	typed from the console.	 If all	attempts fail, a diagnos-
	tic is printed.

	The remaining non-special arguments are	simply passed  to
	the command without further interpretation by the shell.

	Command	delimiters

	There are three	command	delimiters:  the  new-line,  ";",
	and  "&".   The	semicolon ";" specifies	sequential execu-
	tion of	the commands so	separated; that	is,

		coma; comb

	causes the execution first of command coma, then of comb.
	The ampersand "&" causes simultaneous execution:

		coma & comb

	causes coma to be called, followed  immediately	 by  comb
	without	 waiting  for coma to finish.  Thus coma and comb
	execute	simultaneously.	 As a special case,

		coma &

	causes coma to be executed and the shell  immediately  to
	request	another	command	without	waiting	for coma.

	Termination Reporting

	If a command (not followed by "&") terminates abnormally,
	a  message is printed.	(All terminations other	than exit
	and interrupt are considered abnormal.)	 The following is
	a list of the abnormal termination messages:

		Bus error
		Trace/BPT trap
		Illegal instruction
		IOT trap		
		Power fail trap
		EMT trap	  
		Bad system call	     
		Quit
		Error

	If a core  image  is  produced,	 "  --	Core  dumped"  is
	appended to the	appropriate message.

	Redirection of I/O

	Three character	sequences cause	the immediately	following
	string	to  be	interpreted  as	a special argument to the
	shell itself, not passed to the	command.

	An argument of the form	"<arg" causes the file arg to  be
	used as	the standard input file	of the given command.

	An argument of the form	">arg" causes file  "arg"  to  be
	used  as  the standard output file for the given command.
	"Arg" is created if it did not exist, and in any case  is
	truncated at the outset.

	An argument of the form	">>arg"	causes file "arg"  to  be
	used  as  the  standard	output for the given command.  If
	"arg" did not exist, it	is created; if it did exist,  the
	command	output is appended to the file.

	Generation of argument lists

	If any argument	contains any of	the characters	"?",  "*"
	or  '[', it is treated specially as follows.  The current
	directory is searched for files	 which	match  the  given
	argument.

	The character "*" in an	argument matches  any  string  of
	characters in a	file name (including the null string).

	The character "?" matches any single character in a  file
	name.

	Each  "["  must  be  paired  with  a  matching  "]".  The
	characters  between  "["  and  "]"  specify  a  class  of
	characters.  It  matches  any  single character in a file
	name which is in the class.  An ordinary character in the
	brackets specifies that character to be in the class.  A
	pair  of  characters  separated  by  "-"  specifies  each
	character  lexically  greater  then or equal to the first
	and  less  then or equal to the second member of the pair
	is  to  be included in the class.  If the first member of
	the  pair lexically exceeds the second, the second member
	is the sole character specified.

	Other characters match only the	 same  character  in  the
	file name.

	For example, "*" matches all file names; "?" matches  all
	one-character  file  names;  "[ab]*.s"	matches	 all file
	names beginning	with "a" or "b"	 and  ending  with  ".s";
	"?[zi-m]"  matches  all	 two-character	file names ending
	with "z" or the	letters	"i" through "m".

	If the argument	with "*" or "?"	also contains  a  "/",	a
	slightly  different  procedure	is  used:  instead of the
	current	directory, the directory used is the one obtained
	by taking the argument up to the last "/" before a "*" or
	"?".  The matching process matches the remainder  of  the
	argument after this "/"	 against the files in the derived
	directory.   For  example:  "/usr/dmr/a*.s"  matches  all
	files  in  directory  "/usr/dmr" which begin with "a" and
	end with ".s".

	In any event, a	list of	names is obtained which	match the
	argument.   This  list is sorted into alphabetical order,
	and the	resulting sequence of arguments	replaces the sin-
	gle  argument  containing the "*", "[",	or "?".	 The same
	process	is carried out for each	argument  (the	resulting
	lists  are  not	merged)	and finally the	command	is called
	with the resulting list	of arguments.

	For example: directory /usr/dmr	contains the files  a1.s,
	a2.s, ..., a9.s.  From any directory, the command

	     as	/usr/dmr/a?.s

	calls as with arguments	/usr/dmr/a1.s, /usr/dmr/a2.s, ...
	/usr/dmr/a9.s in that order.

	Quoting

	The  character	"\"  causes  the  immediately	following
	character  to lose any special meaning it may have to the
	shell;	in this	way "<", ">", and other	characters  mean-
	ingful	to  the	shell may be passed as part of arguments.
	A special case of this feature allows the continuation of
	commands onto more than	one line:  a new-line preceded by
	"\" is translated into a blank.

	Sequences of characters	enclosed in double (") or  single
	(') quotes are also taken literally.

	Argument passing

	When the shell is invoked as a command,	it has additional
	string	processing capabilities.  Recall that the form in
	which the shell	is invoked is

	     sh	[ name [ arg  ... [ arg	 ] ] ]
			    1	       9
	The name is the	name of	a file which  will  be	read  and
	interpreted.  If not given, this subinstance of	the shell
	will continue to read the standard input file.

	In the file, character  sequences of the form "$n", where
	n is a digit 0, ...,	9, are replaced	by the nth
	argument to the  invocation of the shell (arg ).  "$0" is
				                     n
	replaced by name.

	End of file

	An end-of-file in the shell's input causes it to exit.	A
	side  effect  of  this fact means that the way to log out
	from UNIX is to	type an	end of file.

	Special	commands

	Two commands are treated specially by the shell.

	"Chdir"	is done	without	spawning a new process by execut-
	ing the	sys chdir primitive.

	"Login"	is done	by executing /bin/login	without	 creating
	a new process.

	These peculiarities are	inexorably imposed upon	the shell
	by  the	 basic structure of the	UNIX process control sys-
	tem.  It is a rewarding	exercise to work out why.

	Command	file errors

	Any shell-detected error in a file of commands causes the
	shell to cease execution of that file.

FILES		/etc/glob, which interprets "*", "?", and "[".

SEE ALSO	"The UNIX Time-sharing System",	which  gives  the
		theory of operation of the shell.

DIAGNOSTICS
	"Input not found", when	a command file is specified which
	cannot be read;
	"Arg count", if	the number  of	arguments  to  the  chdir
	pseudo-command	is  not	exactly	1, or if "*", "?", or "["
	is used	inappropriately;
	"Bad directory", if the	directory given	in "chdir" cannot
	be switched to;
	"Try again", if	no new process can be created to  execute
	the specified command;
	""' imbalance",	 if  single  or	 double	 quotes	 are  not
	matched;
	"Input file", if an argument after "<" cannot be read;
	"Output	file", if an argument after ">"	or ">>"	cannot be
	written	(or created);
	"No Command", if	the specified command  cannot  be
	executed.
	"No match", if no arguments are	generated for  a  command
	which contains "*", "?", or "[".
	Termination messages described above.

BUGS		If any argument	contains a quoted  "*",	 "?",  or
		"[",  then all instances of these characters must
		be quoted.  This is because  sh	 calls	the  glob
		routine	 whenever an unquoted "*", "?",	or "[" is
		noticed; the fact that other instances	of  these
		characters  occurred  quoted  is  not  noticed by
		glob.

OWNER		dmr, ken