CONTENTS |
Feature | Bourne | C | TC | Korn | Bash |
---|---|---|---|---|---|
Aliases | no | yes | yes | yes | yes |
Advanced Pattern Matching | no | no | no | yes | yes |
Command Line Editing | no | no | yes | yes[a] | yes |
Directory Stacks (pushd, popd) | no | yes | yes | no | yes |
Filename Completion | no | yes[a] | yes | yes | yes |
Functions | yes | no | no | yes | yes |
History | no | yes | yes | yes | yes |
Job Control | no | yes | yes | yes | yes |
Key Binding | no | no | yes | no | yes |
Prompt Formatting | no | no | yes | no | yes |
Spelling Correction | no | no | yes[a] | no | yes[b] |
[a] not a default setting; must be set by the user.
[b] cdspel is a shopt option set to correct minor spelling errors in directory names when cd is used.
The TC shell (tcsh) is an enhanced version of the Berkeley C shell (csh). Listed here are some of the new features.
An enhanced history mechanism
A built-in command line editor (emacs or vi) for editing the command line
Formatting the prompts
A spelling correction facility and special prompts for spelling correction and looping
Enhanced and programmed word completion for completing commands, filenames, variables, usernames, etc.
Ability to create and modify key bindings
Automatic, periodic, and timed events (scheduled events, special aliases, automatic logout, terminal locking, etc.)
New built-in commands (hup, ls F, newgrp, printenv, which, where, etc.)
New built-in variables (gid, loginsh, oid, shlvl, tty, uid, version, HOST, REMOTEHOST, VENDOR, OSTYPE, MACHTYPE)
Read-only variables
Better bug reporting facility
The Bourne Again (bash) shell has the following features not found in the traditional Bourne shell (sh).
Formatting the prompts
History (csh style)
Aliases
A built-in command line editor (emacs or vi) for editing the command line
Directory manipulation with pushd and popd
Csh-type job control to stop or run jobs in the background, bring them to the foreground, etc. with command such as bg, fg, Ctrl-Z, etc.
Tilde, brace, and parameter expansion
Key bindings to customize key sequences
Advanced pattern matching
Arrays
The select loop (from Korn shell)
Many new built-in commands
Feature | csh/tcsh | Bourne | Bash | Korn |
---|---|---|---|---|
Variables: | ||||
Assigning values to local variables | set x = 5 | x=5 | x=5 | x=5 |
Assigning variable attributes | declare or typeset | typeset | ||
Assigning values to environment variables | setenv NAME Bob | NAME='Bob'; export NAME | export NAME='Bob' | export NAME='Bob' |
Read-Only Variables: | ||||
Accessing variables | echo $NAME set var = net echo ${var}work network | echo $NAME var=net echo ${var}work network | echo $NAME var=net echo ${var}work network | echo $NAME or print $NAME var=net print ${var}work network |
Number of characters | echo $%var (tcsh only) | N/A | ${#var} | ${#var} |
Special Variables: | ||||
PID of the process | $$ | $$ | $$ | $$ |
Exit status | $status, $? | $? | $? | $? |
Last background job | $! (tcsh only) | $! | $! | $! |
Arrays: | ||||
Assigning arrays | set x = ( a b c ) | N/A | y[0]='a'; y[2]='b'; y[2]='c' fruit=(apples pears peaches plums) | y[0]='a'; y[1]='b'; y[2]='c' set A fruit apples pears plums |
Accessing array elements | echo $x[1] $x[2] | N/A | echo ${y[0]} ${y[1]} | print ${y[0]} ${y[1]} |
All elements | echo $x or $x[*] | N/A | echo ${y[*]}, ${fruit[0]} | print ${y[*]}, ${fruit[0]} |
No. of elements | echo $#x | N/A | echo $y{#[*]} | print ${#y[*]} |
Command Substitution: | ||||
Assigning output of command to variable | set d = `date` | d=`date` | d=$(date) or d=`date` | d=$(date) or d=`date` |
Accessing values | echo $d echo $d[1], $d[2], ... echo $#d | echo $d | echo $d | print $d |
Command Line Arguments (Positional Parameters): | ||||
Accessing | $argv[1], $argv[2] or $1, $2 ... | $1, $2 ... $9 | $1, $2, ... ${10} | $1, $2, ... ${10} |
Setting positional parameters | N/A | set a b c set `date` echo $1 $2 ... | set a b c set `date` or set $(date) echo $1 $2 ... | set a b c set `date` or set $(date) print $1 $2 ... |
No. of command line arguments | $#argv $# (tcsh) | $# | $# | $# |
No. of characters in $arg[number] | $%1, $%2, (tcsh) | N/A | N/A | N/A |
Metacharacters for Filename Expansion: | ||||
Matches for: | ||||
Single character | ? | ? | ? | ? |
Zero or more characters | * | * | * | * |
One character from a set | [abc] | [abc] | [abc] | [abc] |
One character from a range of characters in a set | [a c] | [a c] | [a-c] | [a c] |
One character not in the set | N/A (csh) [^abc] (tcsh) | [!abc] | [!abc] | [!abc] |
? matches zero or one occurrences of any pattern in the parentheses. The vertical bar represents an or condition; e.g., either 2 or 9. Matches abc21, abc91, or abc1. | abc?(2|9)1 | abc?(2|9)1 | ||
Filenames not matching a pattern | ^pattern (tcsh) | |||
I/O Redirection and Pipes: | ||||
Command output redirected to a file | cmd > file | cmd > file | cmd > file | cmd > file |
Command output redirected and appended to a file | cmd >> file | cmd >> file | cmd >> file | cmd >> file |
Command input redirected from a file | cmd < file | cmd < file | cmd < file | cmd < file |
Command errors redirected to a file | (cmd > /dev/tty)>&errors | cmd 2>errors | cmd 2> file | cmd 2> errors |
Output and errors redirected to a file | cmd >& file | cmd > file 2>&1 | cmd >& file or cmd &> file or cmd > file 2>&1 | cmd > file 2>&1 |
Assign output and ignore noclobber | cmd >| file | N/A | cmd >| file | cmd >| file |
here document | cmd << EOF input EOF | cmd << EOF input EOF | cmd << EOF input EOF | cmd << EOF input EOF |
Pipe output of one command to input of another command | cmd | cmd | cmd | cmd | cmd | cmd | cmd | cmd |
Pipe output and error to a command | cmd |& cmd | N/A | N/A | (See coprocesses) |
Coprocess | N/A | N/A | N/A | command |& |
Conditional statement | cmd && cmd cmd || cmd | cmd && cmd cmd || cmd | cmd && cmd cmd || cmd | cmd && cmd cmd || cmd |
Reading from the Keyboard: | ||||
Read a line of input and store into variable(s) | set var = $< set var = 'line' | read var read var1 var2... | read var read var1 var2... read read -p prompt read -a arrayname | read var read var1 var2... read read var?"Enter value" |
Arithmetic: | ||||
Perform calculation | @ var = 5 + 1 | var=`expr 5 + 1` | (( var = 5 + 1 )) let var=5+1 | (( var = 5 + 1 )) let var=5+1 |
Tilde Expansion: | ||||
Represent home directory of user | ~username | N/A | ~username | ~username |
Represent home directory | ~ | N/A | ~ | ~ |
Represent present working directory | N/A | N/A | ~+ | ~+ |
Represent previous working directory | N/A | N/A | ~- | ~ |
Aliases: | ||||
Create an alias | alias m more | N/A | alias m=more | alias m=more |
List aliases | alias | alias, alias -p | alias, alias t | |
Remove an alias | unalias m | N/A | unalias m | unalias m |
History: | ||||
Set history | set history = 25 | N/A | automatic or HISTSIZE=25 | automatic or HISTSIZE=25 |
Display numbered history list | history | history, fc -l | history, fc l | |
Display portion of list selected by number | history 5 | history 5 | history 5 10 history 5 | |
Reexecute a command | !! (last command) !5 (5th command) !v (last command starting with v) | !! (last command) !5 (5th command) !v (last command starting with v) | r (last command) r5 (5th command) r v (last command starting with v) | |
Set interactive editor | N/A (csh) bindkey -v or bindkey -e (tcsh) | N/A | set -o vi set -o emacs | set -o vi set -o emacs |
Signals: | ||||
Command | onintr | trap | trap | trap |
Initialization Files: | ||||
Executed at login | .login | profile | bash_profile | profile |
Executed every time the shell is invoked | .cshrc | N/A | BASH_ENV=.bashrc (or other filename) (bash 2.x) ENV=.bashrc | ENV=.kshrc (or other filename) |
Functions: | ||||
Define a function | N/A | fun() { commands; } | function fun { commands; } | function fun { commands; } |
Call a function | N/A | fun fun param1 param2 ... | fun fun param1 param2 ... | fun fun param1 param2 ... |
Programming Constructs: | ||||
if conditional | if ( expression ) then commands endif if { ( command ) } then commands endif | if [ expression ] then commands fi if command then commands fi | if [[ string expression ]] then commands fi if (( numeric expression )) then commands fi | if [[ string expression ]] then commands fi if (( numeric expression )) then commands fi |
if/else conditional | if ( expression ) then commands else commands endif | if command then commands else fi | if command then commands else fi | if command then commands else fi |
if/else/elseif conditional | if (expression) then commands else if (expression) then commands else commands endif | if command then commands elif command then commands else commands fi | if command then commands elif command then commands else commands fi | if command then commands elif command then commands else commands fi |
goto | goto label ... label: | N/A | N/A | N/A |
switch and case | switch ("$value") case pattern1: commands breaksw case pattern2: commands breaksw default: commands breaksw endsw | case "$value" in pattern1) commands ;; pattern2) commands ;; *) commands ;; esac | case "$value" in pattern1) commands ;; pattern2) commands ;; *) commands ;; esac | case "$value" in pattern1) commands ;; pattern2) commands ;; *) commands ;; esac |
Loops: | ||||
while loops | while (expression) commands end | while command do command done | while command do command done | while command do commands done |
for/foreach | foreach var (wordlist) commands end | for var in wordlist do commands done | for var in wordlist do commands done | for var in wordlist do commands done |
until | until command do commands done | until command do commands done | until command do commands done | |
repeat | repeat 3 "echo hello" hello hello hello | N/A | N/A | N/A |
select | N/A | N/A | PS3="Please select a menu item" select var in wordlist do commands done | PS3="Please select a menu item" select var in wordlist do commands done |
CONTENTS |