• New Due Date for Assignments
– Assignments will be due on Fridays now
1
• some people tried to solve one of the problems from assignment 1 with grep *r*s*t*
• or even ls | grep *r*s*t*
• Why didn’t this work?
• What was really happening?
2
• Wildcards allow the user to specify files and directories using text patterns in bash commands.
• The simplest wildcard metacharacter is ?
, a question mark. A question mark matches any one character.
• Observe:
• % ls
• a out x xy z
•
• % ls ?
• a x z
• % ls ???
• out
3
•
• echo is also good for exploring wildcards, and uses less vertical space on slides:
• % ls
• a out x xy z
A general rule:
% echo ?
• a x z
If a command line argument contains one or more wildcards, the shell replaces that argument with the file names in the current directory that match the specified pattern.
• % echo ??? ??
• out xy
Important:
Wildcards are not regular expressions.
• Predict the output:
• % echo ? ? ?
• a x z a x z a x z
The two facilities share a bit of common behavior but they are far more different than they are alike!
• % echo x? ?y
• xy xy
• % echo ? ?? x ??? ????
• a x z xy x out ????
If there's no match, like with ????
argument is passed through as-is.
, the
4
• Situation:
• % ls
• out p1.c test x.java
x2.c y.java
• Problem:
• Write commands to delete the Java files and move the C files to csrc in your home directory.
• Solution:
• % rm ?.java
• % mv ??.c ~/csrc
• Problem: Describe the file names that would be matched by each of the following.
• ???
• Three character names.
• a??b
• Four character names that start with an a and end with a b.
5
• A more powerful wildcard is * (asterisk). It matches any sequence of characters, including an empty sequence.
• * Matches every name
• *.java
Matches every name that ends with .java
•
• *x* Matches every name that contains an x
Examples: x , ax , axe , xxe , xoxox
6
• What would be matched by the following?
• *x*y
• Names that contain an x and end with y .
• *.*
• Names that contain at least one dot.
• *.*.*
• Names that contain at least two dots.
• a*e*i*o*u
• Names that start with an a , end with a u , and have e , i , o , in sequence in the middle.
7
• /usr/bin has a lot of files. Try some wildcards there!
• /usr/bin % ls *x*y
• dbiproxy expiry iproxy smproxy syslinux-legacy ...
•
• /usr/bin % ls *.*.* | wc
39 39 526
• /usr/bin % ls a*e*i*o*u*
• akonadi_mixedmaildir_resource
• /usr/bin % ls *-*-*-*-*-*
• rarian-sk-get-extended-content-list
• /usr/bin % ls *1*2*3
• ls: cannot access *1*2*3: No such file or directory
• Make some files with touch and try some matches.
• % touch a.b ab axe b oxo
• % echo a*b
• a.b ab
• % echo *b
• a.b ab b
•
•
• Wildcards can be combined. Examples:
??* Matches names that are two or more characters long
• *.?
Matches names whose next to last character is a dot
• What would be matched by the following?
• ?x?*
• Names that are at least three characters long and have an x as their second character.
• *-?-*
• Names that contain two dashes separated by a single character.
11
• The character set wildcard specifies that a single character must match one of a set.
• % ls
• a b e n out x xy z
• % echo [m-z] # one-character names in the range n-z
• n x z
• Another:
• % ls
• Makefile fmt.c
utils.c
utils.h
• % echo *.[chy]
• fmt.c utils.c utils.h
• More:
• [A-Z]*.[0-9]
• Matches names that start with a capital letter and end with a dot and a digit.
• *.[!0-9] (Leading !
complements the set.)
• Matches names that end with a dot and a non-digit character.
• Equivalent: *.[^0-9]
•
• [Tt]ext
• Matches Text and text .
12
• Slashes can be included in a pattern to match files anywhere.
• What do these commands do?
• wc ~/*.java
• Runs wc on every Java source file in my home directory.
• ls -l */Readme.txt
• Runs ls -l on every Readme.txt
in a subdirectory of this directory.
• cp –R /home/cs352/spring16/Assignments/assg02/executables/* .
• copies all the executables for assignment 2 to the current directory.
13
• The bash man page uses the term "pathname expansion" for what I've called wildcard expansion.
• Another term that's used is "globbing". Try searching for "glob" on the bash man page.
• Wildcards don't match hidden files unless the pattern starts with a dot, like .*rc .
• There are other wildcard specifiers but ?
, * , and
[ ...
] are the most commonly used.
14
• What happens when we run the command: grep *r*s*t* or ls | grep *r*s*t*
15
• What happens when we run the command: grep *r*s*t* or ls | grep *r*s*t*
• The key is that the filename expansion is being done by the shell. The command grep never sees the string
“*r*s*t*”
16
• Even if we do the command: ls | grep “*r*s*t*” we do not get result we want (for the problem)
17
• Even if we do the command: ls | grep “*r*s*t*” we do not get result we want (for the problem)
• grep uses regular expressions and the ‘*’ has a different meaning
– “r*” means zero or more occurrences of r
– so “ar*e” would match (“ae” or “arrre” or “are” etc.)
– what would ls | grep “r*” return?
18
• Your PATH variable specifies the directories that are to be searched when you run a command.
• % echo $PATH
• /usr/local/sbin:/usr/local/bin:/usr/sbin:/u sr/bin:/sbin:/bin:/usr/games:/usr/local/rvm
/bin:/home/stdntwm/bin
• % echo $PATH | tr : " " | wc -w
• 9
• If I type " xyz " at the prompt, bash will search each of those nine directories in turn for an executable file named xyz . If it finds an xyz , it will run it, and look no further.
19
• At hand: (the command search path for my student account)
• % echo $PATH
• ...various system "bins"...
:/home/stdntwm/bin
• A common convention is to put your own commands in ~/bin .
• Some programmers have more than one "bin".
• 3bin ccbin ebin mbin qqbin winbin
•
• bin cwbin jbin qbin sbin
(732 commands in those)
• Speculate: Does running “ speedTest/anagrams " involve the search path?
• No. If there's a / in the command, it simply runs that file.
• Another example: ./x
20
•
• What does this command do?
• PATH=$PATH:~/bin
Append ":~/bin" to whatever PATH already is.
• Java analog:
• PATH = PATH + ":~/bin";
• When bash starts up, PATH gets set to a system-specific value.
• The net effect of PATH=$PATH:~/bin is "If you don't find a command in the standard directories on this system, look in my bin."
21
• Some programmers have "dot" in their search path ( PATH= ...
:.
) so that a script x in the current directory can be run with " x " instead of " ./x ".
• "Dot in the path" can be convenient but imagine...
• Instead of typing ls you accidentally typed sl .
• You happened to be in a "world-writable" directory like /tmp .
• A malicious student has put this in /tmp/sl :
• chmod o+rwx ~
• ...or maybe this:
• rm -rf ~/ & # " & " runs a command "in the background"
• In the first case, they've gained access to your home directory!
• In the second case, deletion of all your CS account files is in progress!
• But the above is a combination of a bad guy, a bad neighborhood and a boo-boo!
• Is it stupid to have dot in your path?
22
• Like with any risk, you need to weigh risk vs. convenience.
• Not having to type ./x is convenient.
• In actuality, we all have the dot in our path by default on lectura.
• I always have dot in my path, but Unix gurus often recommend:
• Don't put dot in your path on lectura! Be cautious even on your own machine.
• BIG PITFALL: An empty entry is considered to be "dot"! How many are below?
• PATH=:/usr/local/bin::/usr/bin:~/bin:
23
24
gcc –Wall generates warnings on questionable constructs
• if no return type is specified for a function, it defaults to int
• need to supply prototype for “printf”
25
What does this really do?
26
What happens when we try to compile this simple program?
27
• When we try to compile the program this happens:
This looks a lot like the warning we got when we didn’t have the
#include <stdio.h>
28
When the compiler sees this, it wants to know what addInt is.
29
Defined before it is used.
30
prototype added
31
• Some library code is not linked in by default
– Examples: sqrt, ceil, sin, cos, tan, log, … [math library]
– requires specifying to the compiler/linker that the math library needs to be linked in
• you do this by adding “
lm” at the end of the compiler invocation: gcc
Wall foo.c
lm linker command to add math library
• Libraries that need to be linked in explicitly like this are indicated in the man pages
32
• I’ve said in C there are no procedures just functions.
• Every function returns a value, but what if I don’t need/want a value returned?
• For example, suppose I have a function that just prints “hi”.
• I can declare that function as type “void”
33
34
Function returns no value
35
Function also has no parameters.
36
Optional way to indicate that the function also has no parameters.
37
• The assignments ask you to print error messages to standard error.
• To do this you use fprintf
• fprintf works like printf except that printf always prints to stdout and you tell fprintf where to print:
• To print an error: fprintf(stderr,"I'm an error\n");
38
• Note printf("Hi!\n");
• and fprintf(stdout,"Hi\n");
• Do exactly the same thing.
39
• Remember that in the assignments, when your program exits, if it has seen an error it should not return 0.
• The catch is sometimes your program will continue to run after getting a bad input (say a negative value in assignment 2). It must remember it has seen the error and return the correct value.
40
• A character is of type char (signed or unsigned)
– C99 provides support for “wide characters”
• strings :
– an array of characters
– terminated by a 0 character (“NUL” : written ‘\0’)
– Not a predefined type in C; string operations are provided through libraries
C arrays don’t do bound-checking
– careless programming can give rise to memory-corruption errors
41
declares an array of chars the input analog to printf:
“read a value into str”
(%s = “string”) print out a string (%s)
42
waits for input (from stdin) typed in on keyboard: stdin program output (stdout) end-of-file indicated by typing Ctrl-D
43
this means the program tried to access an illegal memory address
Oops!
44