The shell is an interface between the user and the Linux operating system. There are a variety of shells in Linux, in which Bash is used by default. This chapter tells the working principle of Shell, the type of shell, the general operation of Shell and the characteristics of Bash. What is the shell of the shelllinux system as the housing of the operating system, providing users with an interface to use the operating system. It is a collective language, command interpreter, and quote from programming language. The shell is an interface program between the user and the Linux kernel. If the Linux kernel imagines into a sphere, the shell is the outer layer around the core. When commands from the shell or other programs to Linux, the core will make a corresponding response. Shell is a command language interpreter that has its own built-in shell command set, and the shell can be called by other applications in the system. The commands entered in the prompt are explained by the shell and then pass it to the Linux core. There are some commands, such as changing the working directory command CD, is included inside the shell. There are also some commands, such as copying commands CP and mobile command RM, which are separate programs existing in a directory in the file system. For users, don't have to care about an order is built within the shell or a separate program. Shell first checks if the command is internal command. If it is not checked if it is an application (here the application can be Linux itself, such as LS and RM, can also be a commercial program, such as XV, or freedom Software, such as Emacs. The shell is then looking for these applications in the search path (the search path is a list of directories that can find the executable program). If the typed command is not an internal command and does not find this executable file in the path, an error message will be displayed. If the command can be successfully found, the internal command or application will be decomposed into a system call and pass it to the Linux kernel. Another important feature of shell is that it itself is an interpreted programming language. The shell programming language supports most program elements that can be seen in advanced languages, such as functions, variables, arrays, and program control structures. The shell programming language is easy to learn, and any commands that can be typed in the prompt can be placed in an executable shell program. When the normal user is successfully logged in, a program called shell is executed. It is the shell process that provides a command line prompt. As the default value (the default shell of the TurboLinux system is Bash), the "$" prompt is used for ordinary users, and the "#" is prompt to the superuser (root). Once the Shell prompt appears, you can type the parameters you need to command the command name and command. The shell will execute these commands. If a command takes a long time to run, or generate a lot of output on the screen, you can issue an interrupt signal from the keyboard to issue an interrupt signal to interrupt it (before normal end, abort its execution). When the user is ready to end the login dialog process, you can type the logout command, the exit command, or the file end value (Press CTRL D implementation) to end the login. Let's intercrium how shell works. $ make Workmake: *** no rule to make target 'Work'. Stop. $ Note: make is the name of a command in the system, followed by command parameters. After receiving this command, the shell executes it. In this example, since the input command parameters are incorrect, the system returns the information to stop the execution of the command. In the example, the shell looks for a program called Make and performs it as a parameter with Work. Make is a program that is often used to compile a large program, which is compiled as a target as a goal.
In "make Work", the target of Make is Work. Because Make could not find a target named by Work, it gives an error message indicates that the run fails, and the user returns to the system prompt. In addition, the user will give an error message if the user can't find the program named by the command line. For example, if the user type: $ myProgbash: myprog: command not found, the user gets an error message that does not find the command. After the user is knocking the wrong command, the system generally gives such an error message. There are many types in the shell's type Linux, with the most commonly used Bourne Shell (SHELL (CSH) and Korn Shell (KSH). The three shells have advantages and disadvantages. The Bourne Shell is the starting shell for UNIX and can be used on each UNIX. Bourne Shell is quite excellent in shell programming, but doing less than other shells in handling the user's interaction. The default shell of the Linux operating system is Bourne Again Shell, which is an extension of Bourne Shell, is referred to as Bash, compatible with Bourne Shell, and increases many features on the basis of the Bourne Shell. BASH is placed in / bin / bash, it has many features that provide functions such as command completion, command editing, and command history tables, which also contains the advantages in many c shells and Korn shells, flexible and powerful programming Interface, and there is a very friendly user interface. C shell is a shell that is more programmed than the Bourne Shell, which is similar to the C language. Linux provides TCSH for people who like to use C shell. TCSH is an extension version of C shell. TCSH includes command line editing, programmable words, spell correction, historical command replacement, job control, and similar C language syntax, not only compatible with the Bash Shell, but also provides more prompt parameters than Bash Shell . The Korn Shell combines the advantages of C shell and Bourne Shell and is fully compatible with the Bourne Shell. The Linux system provides PDKSH (Extension of KSH) that supports task control, which can be hang on the command line, the background execution, wake up or terminate the program. Linux does not have a cold other shell users, as well as some popular shells such as ASH, ZSH, etc. Every shell has its use, some shells are patented, and some can be obtained from the Internet or other sources. To decide which shell to use, just read the online help of the various shells, and try it. Users determine which shell to use by the / etc / passwd file when logging in to Linux. For example: # fgrep lisa / etc / passwdlisa: x: 500: 500: TurboLinux User: / Home / Lisa: / bin / Bashshell is column each end (/ bin / bash). Since Bash is the default shell on Linux, this chapter mainly introduces Bash and its related knowledge. When the shell command command line C logs in to the Linux system, you can see a shell prompt and identify the beginning of the command line. Users can enter any commands and parameters later. For example: $ DATE II 11 23 01:34:58 CST 1999 When the user logs in, I actually entered the shell, which follows a certain syntax to explain the input command and transmit it to the system.
The first word entered in the command line must be a command name, the second word is the option or parameter of the command, and each word in the command line must be separated by spaces or TAB, the format is as follows: $ comMand option arguments1. The options and parameter options are code including one or more letters, with a minus sign in front (decimal, Linux to distinguish options and parameters), options can be used to change the type of action executed by the command. For example: $ lsmotd passwd $ This is an LS command without options, which can list all files in the current directory, only listing the names of each file without displaying other more information. $ LS -LTOTAL 2-RW-R - R - 2 WZH Book 22 APR 20 20:37 MOTD-RW-R - R - 2 WZH Book 796 APR 20 20:37 Passwd $ Add -L Option, Will list a line of lines for each file, such as data size and data last modified. Most commands are designed to accept parameters. The parameter is one or more words typed after the option in the command line, for example: $ ls -l text-rw-r - r - 2 WZH Book 22 APR 20 20:37 MOTD-RW-R - R - 2 WZH Book 796 APR 20 20:37 Passwd $ will display all files and their information in the Text directory. Some commands, such as the LS can be used, and some commands may require some minimum number of parameters. For example, the CP command requires at least two parameters, and if the number of parameters does not match the command, the shell will give an error message. For example: $ cp -i mydata newdata Note: The options in the command line are first in parameter input. 2. The command line characteristic command line is actually a text buffer that can be edited. You can edit the input text before pressing Enter. For example, using the Backspace key to delete the characters that just typed, you can delete it, you can also insert characters, so that when you enter commands, especially complex commands, if you type errors, you don't need to re-enter the entire command, just use the editing operation, Correct the error. Using the up arrow can re-display the just executed command, use this feature to repeat the previously performed command without retrofitting the command. Bash saves a list of previously typed commands, which is called command history table. Press the arrow to display each command on the command line. Similarly, pressing the arrow to move down in the command list, which can be displayed on the command line in the command line, and the user can modify and execute these commands. This feature will be discussed in detail in Section 10.4. In a command line, you can also place multiple commands, separated by the semicolons. For example: $ LS -F; CP -I MyData NewData can also enter a command in several command lines, with a backslash to continue to the next line. The CP command on the $ cp -ImyDataNewData is entered in the three rows. The starting two lines ends with the backslash, and the three lines are used as a command line. In addition to using normal characters in the special character shell in the shell, special characters with special meaning and feature can also be used. At the time of use, you should pay attention to its special meaning and scope of action. These special characters are described below. 1. Wildcard wildcard is used for pattern matching, such as file name matching, road scripping search, string lookup, etc. Commonly used wildcards are * ,? and character sequences in square brackets []. The user can include these wildcards in the file name as the command parameter, constitute a so-called "mode string" and perform mode matches during the execution process.
* Represents any string (length can be inequal), for example: "f *" matches any string of the head head. However, it should be noted that the dots (.) And slash (/) in the path before the file must be explicitly matched. For example, "*" cannot match .file, and ". *" Can match .file. ? Represents any individual characters. [] Represents a specified character range, as long as the [] location in the file name is within the [] location specified in [], then this file name matches this mode string. The character range in square brackets can be composed of a direct-given character, or consist of a starting character representing a defined range, a termination character, and an intermediate hyphen (-). For example, F [A- D] is the same as F [ABCD]. The shell will use all the file names that match the mode strings specified in the command line to form the final command, and then execute this command. Here we give the table 10-1 to explain the specific meaning of these wildcards. Table 10-1 Wildcard Meaning Example Mode Strings * The name of all files in the current directory. * Text * The name of the file containing text in all file names in the current directory. [AB-DM] * The name of all files starting with A, B, C, D, and M. [AB-DM]? All the names of all the files starting with A, B, C, D, M and the back of one character with a character. / usr / bin / ?? Directory / USR / bIN name of all files named two characters. It is particularly important to note that even characters "-" are only valid in square brackets, indicating the character range, as in square brackets, it is a normal character. And * and? Only in square brackets are wildcards, if they appear within square brackets, they have lost the ability of wildcards and become ordinary characters. For example, only one pair of brackets in the pattern "- a [*?] Abc" are wildcards, * and? All ordinary characters, so it matches the string that can only be - a * ABC and - a? ABC. Finally, some issues that need to be careful when using wildcards. Since * ,? and [] have a relatively special meaning for the shell, these characters should not appear in the normal file name. Especially in the directory name, do not appear, otherwise shell matches the endless recursive. It is also a point to pay attention to: If there is no file name that matches the specified mode string in the directory, the shell will use this mode string itself as a parameter to pass the relevant command. This may be the reason why a special character appears in the command. 2. Quotation marks are divided into three types: single quotes, double quotes and reverse numbers. * Single quotes' characters from single quotes appear as ordinary characters. After the special characters are enclosed in single quotes, they will lose their original meaning, but only as a normal character interpretation. For example: $ String = '$ PATH' $ Echo $ String $ PATH $ visible $ Maintaining its own meaning, as a normal character appears. * Double quotation marks "The characters enclosed by double quotes, except for $,, ', and" these characters are still special characters and retain their special features, and the rest are treated as ordinary characters. For $, it is used to replace this variable and $ with the value of the variables, which is the escape character. It tells the shell not to specially handle the characters behind it, only as a normal character can. It can be imagined that only four characters $,, 'and "itself are required in the double quotes," it is not added in front of it, and the shell matches it. "
For example, we assume that the value of PATH is: / usr / bin: / bin, enter the following command: $ teststring = "$ PATH /" $ PATH "$ Echo $ teststring.: / Usr / bin: / bin" $ PATH $ Readers can try itselves before the second double quotation. * Anti-quotation number `reverse quotation number (`) This character is generally located on the upper left corner of the keyboard, not confused with single quotation marks ('). The string of the reincarnation is interpreted as a command line by the shell. When executed, the shell first executes the command line, and replaces the entire retrieval (including two reverse number) in its standard output result. For example: $ PWD / HOME / XYZ $ String = "CURRENT DIRECTORY IS` PWD` "$ ECHO $ STRINGCURENT DIRECTOUR IS / HOME / XYZ $ SHELL When performing the echo command, first perform the command PWD in the` PWD`, and will output the result / home / xyz replaces the `pwd. This part, the last output of the replacement is replaced. This function using the reverse number can be commanded, that is, assigns the execution result enclosed in the rejoice to the specified variable. For example: $ today = `date` $ echo Today IS $ TODAYTODAY IS MON APR 15 16:20:13 CST 1999 $ DIRK can also be nested. However, it is important to note that the reverse number of the inner layer must be essentially used in the nested use. For example: $ abc = `echo the number of users is` WHO | WC-L`` $ Echo $ Abcthe Number of Users IS 5 $ The special character of the shell can also use the shell's special characters in the command line between the reverse number. Shell is the result of the `` in the command, it actually wants to execute the command specified in ``. At the time of execution, the special characters, such as $, ", etc. will have a special meaning, and` `included can be any legal shell command, such as: $ lsnote readme.txt NOTIX.DIR $ TESTSTRING = "` Echo $ HOME `` LS [NN] * `" $ Echo $ teststring / home / yXZ Note Notice $ Other situations, readers can try themselves. 1. Note in the shell programming is often necessary for certain texts Comment to increase the readability of the program. During the front of the shell, the head is commented on the front of the character "#". There are also special characters such as: used for input / output redirection and pipeline <,>, < <, >> and |; Execute the Background Command &; Command Execution Operator & || and the {} indicating the command group will be introduced in the following sections.
Standard Input / Output and Redirect 1. Standard Input and Output We know that three standard files are automatically opened when performing a shell command line, ie standard input file (stdin), usually corresponding to the keyboard; standard output file (stdout ) And standard error output file (stderr), both files correspond to the screen of the terminal. The process will get input data from the standard input file, and output the normal output data to the standard output file, and send the error message to the standard error file. In the case of a CAT command, the function of the CAT command is to read the data from the file given by the command line and send them directly to the standard output. If you use the following command: $ Cat Config will display the contents of the file config to the screen. However, if there is no parameters in the command line of the CAT, it will read the data from the standard input and send it to the standard output. For example: $ CATHELLO WorldHello WorldByeBye $ WC << Delim> this text forms the content> of the here document, Which> Continues Until the end of> text delimter> Delim4 17 98 In the << Operator, any character can be used as a separator before the beginning of the text, This example uses DELIM as a separator. The body of the Here document has continued until the other separator is met. The second separator should appear at the beginning of the new line. At this time, the body of the Here document (not including the start and end separator) will reordforward to the command WC as its standard input. Since most commands specify the file name of the input file on the command line in the form of parameters, the input redirection is not often used. Despite this, when a command that does not accept file name as an input parameter is used, the input content is used to solve the problem with an input redirection. 1. Output Redirection Output Redirects Refiguring the standard output or standard error output of the command (or executable program) to the specified file. Thus, the output of the command is not displayed on the screen, but writes to the specified file. Output redirection is more common than input redirects, and this function can be used in many cases. For example, if there is a lot of output, you can't display it on the screen, then redirect to a file, then use the text editor to open this file, you can view the output information; if you want to save the output of a command This method can also be used. Also, the output redirection can be used to use the output of a command as an input to another command (there is a simpler method, the use of pipes, will be described below). The general form of output redirection is: command> file name. For example: $ ls> Directory.Out $ cat directory.outch1.doc ch2.doc ch3.doc chimp config mail / test / $ saving the output of the ls command as a file called Directory.out. Note: If the file behind the symbol already exists, then this file will be rewritten. To avoid the output redirection of the specified file can only store the output redirection of the current command, the shell provides an additional means of output redirection. Output additional redirection is very similar to the output redirection, the difference is only that the function of outputting the additional redirection is to append the output of the command (or executable program) to the final result of the specified file, and the original content of the file is not destroyed. . If you want to add a command to the output of the command to the specified file, you can use additional redirect operators >>. Form is: Command >> File Name. For example: $ ls * .doc >> Directory.Out $ cat directory.outch1.doc ch2.doc ch3.doc chimp config mail / test / ch1.doc ch2.doc ch3.doc $ and the standard output redirection, The error output of the program can also be reordered. Use symbol 2> (or appended symbol 2 >>) to represent the redirection of the error output device. For example, the following command: $ LS / USR / TMP 2> Err.file can see the normal output result of the program on the screen, but send any error information of the program to file err.file to check for future check. You can also use another output redirect operator (&>) to send the standard output and the error output to the same file. For example: $ LS / USR / TMP &> OUTPUT.FILE uses the redirection to combine the command, you can implement new features that the system is unable to provide. For example, using the following command sequence: $ LS / USR / BIN> / TMP / DIR $ WC -W tmp / dir459 counts the number of files in the / usr / bin directory. The pipelines uses the output of a program or command as the input of another program or command, and there are two ways, one is combined with two commands or programs, such as / TMP / DIR file in the previous example Level the LS and WC commands; the other is the pipe function provided by Linux. This method is better than the previous method. The pipe can connect a series of commands, which means that the output of the first command will be transmitted to the second command as the input of the second command, and the output of the second command will be input as the third command. In this class. Displayed on the screen is the output of the last command in the pipe line (if an output redirection is not used in the command line). Establish a pipeline by using pipes "|". Examples of the above: $ ls / usr / bin | wc -w1789, such as: $ cat sample.txt | grep "high" | WC -L pipelines the output of the CAT command (list of a file) Give the grep command. The grep command looks for the word high in the input, the output of the grep command is all lines that contain the word high, and this output is sent to the WC command, the WC command statistics the number of rows in the input. Suppose the contents of the Sample.txt file are as follows: THINGS to do Today: low: Go Grocery ShoppingHigh: Return Movieh: Clear Level 3 in Alien vs. PREDATORMEDIUM: PICK UP CLOTHES from Dry Cleaner The result is 2. The command replacement command replacement and redirects are some similar, but the difference is that the command replacement is the parameter of the output of one command as the other command. The common command format is: Command1 `command2. Among them, the output of Command2 will be used as the parameters of Command1. It should be noted that the `symbol here, which is executed as a command, and the resulting result is the parameters of Command1. For example: $ cd `pwd` This command lists the directory of the PWD command as the parameter of the CD command, and the result is still in the current directory. The 22nd lesson operations in Bash 2000 / May / 29 Command and file name extension feature Bash command line has commands and file name extension features. When entering a command or file name that has not been completed, just type the Tab key to activate the command and file name extension characteristics, thereby completing the remaining input of the command. If multiple commands or files are the same, BASH will ring and wait for the user to enter enough characters so that the unique command or file name, if found, the system will automatically replenish the command or file name, the user presses After the Enter key, the system will execute this instruction. For example: $ CAT pre For example: $ lsdocument docudrama $ cat doc The easiest way is to use the up and down arrow keys to display the previous events to the command line. This action is not required to run the History command. Press the up arrow key, then an event on the last execution will appear on the command line, then press the previous event, will appear on the command line; press the down arrow key, will make The next incident of the current event appears on the command line. BASH can also complete the character extension of historical events by typing ESC, Tab keys. Like the standard command line extension characteristics, type some strings of historical events, then type ESC, and type the Tab key, and the historical events that match the string that just typed will be automatically extended and returned to the command line. If more than one event matches the input string, he will hear a ring, continue to type characters or strings, and the shell will only determine the historical event to be typed. There is also a command to query and execute historical events -! Command. Type characters associated with historical events after the command, this associated character can be the historical event number of the historical event, or the first few characters of the event. In the example below, query the event number of the historical event number 3, and then match the characters you start, and query the command. [Example] $! 3mv MyData Reports $! MVMV MyData Reports can also query historical events with an offset (relative to the last event in the list of historical events). The negative offset will be ordered from the historical event list. In the example below, the event number "VI MyData" is queried with a negative offset. It must be noted that this offset is the last event relative to the historical event list. In this example, the last event in the list of historical events is event 5, and the first event in the historical event list is 1. From the incident of the historical incident number 5, it is shifted forward 4, which is an event of the historical event number 2. [Example] $! -4vi mydata If you type !!, the system defaults to the previous event. In the following example, the user typed on the command line !! Command, the system will execute the previous event: "LS" command. [Example] $ !! LSMYDATA Today Reports can also search for a historical event with "Mode". Search "Mode" must be used to enclose. The following example uses "Mode" "" MYD? "To search for historical events" VI MyData ". [Example] $!? Myd? Vi mydata1. Query history events can edit the events in the historical event list on the command line. Table 10-3 lists the various operations of the query historical event list. Table 10-3 Query History Event Operation Query History Event Operation Function Ctrl N or down the cursor button to move the next historical event in the list of current events Ctrl P or up the cursor button to the current event in the historical event list Previous history ESC [Example] $ Histfile / Home / Lisa / .bash_history $ histfile = "/ home / lisa / newhist" $ HISTFILE / HOME / LISA / NewHist The value of the variable histfile is displayed, and then gives it a new value "/ Home / lisa / newhist", all historical events will be saved in the newhist file. Alias is another way to make your work easier is to use the command alias. Command alias is usually an abbreviation for other commands to reduce keyboard input. The command format is: alias [alias-name = 'original-command'] where alias-name is an alias for the user, oriGinal-command is the original command and parameters. It should be noted that because the Bash is a space or carriageway to identify the original command, if the quotation is not used, it may cause BASH to only intercept the first word, thereby incorporated. If any parameters are not used after the alias command, display the unknown commands that are currently being used. The alias taking the order is always valid during the login. If the user needs an alias to be valid at each login, then the alias command is written to the initialized script file. [Example] If you want to type the following command, it is best to build an alias for it to reduce workload. $ CD / USR / X11 / LIB / X11 If you create an alias called GoConfig, type the following command at the Bash prompt: $ alias goconfig = 'CD / usr / x11 / lib / x11' Now, unless You exit Bash, type GoConfig, will have the same role in the original long command. If you want to cancel an alias, you can use the following command: $ UNALIAS GOCONFIG This is some people who think useful, you can write them into initialized scripts to improve work efficiency: alias ll = 'ls -l'alias log =' Logout'Alias ls = 'ls -f' If you are a DOS user and get used to the DOS command, you can define the following alias to make Linux performance like DOS: Alias Dir = 'ls'alias copy =' CP'Alias Rename = 'mv'Alias md =' mkdir'Alias rd = 'rmdir' Note: When defining alias, the equal sign cannot have spaces on both sides, otherwise shell cannot decide what you need to do. Quotation is required only when the command is included in the command. If you type an alias command that does not have any parameters, all defined alias will be displayed. The prompt BASH has two levels. The first level prompt is the situation that the BASH that is often seen is waiting for the command to enter. The default value of the first level prompt is a symbol. If the user does not like this symbol, or willing to define the prompt himself, simply modify the value of the PS1 variable. For example, it will be changed to: ps1 = "Enter A Command:" The second level prompt is displayed when the BASH is required to enter more information to execute a command. The second level prompt defaults to>. If you need to define your prompt, you only need to change the value of the PS2 variable. For example, it will be changed to: ps2 = "more information:" The above two examples are the case where the set prompt is a static string. In fact, users can also use some special characters that have been defined in advance. These special characters will enable the prompt that contain information such as the current time. Table 10-4 lists some of the most common special characters and its meaning. Table 10-4 BASH prompt often uses special character special character descriptions! Show history number # Show the shell activation, the current command history number $ displays a $ symbol, if the current user is root, display # symbol / display an anti Slash D Displays the current date H Displays the computer host name n to run the shell, which will cause the prompt cross-line SHELL name T Dis display the current time u Displays the current user's username W to display the current work. Directory Benchmark W Display The current work directory These special characters can be combined to provide users with some prompts, providing very useful information. Let's take a few practical examples: PS1 = "t" will make the prompt as follows: 02: 16: 15 and PS1 = T will make the prompt becomes as follows: T If ps1 = "t /" The prompt will be made as follows: 02: 16: 30 This example is the combination of two special characters. Controlling the operating mode BASH has some special variables that control the shell work in different ways. For example, variable NoClobber prevents accidentally overwriting a file unexpected when redirecting output. You can set the valid or invalidation of the NOCLOBBER variable through the set command. The set command has two parameters: one is an option to specify the variable open (ON) or off (OFF), one is a variable name of a special variable. To make a special variable (effective), use the -o option to make it (invalid), with O options. For example: $ set -o noclobber // Make Noclobber variables to set O Noclobber // Three most common shell special variables for Noclobber variables are: IgnoreEOF, NOCLOBBER, and NOGLOB. The IgnoreEofignoreEOF variable is used to disable the use of Ctrl D to exit Shell (Ctrl D is not only used to exit the shell, and the user can terminate the input to the standard output. This operation is often used in some shell utility commands, such as utility command CAT In these utility operations, it is very easy to operate and unexpectedly exits shell.ignoreEOF special variables are used to prevent this unexpected exit. After $ set -o ignoreeof, users can only exit with logout or exit commands. Shell.noClobbernoclobber variables can protect existing files when redirect output, prevent accidentally override. In the following example, the user sets NOCLOBBER to be valid. When redirects, the user tries to override the existing file MyFile, at which time the system An error message will be returned. [Example] $ set -o noclobber $ cat preface> myfilebash: myfile: Cannot Overwrite existing file $ noglob Set Noglob variables, the shell will not extend some special characters or strings in the file name. Such as characters *,?, [], Etc. will no longer be used as a wildcard. If the user wants to list file names answer ?, can pass the following steps: First, the user makes the Noglob variable to be invalid, and then list the file name. You can see At present, the question mark on the current command line is considered to be a character in the file name, instead of being regarded as a wildcard. $ Set -o noglob $ ls answer? Answer? Child shell with the export command User Log in to the Linux system, The system will start a user shell. In this shell, you can use the shell command or declared variable, you can also create and run the shell script. When you run the shell script, the system will create a child shell. At this time, there will be two A shell, one is the shell that is launched when logging in, and the other is the shell that the system creates by the system. When a scriptor is running, its script shell will terminate, you can return to the shell before executing the script. From this In terms of meaning, users can have many shells, each shell is derived from a shell (called the parent shell). The variables defined in the sub-shell are only valid within the sub-shell.