发信人: jerk (徐子陵), 信区: Unix
标  题: Unix Unleased -10
发信站: 饮水思源站 (Fri Nov 20 20:08:21 1998) , 站内信件

    
    10 
        What Is a Shell? 
                    By Rick Rummel
            Introduction 
            The Kernel and the Shell 
            The Functions of a Shell 
                Command Line Interpretation 
                Program Initiation 
                Input-output Redirection 
                Pipeline Connection 
                Substitution of Filenames 
                Maintenance of Variables 
                Environment Control 
                Shell Programming
            Summary

10 

What Is a Shell? 

By Rick Rummel 

Introduction 

You can do many things without having an extensive knowledge of how they 
actually work. For example, you can drive a car without understanding the 
physics of the internal combustion engine. A lack of knowledge of electronics 
doesn't prevent you from enjoying music from a CD player. You can use a UNIX 
computer without knowing what the shell is and how it works. However, you will 
get a lot more out of UNIX if you do. 

Three shells are typically available on a UNIX system: Bourne, Korn, and C 
shells. They are discussed in Chapters 11, 12, and 13. In this chapter, you'll 
learn 

    What a shell is 
    
    
    What a shell does for you 
    
    
    How a shell relates to the overall system 
    
    
The Kernel and the Shell 

As the shell of a nut provides a protective covering for the kernel inside, a 
UNIX shell provides a protective outer covering. When you turn on, or "boot up," 
a UNIX-based computer, the program unix is loaded into the computer's main 
memory, where it remains until you shut down the computer. This program, called 
the kernel, performs many low-level and system-level functions. The kernel is 
responsible for interpreting and sending basic instructions to the computer's 
processor. The kernel is also responsible for running and scheduling processes 
and for carrying out all input and output. The kernel is the heart of a UNIX 
system. There is one and only one kernel. 

As you might suspect from the critical nature of the kernel's responsibilities, 
the instructions to the kernel are complex and highly technical. To protect the 
user from the complexity of the kernel, and to protect the kernel from the 
shortcomings of the user, a protective shell is built around the kernel. The 
user makes requests to a shell, which interprets them, and passes them on to the 
kernel. The remainder of this section explains how this outer layer is built. 

Once the kernel is loaded to memory, it is ready to carry out user requests. 
First, though, a user must log in and make a request. For a user to log in, 
however, the kernel must know who the user is and how to communicate with him. 
To do this, the kernel invokes two special programs, getty and login. For every 
user port—usually referred to as a tty—the kernel invokes the getty program. 
This process is called spawning. The getty program displays a login prompt and 
continuously monitors the communication port for any type of input that it 
assumes is a user name. Figure 10.1 shows a freshly booted UNIX system with six 
user ports. 


Figure 10.1. An active system with no users. 

When getty receives any input, it calls the login program, as shown in Figure 
10.2. The login program establishes the identity of the user and validates his 
right to log in. The login program checks the password file. If the user fails 
to enter a valid password, the port is returned to the control of a getty. If 
the user enters a valid password, login passes control by invoking the program 
name found in the user's entry in the password file. This program might be a 
word processor or a spreadsheet, but it usually is a more generic program called 
a shell. 


Figure 10.2. A user logs in. 

In the system shown in Figure 10.3, four users have logged in. Likewise, one 
user is in the process of logging in, and one port has no activity. Of the four 
active users, two are using the Bourne shell, one is using the Korn shell, and 
one has logged into a spreadsheet. Each user has received a copy of the shell to 
service his requests, but there is only one kernel. Using a shell does not 
prevent a user from using a spreadsheet or another program, but those programs 
run under the active shell. A shell is a program dedicated to a single user, and 
it provides an interface between the user and the UNIX kernel. 


Figure 10.3. An active system. 

You don't have to use a shell to access UNIX. In Figure 10.3, one of the users 
has been given a spreadsheet instead of a shell. When this user logs in, the 
spreadsheet program starts. When he exits the spreadsheet, he is logged out. 
This technique is useful in situations where security is a major concern, or 
when it is desirable to shield the user from any interface with UNIX. The 
drawback is that the user cannot use mail or the other UNIX utilities. 

Because any program can be executed from the login—and a shell is simply a 
program—it is possible for you to write your own shell. In fact, three shells, 
developed independently, have become a standard part of UNIX. They are 

    The Bourne shell, developed by Stephen Bourne 
    
    
    The Korn shell, developed by David Korn 
    
    
    The C shell, developed by Bill Joy 
    
    
This variety of shells enables you to select the interface that best suits your 
needs or the one with which you are most familiar. 

The Functions of a Shell 

It doesn't matter which of the standard shells you choose, for all three have 
the same purpose: to provide a user interface to UNIX. To provide this 
interface, all three offer the same basic functions: 

    Command line interpretation 
    
    
    Program initiation 
    
    
    Input-output redirection 
    
    
    Pipeline connection 
    
    
    Substitution of filenames 
    
    
    Maintenance of variables 
    
    
    Environment control 
    
    
    Shell programming 
    
    
Command Line Interpretation 

