Bash
Bash
Shells
Each OS has one, but different levels of sophistication
Windows Command Prompt sh original /bin/sh
bash Bourne-Again Shell, derived from sh ksh Korn shell = superset of sh
...
10-Jan-14 Advanced Programming Spring 2002 2
sh
Shell is just another program:
while (1) { read line from terminal; parse into words; substitute variables; execute commands (execv or builtin); }
10-Jan-14
(ba)sh
both synchronous and asynchronous execution
synchronous: wait for completion in parallel with shell
control stdin, stdout, stderr set environment for processes (using inheritance between processes) set default directory builtins:
cd, break, continue, exec, ... convenience: history, getopts, kill, pwd
10-Jan-14 Advanced Programming Spring 2002 5
sh
Language:
variables flow-control constructs functions
10-Jan-14
(ba)sh operation
1. read input from file, from c command line string or terminal 2. break input into words and operators; alias expansion 3. simple and compound commands 4. shell expansions (variables, glob, ...) 5. perform redirections 6. execute command 7. optionally wait for command to complete
10-Jan-14 Advanced Programming Spring 2002 7
10-Jan-14
10-Jan-14
List of commands
cmd1; cmd2; ...: execute sequentially cmd1 & : execute asynchronously cmd1 && cmd2 ...: execute cmd2 if cmd1 has exit(0) cmd1 || cmd2 : execute cmd2 only if cmd1 has non-zero exit status
10-Jan-14
10
uninitialized variables have no value variables are untyped, interpreted based on context
10-Jan-14 Advanced Programming Spring 2002 11
Environment variables
Shell variables are generally not visible to programs Environment = list of name/value pairs passed to sub-processes All environment variables are also shell variables, but not vice versa Make variables visible to processes with export, as in export foo export foo=17 Show with env
10-Jan-14 Advanced Programming Spring 2002 12
Shell variables
${N} = shell Nth parameter $$ = process ID $? = exit status standard environment variables include:
10-Jan-14
HOME = home directory PATH = list of directories to search TERM = type of terminal (vt100, ...) TZ = timezone (e.g., US/Eastern)
Advanced Programming Spring 2002 13
Looping constructs
Similar to C/Java constructs, but with commands:
until test-commands; do consequentcommands; done while test-commands; do consequentcommands; done for name [in words ...]; do commands; done
while example
shell style
i=0 while [ $i -lt 10 ]; do echo "i=$i" ((i=$i+1)) done
C style
((i = 0)) while (( i < 10 )) do echo "i=$i" ((i++)) done
10-Jan-14
15
sh: if
if test-commands; then
10-Jan-14
16
Functions
Very limited support for functions:
function useless() { echo "First $1 echo "Second $2" echo "Third $3" echo "Fourth $4 }
useless a b c
10-Jan-14 Advanced Programming Spring 2002 17
Scripts
Binaries and scripts are treated the same Make executable (chmod u+x) and add
#! /usr/local/gnu/bin/bash
More generically:
#!/usr/bin/env bash
Also,
. script source script
10-Jan-14 Advanced Programming Spring 2002 18
Expansion
Biggest difference to traditional languages
shell substitutes and executes mix variables and code run-time code generation
For bash:
10-Jan-14
brace expansion tilde expansion parameter and variable expansion command substitution arithmetic expansion word splitting filename expansion
Advanced Programming Spring 2002 19
Brace expansion
Expand comma-separated list of strings into separate words:
bash$ echo a{d,c,b}e ade ace abe
10-Jan-14
20
Tilde expansion
~ expands to $HOME e.g.,
~/foo /usr/home/foo ~hgs/src /home/hgs/src
10-Jan-14
21
Command substitution
Replace $(command) or `command` by stdout of executing command Can use to execute content of variables:
x=ls echo `ls`
Danger!
10-Jan-14
22
Filename expansion
Any word containing *?([ is considered a pattern * matches any string ? matches any single character [...] matches any of the enclosed characters
10-Jan-14
23
Redirections
stdin, stdout and stderr may be redirected < redirects stdin (0) from file > redirects stdout (1) to file >> appends stdout to file &> redirects stderr (2) << magic
here-document
magic
10-Jan-14 Advanced Programming Spring 2002 24