[Top] [Prev] [Next]

sh - command line interface to the Inferno system

sh [file]


The sh program provides a user level interface (a shell) to the Inferno system. It reads input lines, identifies a command and arguments for that command, and arranges for execution of the corresponding Inferno module.

If a file is named as a command line argument, that file is the source of input; otherwise, standard input is read.

There are features that allow input/output redirection, creating pipelines, and performing tasks in background.

Starting the Shell

In desktop-oriented configurations, the shell is started as part of system initialization. The shell can also be started from:
an existing shell

to process a script file

another program

the window manager has a button for creating new shells

Command Line Syntax

Each line consists of one or more command pipelines each separated by either an ampersand (&) which indicates that the pipeline should be run in background or a semi-colon (;). The semi-colon need not be provided for the last command pipeline on a line.

Command pipelines are not allowed to span lines.

Each command pipeline consists of one or more commands separated by a vertical bar (|) character. The standard output of one command is made the standard input of the next command to the right.

Re-direction of input/output to pipes takes precedence over re-direction from/to files.

In the limit case, a command pipeline consists of a single command with no pipes.

A command consists of one or more fields. The first (leftmost) field is the command field. It is used to determined the executable file to be loaded and run; see Finding the Module. The remaining fields are parsed and become command line arguments that are passed to the module's init function as a list of strings.

Any input following a # on a line is discarded.

Finding the Module

The command field is converted to the pathname of the Dis file of some module. That field can be either an absolute pathname, starting from /, or a relative pathname from the current directory.

As a convenience, the user need not specify the .dis suffix to the filename. If missing, it will be added by the shell.

If the load fails there is, in general, a second attempt to load the module by resolving the pathname relative to the /dis directory (the general system repository of Dis files).

There are two exceptions to this second attempt. The second load attempt is not performed if the command field provides an absolute pathname or a relative pathname starting with dot-slash (./). Such explicit naming is taken to mean that the user will accept no substitutions.

The shell requires that the Dis file implement a module with an interface equivalent to the Command module as specified in /module/sh.m. Otherwise, the named file will not load.

File Name Expansion

Command line arguments (including the command field itself) are expanded by the shell according to the regular expression rules described in filepat: expand, match - file pattern matching in Chapter 15.

This expansion is not applied to the filenames used for input/output redirection.


The shell special characters can be stripped of their meaning and treated as literals by enclosing them in single quotes. Inside a quoted string, the special meaning of the single quote can be removed by immediately following it with another single quote. Command lines with un-terminated quoted strings are rejected and cause an error message.


xxx$ echo ''''

xxx$ echo 'don''t'

xxx$ echo 'hello' 'world
sh: unmatched quote

xxx$ echo 'a'b

xxx$ echo a'b'

Shell Special Characters
' '

Blank: whitespace, except in a quoted string.


Tab: whitespace, except in a quoted string.


Newline: command line terminator.


Start of comment

' (single quote)

Start of/end of quoted string.

| (vertical bar)

Interface between commands in a command pipeline.


Terminator for command pipelines to be run in background.


Terminator for command pipelines to be run synchronously by the shell.


Output re-direction
create file if it does not exist

truncate file if it exists


Output re-direction
create file if it does not exist

append to file if it exists


Input re-direction.


The shell uses a prompt consisting of the system name as provided by /dev/sysname suffixed by $.

Input/Output Re-directions

By default, standard input is the console keyboard and standard output the console display. Each command can specify that standard input be taken from a file and standard output be written to a file.

Attempts to redirect standard input to a non-existing file will fail. Redirecting standard output to a non-existing file will cause that file to be created. If the destination file already exists, it will be overwritten. Any previous contents are lost.

In cases of competing re-direction mechanisms (re-direct to a file and to a pipe), the pipe has precedence.

Background Tasks

In general, the shell waits for the termination of a command pipeline before continuing execution, for example, prompting the user for the next command. However, if the command pipeline is terminated by an ampersand (&) character, the wait stage is skipped and the shell continues execution immediately, in this case the command pipeline executes as a background task.

Name Space Concerns

When started, the shell creates an independent file name space that is a copy of the file name space of the shell's creator.

Command pipelines started by the shell are executed by threads that share the shell's name space. If those commands modify the file name space (and they have not mimicked the shell in creating their own independent name space), those modifications will be perceived by the shell when it continues execution. See bind, mount, unmount - change name space and pctl - process control in Chapter 8.




This is a rudimentary shell designed for debugging applications. It is not intended to serve as a general-purpose programmable shell.

In lieu of a path mechanism, a process can create a union directory at /dis.


Inferno does not support an append mode. Therefore, the shell's approximation is not guaranteed if there are concurrent appending processes.

See Also
bind, mount, unmount - change name space

filepat: expand, match - file pattern matching in Chapter 15

pipe: fds, files - get read/write file pair for a pipe in Chapter 15

sh - command interface

pctl - process control See Notes on name space management

cons - console device in Chapter 2

prog - interface to running programs in Chapter 2

[Top] [Prev] [Next]

Copyright © 1996,Lucent Technologies, Inc. All rights reserved.