When you log in, starting a special version of a shell called an interactive 
shell, you see a shell prompt, usually in the form of a dollar sign ($), a 
percent sign (%), or a pound sign (#). When you type a line of input at a shell 
prompt, the shell tries to interpret it. Input to a shell prompt is sometimes 
called a command line. The basic format of a command line is 

command arguments
command is an executable UNIX command, program, utility, or shell program. The 
arguments are passed to the executable. Most UNIX utility programs expect 
arguments to take the following form: 

options filenames
For example, in the command line 

$ ls -l file1 file2
there are three arguments to ls, the first of which is an option, while the last 
two are file names. 

One of the things the shell does for the kernel is to eliminate unnecessary 
information. For a computer, one type of unnecessary information is whitespace; 
therefore, it is important to know what the shell does when it sees whitespace. 
Whitespace consists of the space character, the horizontal tab, and the new line 
character. Consider this example: 

$ echo part A     part B     part C



part A part B part C
Here, the shell has interpreted the command line as the echo command with six 
arguments and has removed the whitespace between the arguments. For example, if 
you were printing headings for a report and you wanted to keep the whitespace, 
you would have to enclose the data in quotation marks, as in 

$ echo 'part A     part B     part C'



part A     part B     part C
The single quotation mark prevents the shell from looking inside the quotes. Now 
the shell interprets this line as the echo command with a single argument, which 
happens to be a string of characters including whitespace. 

Program Initiation 

When the shell finishes interpreting a command line, it initiates the execution 
of the requested program. The kernel actually executes it. To initiate program 
execution, the shell searches for the executable file in the directories 
specified in the PATH environment variable. When it finds the executable file, a 
subshell is started for the program to run. You should understand that the 
subshell can establish and manipulate its own environment without affecting the 
environment of its parent shell. For example, a subshell can change its working 
directory, but the working directory of the parent shell remains unchanged when 
the subshell is finished. 

Input-output Redirection 

Chapter 4, "Listing Files," introduced input-output redirection. It is the 
responsibility of the shell to make this happen. The shell does the redirection 
before it executes the program. Consider these two examples, which use the wc 
word count utility on a data file with 5 lines: 

$ wc -l fivelines



5 fivelines



$ wc -l <fivelines



5
This is a subtle difference. In the first example, wc understands that it is to 
go out and find a file named fivelines and operate on it. Since wc knows the 
name of the file it displays it for the user. In the second example, wc sees 
only data, and does not know where it came from because the shell has done the 
work of locating and redirecting the data to wc, so wc cannot display the file 
name. 

Pipeline Connection 

Since pipeline connections are actually a special case of input-output 
redirection in which the standard output of one command is piped directly to the 
standard input of the next command, it follows that pipelining also happens 
before the program call is made. Consider this command line: 

$ who | wc -l



5
In the second example, rather than displaying its output on your screen, the 
shell has directed the output of who directly to the input of wc. Pipes are 
discussed in Chapter 4. 

Substitution of Filenames 

Chapter 4 explained how metacharacters can be used to reference more than one 
file in a command line. It is the responsibility of the shell to make this 
substitution. The shell makes this substitution before it executes the program. 
For example, 

$ echo *



file1 file2 file3 file3x file4
Here, the asterisk is expanded to the five filenames, and it is passed to echo 
as five arguments. If you wanted to echo an asterisk, we would enclose it in 
quotation marks. 

Maintenance of Variables 

The shell is capable of maintaining variables. Variables are places where you 
can store data for later use. You assign a value to a variable with an equal (=) 
sign. 

$ LOOKUP=/usr/mydir
Here, the shell establishes LOOKUP as a variable, and assigns it the value 
/usr/mydir. Later, you can use the value stored in LOOKUP in a command line by 
prefacing the variable name with a dollar sign ($). Consider these examples: 

$ echo $LOOKUP



/usr/mydir



$ echo LOOKUP



LOOKUP


Note for C-shell users. Assigning values to variables in the C-shell differs 
from the Bourne and Korn shells. To assign a variable in the C-shell use the set 
command. 

% set LOOKUP = /usr/mydir 

Notice that spaces precede and follow the equal sign. 



Like filename substitution, variable name substitution happens before the 
program call is made. The second example omits the dollar sign ($). Therefore, 
the shell simply passes the string to echo as an argument. In variable name 
substitution, the value of the variable replaces the variable name. 

For example, in 

$ ls $LOOKUP/filename
the ls program is called with the single argument /usr/mydir/filename. 

Environment Control 

When the login program invokes your shell, it sets up your environment, which 
includes your home directory, the type of terminal you are using, and the path 
that will be searched for executable files. The environment is stored in 
variables called environmental variables. To change the environment, you simply 
change a value stored in an environmental variable. For example, to change the 
terminal type, you change the value in the TERM variable, as in 

$ echo $TERM



vt100



$ TERM=ansi



$ echo $TERM



ansi


Note for C-shell users. C-shell assigns values to environment variables using 
the setenv command. 

% setenv TERM vt100 



Chapter 11, "Bourne Shell," Chapter 12, "Korn Shell," and Chapter 13, "C Shell," 
contain more information on customizing your environment. 

Shell Programming 

You've seen that the shell is used to interpret command lines, maintain 
variables, and execute programs. The shell also is a programming language. By 
combining commands and variable assignments with flow control and decision 
making, you have a powerful programming tool. Using the shell as a programming 
language, you can automate recurring tasks, write reports and you can even build 
and manipulate your own data files. The next three chapters discuss shell 
programming in more detail. 

Summary 

The shell provides an interface between the user and the heart of UNIX—the 
kernel. The shell takes command lines as input, makes filename and variable 
substitution, redirects input and output, locates the executable file, and 
initiates programs. The shell maintains each user's environment variables. The 
shell also is a powerful programming language. 

    

--

         隋末风云起,双龙走天下。
         尽数天下英豪,唯我独尊! 

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.209]
--
※ 修改:.fzx 于 Aug  1 12:22:34 修改本文.[FROM: heart.hit.edu.cn]
※ 转寄:.紫 丁 香 bbs.hit.edu.cn.[FROM: chen.hit.edu.cn]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: jmm.bbs@bbs.hit.edu.]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:213.316毫秒