lecture6

advertisement

Announcements

• New Due Date for Assignments

– Assignments will be due on Fridays now

1

Why didn’t * work with grep as expected?

• 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

• 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

Wildcards, continued

• 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

Wildcards, continued

• 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

The * wildcard

• 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

The * wildcard

• 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

Experiment!

• /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

Experiment!

• /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

Combining wildcards

• Wildcards can be combined. Examples:

??* Matches names that are two or more characters long

• *.?

Matches names whose next to last character is a dot

Combining wildcards

• 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

• 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

Wildcards and paths

• 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

Lots more with wildcards

• 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

Back to the Question

• What happens when we run the command: grep *r*s*t* or ls | grep *r*s*t*

15

Back to the Question

• 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

Regular Expressions vs Globbing

• Even if we do the command: ls | grep “*r*s*t*” we do not get result we want (for the problem)

17

Regular Expressions vs Globbing

• 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

The search path for commands ( PATH )

• 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

PATH , continued

• 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

Setting the path in ~/.bashrc.

• 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

Dot danger!

• 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

Dot danger, continued

• 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

prototypes – recall:

24

warnings when compiled

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

Fixing the compiler warnings

What does this really do?

26

prototypes

What happens when we try to compile this simple program?

27

prototypes (cont)

• 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

prototypes

When the compiler sees this, it wants to know what addInt is.

29

Fix One

Defined before it is used.

30

Fix Two

prototype added

31

Functions from special libraries

• 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

void

• 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

void

34

void

Function returns no value

35

void

Function also has no parameters.

36

void

Optional way to indicate that the function also has no parameters.

37

printing to stderr

• 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

printing to stderr

• Note printf("Hi!\n");

• and fprintf(stdout,"Hi\n");

• Do exactly the same thing.

39

Returning from an error

• 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

Characters and strings

• 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

Example of string manipulation

declares an array of chars the input analog to printf:

“read a value into str

(%s = “string”) print out a string (%s)

42

More strings…

waits for input (from stdin) typed in on keyboard: stdin program output (stdout) end-of-file indicated by typing Ctrl-D

43

More strings…

this means the program tried to access an illegal memory address

Oops!

44

Download