Topic 2: More Shell Skills Sub-topics: simple shell scripts (no ifs or loops yet) sub-shells quoting shell variables aliases bash initialization files I/O redirection & pipes text file formats 1
Reading For This Topic Reading: Custom Course Notes sections 4.2 through 4.6 2
Sub-Topic 1: Quoting Useful command for demonstrations: echo Prints all its arguments Normal rules: spaces separate words in commands some characters have special meanings to bash Sometimes useful to quote strings or characters. Three quoting mechanisms: 'string': every character in the string taken literally "string": most characters taken literally \c: character taken literally 3
Difference Between Single & Double Quotes A few special characters are interpreted by double quotes but not single quotes 1.!: history expansion 2. $: shell variables (next sub-topic) 3. back quotes (`) next week 4
Sub-Topic 2: Shell Variables shell variables: a way to store information in bash To give a value to a variable: today=monday If no "today" variables exists, creates it. Sets value to the string "Monday" To refer to value of variable: use $. Example: echo $today 5
Uses of Shell Variables 1. Use as variables in shell scripts 2. Store settings for shell and other programs. To see all variables with values: set 6
Referring to Shell Variables: More Awkward situation: ------$ object=computer ------$ echo I have two $objects I have two ------$ Why? Fix: ------$ echo I have two ${object}s I have two computers 7
Shell Variables and Quotes The $ character retains its special meaning inside double quotes. echo "Today is $today" Not inside single quotes. 8
Shell Variables Are Temporary Changes & new variables only last for life of current shell. To make a permanent change: use an initialization file (soon!) 9
PATH $PATH Contains list of directories separated by ":"s. When you type ls Bash looks for a command named "ls". Searching order: 1. Is it a built-in shell command? 2. In each directory in $PATH: is there a program called "ls"? 10
PS1 $PS1 is your bash prompt. Can contain literal characters plus some special ones: \d: the current date \h: the name of the host machine \j: number of jobs you have running \s: the name of the shell \u: name of user \w: current working directory \!: history number of this command 11
Sub-Topic 3: Sub-Shells A shell is a program. Linux automatically runs the bash program when you open a terminal. You can run it too. One reason: experiment with settings. Command to start a sub-shell: bash Exit back to starting shell: exit Use Shell variable $SHLVL to see if you're in a sub-shell A sub-shell "inherits" many of your settings, including current folder, umask Does not automatically inherit variables or aliases export command: says variable should be inherited by sub-shells export myvar 12
Sub-Topic 4: Simple Shell Scripts shell script = file containing bash commands Comments in scripts: # means rest of line is a comment Special variable names: $0: name of command $#: number of arguments $1,$2,...: the individual arguments $*: all the arguments in one string, separated by spaces 13
Executing a Shell Script First step: must be executable (chmod) Type command name alone: bash looks in your PATH directories Type command name with directory: no lookup needed 14
Digression #1: changing file permissions Shell command for changing permissions of a file or files: chmod chmod <users>+<permissions> <filenames> chmod <users>-<permissions> <filenames> chmod <users>=<permissions> <filenames> Users can be: u (user the person running chmod) g (the current group of the user) o (other people) or a combination Permissions can be: r (read) w (write) x (execute) or a combination Examples: chmod u+x myprogram chmod g-w somefile chmod o=rx otherfile chmod go= hiddenfile chmod ug+wr draft 15
Digression #2: default file permissions "umask" = "user mask" default file permissions Specifies permissions for new files you create A property of your bash session reset when you log off & back in. umask command: lets you view or change your umask umask with no args: displays in octal format umask -S: displays in symbolic format Format is like chmod: umask u+x file1 umask g=rx file2 umask o-w file3 16
Complication: scripts & sub-shells When you type the name of a script as a command: executed in a sub-shell. Consequence: can't use to create aliases or set variables, umask, etc. If you want script to affect current shell: source myscript Executes commands from myscript in the current shell. 17
#!/bin/bash Special Initial Comment At beginning of script, specifies this is a script to be run with bash. Why bother? Syntax of some commands different for every shell. Now your script will work for people using other shells. Not required for 220 assignments, but generally a good idea. 18
Alias = easy way to create synonym for a command provides shorthand for something you do often alias ll="ls l" Also a way to turn on certain options always. Example from standard.bashrc file: alias rm="rm -i" To execute original command (without alias): quote the name "rm" file1 file2 To cancel an alias: unalias rm To see all your aliases: alias (no arguments) Sub-Topic 5: Aliases
Sub-Topic 6: Bash Initialization Files In your home directory (probably!):.bash_profile: executed when you start a login shell.bashrc: executed when you start up any other shell Use these files for your own settings (variables, etc.) Advice: before you change, make a copy! don't remove standard files from path /cas/course/cisc220 contains sample files (do ls -a to make sure you see them!) 20
Sub-Topic 7: I/O Redirection & Pipes Three standard "streams" associated with any command or program: 0: standard input (default is keyboard) 1: standard output (default is screen) 2: error output (for error messages, default is screen) I/O redirection can change settings for these three screens 21
Command For Examples Command to use as example: sort. Reads standard input and sorts to standard output. demo... (use ^d to end input) 22
Redirecting Standard Input command 0< file Reads input from file, instead of keyboard. Shorter form: command < file Example: sort < numbers.txt 23
command 1> file Sends standard output of command to file, instead of screen. Shorter form: command > file Example: sort > file Redirecting Standard Output Example of redirecting standard input and output: sort < input > output 24
Output Redirection: Existing Files Bash may object if you redirect to an existing file Depends on noclobber option. To view current options: set -o To set option: set -o noclobber To turn off option: set +o noclobber Safer: don't count on noclobber. Use one of these instead: command > file: if file already exists, overwrite command >> file: if file already exists, append 25
Redirecting Standard Error command 2>filename example: ls *.c 2>errs 26
Getting Rid of Output You Don't Want send to /dev/null Example: error messages you want to throw away: ls *.c 2>/dev/null 27
Redirecting Both Output Files To 2 separate files: cmd 1>goodOutput 2>errOutput or: cmd >goodoutput 2>errOutput To the same file: cmd 1>outFile 2>&1 or: cmd 2>outFile 1>&2 28
Pipes cmd1 cmd2 Sends standard output of cmd1 to standard input of cmd2 Examples: command less command sort command sort > output commanda 2>&1 commandb cmd1 cmd2 cmd3 29
Sub-Topic 8: Text File Formats Basic text file format: ASCII or Unicode characters Problem: Different OSs, different character(s) for end of line! Unix/Linux: '\n' (newline) Windows/Dos: '\r' + '\n' (carriage return + newline) Mac: varies with version & program Most programs can deal with any of these formats. Others are confused by some formats. 30
Historical Note 31
Safety For Marked Assignments Best practice: Create & test your program on CASLab Linux. Do all your editing on Linux. Submit your program to OnQ from a Linux computer (not possible with putty; use the lab or other Linux GUI) Second best: Create & test your program on Linux. ftp to your own computer (Windows or Mac) submit to Moodle immediately Dangerous: Create & test your program on Linux. ftp to your own computer make a couple of trivial edits submit to Moodle 32