890 likes | 1.13k Views
Advanced UNIX. The C Shell. Objectives of these slides: Introduce the C Shell Concentrate on features not in the Bourne Shell (but many are in Bash). Background. Originally part of Berkeley UNIX More tolerant of mistakes than Bourne e.g. can avoid accidental logouts, overwrites
E N D
Advanced UNIX The C Shell • Objectives of these slides: • Introduce the C Shell • Concentrate on features not in the Bourne Shell (but many are in Bash)
Background • Originally part of Berkeley UNIX • More tolerant of mistakes than Bourne • e.g. can avoid accidental logouts, overwrites • Easier to configure • e.g. alias, history, job control • Some scripting improvements over Bourne: • better variables, arrays, expressions
Almost all the good ideas from the C Shell have been added to Bash: • e.g. history, aliases, job control, directory stacks
Entering & leaving the C Shell • Check your default shell with ps • Change shell using chsh or type csh • Exit with: exit, logout(control-D maybe) csh is actually tcsh on most Linux versions
History • A list of recently used command lines (events) that can be reused. • $ set history = 25 (record 25 events)$ set savehist = 20 (remember 20 events after logout)$ history (see history list)
Using the history list • $ !! (execute last event) • $ !<number> (execute event no. <number>) $ !3 • $ !<initial-text> (execute most recent command that starts with initial-text) $ !gcc $ !loc
Bash History • history [ number ] • lists the last number commands! • Bash supports the same history list features: • !!, !<number>, !<text> • Relevant environment variables: • HISTFILE=/home/ad/.bash_history • HISTFILESIZE=500 • HISTSIZE=500
In Bash, you can modify the prompt to include the history number. • Inside .bashrc: PS1="\!.\u@\h$ " \! includes the history number
Alias • Define new commands by using string substitution. • Format: $ alias new-command executed-command(s) • e.g. $ alias ll ls -lg$ ll
Examples • $ alias ls ls -lg • $ alias mi mv -i • $ alias who ’who ; date’ redefining commands is okay
Argument Substitution • \!^the first argument of the new command • \!*all the arguments of the new command • $ alias wid ’who | fgrep \!^’ • $ wid igoris the same as:$ who | fgrep igor
Check your aliases • $ alias (list the current aliases) • $ alias hd (check hd alias) • $ unalias hd (cancel hd alias) • $ \ls (use original meaning of ls)
Bash Alias • Bash alias works the same way at the command line as in csh: alias, unalias, \command • Defining an alias in .bashrc is different: alias name = value • alias ls='/bin/ls -F' • alias ll='ls -l' • alias h="history 30"
Aliases that require multiple commands or arguments are defined as functions: sgrep(){ ps aux | grep $1 | grep -v grep}cs(){ cd $1 ls}
Job Control • Move commands between foreground and background; suspend commands. • Each background job has a PID and a job number.
Example • $ spell glossary > glossary.out &[1] 26025$ date &[2] 26028Fri Jun 6 16:56:11 GMT+7 2000[2] Done date$ gcc big.c &[2] 26041
$ jobs[1] - Running spell glossary.out > glo[2] + Running gcc big.c • Other status messages: • Stopped • Stopped (tty input) • Done
Background to Foreground • $ fg %job-number • Example: $ fg %2
Foreground to Background • $ control-Z (suspends job and puts it into the background) • $ bg (resumes the job) • $ bg %job-number (resumes job-number)
Stopping • $ stop %job-number • $ kill %job-number (kills job-number) • A job stopped for tty input must be brought to the foreground (with fg).
State Change • The C Shell prints a message at the next prompt when the state of a job changes. • Use notify to make the shell report a change immediately: $ notify %job-number
Home Directory Short Forms • ~ (your home directory) • ~name (home directory of name) e.g. ~ad • Use: $ cp idea.txt ~ $ ls ~ad/teach
Filename Completion • $ set filec (‘switch on’ file completion) • $ cat trig1A <press esc>$ cat trig1A.txt
Control-D for help sometimes <tab> • $ ls h*help.hist help.text help.trig.01 • $ cat h <press esc>$cat help. <beep><press control-D>help.hist help.text help.trig.01$ cat help.
adv-unix ~ Directory Stacks • Store a list of directories you are using on a stack. • Switch between directories by referring to the stack. cops_104
adv-unix push the directory onto the stack and do a cd • $ pwd/home/ad/$ pushd ~/teach/adv-unix~/teach/adv-unix ~$ pwd/home/ad/teach/adv-unix$ pushd ~/cops_104~/cops_104 ~/teach/adv-unix ~$ pwd/home/ad/cops_104 cops_104 ~ ~
adv-unix cops_104 ~ Change directories quickly push the top directory down and do a cd • $ pushd~/teach/adv-unix ~/cops_104 ~$ pwd/home/ad/teach/adv-unix/
adv-unix ~ push the top directory down and do a cd • $ pushd~/cops_104 ~/teach/adv-unix ~$ pwd/home/ad/cops_104 cops_104
adv-unix ~ Popd pop the top directory and cd to the new top • $ popd~/teach/adv-unix ~$ pwd/home/ad/teach/adv-unix/
Other Stack Commands • $ dirs (lists the directories on the stack) • $ pushd +number • move the directory in position number to the top (0), and cd to that directory • the stack is numbered 0, 1, 2, ...
$ popd +number • pop off the directory at position number • if number is not 0 then there is no change to the present directory
Variables ( 4 types) String Variables Numerical Variables Special Forms of User Variables Shell Variables
String Variables • $ set name = fred (include spaces in older csh's)$ echo $namefred$ set (list set variables)$ unset name (delete name var)
setenv (environment vars) no = • $ setenv name fred$ echo $namefred$ setenv$ unsetenv name • setenv makes the variable visible to any scripts called from the shell (or from the script containing the setenv).
Arrays of String Vars • $ set colours = (red green blue orange)$ echo $coloursred green blue orange$ echo $colours[3]blue$ echo $colours[2-4]green blue orange
$ set shapes = (’’ ’’ ’’ ’’ ’’)$ echo $shapes$ set shapes[4] = square$ echo $shapes[4]square
Braces • Use {...} to distinguish a variable from surrounding text. • $ set prefix = Alex$ echo $prefix is short for{$prefix}ander.Alex is short for Alexander. • Can also write $prefix{ander}
Numeric Variables • Use the @ command for variables holding numbers. • $ @ count = 0 (or set count = 0)$ echo $count0$ @ count = ( 5 + 2 )$ echo $count7$ @ result = ( $count < 5 )$ echo $result0 Remember the space after the @
$ @ count = $count + 5$ echo $count12 • Could write: $ @ count += 5 • $ @ count++$ echo $count13
Operators • Most of the C numerical operators: • Arithmetic: + - * / % • Relational: > < >= <= != == • Logical: && || ! • etc.
Arrays of Numeric Vars • $ set ages = (0 0 0 0 0)$ @ ages[2] = 15$ @ ages[3] = ( $ages[2] + 4 )$ echo $ages[3]19$ echo $ages0 15 19 0 0
Bourne Shell Equivalents • The Bourne Shell only has string variables. • It uses expr to switch string variables into numbers: $ number=5 (Bourne)$ number=‘expr $number + 2‘ $ @ number = 5 (C Shell)$ @ number = $number + 2
Special Forms of User Variables • $#VAR (returns number of elements in VAR array) • $?VAR (returns 1 if VAR is declared; 0 otherwise)
$ set days = (mon tues wed thurs fri)$ echo $#days5$ echo $?days1$ unset days$ echo $?days0 days is declared days is not declared
Shell Variables • Shell variables can be initialized in three ways: • by the shell • by the environment • by the user with setor setenv
There are two types of shell variable: • shell variables that take values; • shell variables that act as switches • they have the value 0 or 1
Shell Vars that take Values • $argv[0] or $0 command name • $argv[1] or $1 first argument of command • Also $2,$3,... • no upper limit; no need for shift • $argv[*] or $* array of all arguments • $#argv number of arguments
$HOME pathname to user’s home directory • $PATH array of pathnames to commands $ setenv PATH (/usr/bin /usr/ucb /bin ~/bin) • $status exit status of last command • etc...
Shell Vars that act as Switches • $filec turns on file completion • $ignoreeof disables ctrl-D as logout • $noclobber stops file overwriting with > • $notify immediate notification about background job changes • etc... Use: $ set ignoreeof
Automated Scripts • At login, the C Shell executes a range of scripts automatically: • /etc/csh.login, /etc/csh.cshrc • .login in your home directory • .cshrc in your home directory • At logout, it executes: • /etc/csh.logout • .logout in your home directory