This subsection describes the many symbols peculiar to the Bourne and Korn shell. The topics are arranged as follows:
Special files
Filename metacharacters
Quoting
Command forms
Redirection forms
Coprocesses (Korn shell only)
/etc/profile  | Executed automatically at login.  | 
$HOME/.profile  | Executed automatically at login.  | 
/etc/passwd  | Source of home directories for ~  | 
$ENV  | Specifies the name of a file to read when a new Korn shell is created.  | 
*  | Match any string of zero or more characters.  | 
?  | Match any single character.  | 
[  | Match any one of the enclosed characters; a hyphen can be used to specify a range (e.g., a-z, A-Z, 0-9).  | 
[!  | Match any character   | 
In the Korn shell:
?(  | Match zero or one instance of   | 
*(  | Match zero or more instances of   | 
+(  | Match one or more instance of   | 
@(  | Match exactly one instance of   | 
!(  | Match any strings that don't contain   | 
~  | HOME directory of the current user.  | 
~  | HOME directory of user   | 
~+  | Current working directory (PWD).  | 
~-  | Previous working directory (OLDPWD).  | 
The pattern above can be a sequence of patterns separated by |,
meaning that the match applies to any of the patterns.
This extended syntax resembles that available to
egrep and awk.
$ls new*List new and new.1. $cat ch?Match ch9 but not ch10. $vi [D-R]*Match files that begin with uppercase D through R. $cp !(Junk*|Temp*)*.c ..Korn shell only. Copy C source files except forJunkandTempfiles.
Quoting disables a character's special meaning and allows it to be used literally, as itself. The following characters have special meaning to the Bourne and Korn shells:
;  | Command separator.  | 
&  | Background execution.  | 
( )  | Command grouping.  | 
|  | Pipe.  | 
> < &  | Redirection symbols.  | 
* ? [ ] ~ + - @ !  | Filename metacharacters.  | 
" ' \  | Used in quoting other characters.  | 
`  | Command substitution.  | 
$  | Variable substitution (or command substitution).  | 
newline space tab  | Word separators.  | 
The characters below can be used for quoting:
Everything between " and " is taken literally, except for the following characters that keep their special meaning:
Variable substitution will occur.
Command substitution will occur.
This marks the end of the double quote.
' 'Everything between ' and ' is taken literally except for another '.
\The character following a \ is taken literally. Use within " " to escape ", $, and `. Often used to escape itself, spaces, or newlines.
$echo 'Single quotes "protect" double quotes'Single quotes "protect" double quotes $echo "Well, isn't that \"special\"?"Well, isn't that "special"? $echo "You have `ls|wc -l` files in `pwd`"You have 43 files in /home/bob $echo "The value of \$x is $x"The value of $x is 100
  | Execute   | 
  | Command sequence; execute multiple   | 
(  | Subshell; treat   | 
  | Pipe; use output from   | 
  | Command substitution; use   | 
  | Korn-shell command substitution; nesting is allowed.  | 
  | AND; execute   | 
  | OR; execute either   | 
{   | Execute commands in the current shell.  | 
$nroff file &Format in the background. $cd; lsExecute sequentially. $(date; who; pwd) > logfileAll output is redirected. $sort file | pr -3 | lpSort file, page output, then print. $vi `grep -l ifdef *.c`Edit files found by grep. $egrep '(yes|no)' `cat list`Specify a list of files to search. $egrep '(yes|no)' $(cat list)Korn shell version of previous. $egrep '(yes|no)' $(<list)Same, but faster. $grep XX file && lp filePrint file if it contains the pattern, $grep XX file || echo "XX not found"otherwise, echo an error message.
File  | Common  | Typical  | |
|---|---|---|---|
Descriptor  | Name  | Abbreviation  | Default  | 
0  | Standard Input  | stdin  | Keyboard  | 
1  | Standard Output  | stdout  | Terminal  | 
2  | Standard Error  | stderr  | Terminal  | 
The usual input source or output destination can be changed as follows:
  | Send output of   | 
  | Send output of   | 
  | Take input for   | 
  | Read standard input up to a line identical to   | 
  | Send   | 
  | Same, except that output that would normally go to file descriptor   | 
  | Close standard output.  | 
  | Take input for   | 
  | Same, except that input that would normally come from file descriptor   | 
  | Close standard input.  | 
  | Send standard error to   | 
  | Send both standard error and standard output to   | 
(  | Send standard output to file   | 
  | Send output of   | 
No space should appear between file descriptors and a redirection symbol; spacing is optional in the other cases.
$cat part1 > book$cat part2 part3 >> book$mail tim < report$sed 's/^/XX /g' << END_ARCHIVE>This is often how a shell archive is "wrapped",>bundling text for distribution. You would normally>run sed from a shell program, not from the command line.>END_ARCHIVEXX This is often how a shell archive is "wrapped", XX bundling text for distribution. You would normally XX run sed from a shell program, not from the command line.
To redirect standard output to standard error:
$echo "Usage error: see administrator" 1>&2
The following command will send output (files found) to filelist and send error messages (inaccessible files) to file no_access:
$(find / -print > filelist) 2>no_access
Coprocesses are a feature of the Korn shell only.
  | Coprocess; execute the pipeline in the background. The shell sets up a two-way pipe, allowing redirection of both standard input and standard output.  | 
read -p   | Read coprocess input into variable   | 
print -p   | Write   | 
  | Take input for   | 
  | Send output of   | 
ed - memo |&Start coprocess.print -p /word/Send ed command to coprocess.read -p searchRead output of ed command into variable search.print "$search"Show the line on standard output.A word to the wise.