announcements new due date for assignments – assignments will be due on fridays now 1

44
Announcements New Due Date for Assignments Assignments will be due on Fridays now 1

Upload: jason-shepherd

Post on 20-Jan-2018

216 views

Category:

Documents


0 download

DESCRIPTION

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

TRANSCRIPT

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

• echo is also good for exploring wildcards, and uses less vertical space on slides:• % ls• a out x xy z

• % echo ?• a x z

• % echo ??? ??• out xy

• Predict the output:• % echo ? ? ?• a x z a x z a x z

• % echo x? ?y• xy xy

• % echo ? ?? x ??? ????• a x z xy x out ????

4

Wildcards, continued

If there's no match, like with ????, theargument is passed through as-is.

A general rule: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.

Important:Wildcards are not regular expressions.

The two facilities share a bit of common behavior but they are far more different than they are alike!

• 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

Wildcards, continued

• 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

The * wildcard

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

Experiment!

• 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

Combining wildcards

• 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

The character set wildcard

• 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

Wildcards and paths

• 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

Lots more with wildcards

Back to the Question

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

15

Back to the Question

• What happens when we run the command:grep *r*s*t*orls | 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

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

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

The search path for commands (PATH)

• 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

PATH, continued

• 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

Setting the path in ~/.bashrc.

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

• 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

Dot danger, continued

prototypes – recall:

24

warnings when compiled

25

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”

Fixing the compiler warnings

26

What does this really do?

prototypes

27

What happens when we try to compile this simple program?

prototypes (cont)

• When we try to compile the program this happens:

28

This looks a lot like the warning we got when we didn’t have the #include <stdio.h>

prototypes

29

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

Fix One

30

Defined before it is used.

Fix Two

31

prototype added

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

• Libraries that need to be linked in explicitly like this are indicated in the man pages

32

linker command to add math library

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

35

Function returns no value

void

36

Function also has no parameters.

void

37

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

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

• Noteprintf("Hi!\n");

• andfprintf(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

42

declares an array of chars

the input analog to printf: “read a value into str”(%s = “string”)

print out a string (%s)

More strings…

43

waits for input (from stdin)

typed in on keyboard: stdin

program output (stdout)

end-of-file indicated by typing Ctrl-D

More strings…

44

Oops!

this means the program tried to access an illegal memory address