200 likes | 315 Views
Software Tools. The UNIX Shell. Basic Shell Syntax. command [-[options]] [arg] [arg] … The name of the command is first Options are normally single letters that turn an option on or off. They can be combined or given separately. $ ls -dil $ ls -l -d -i
E N D
Software Tools The UNIX Shell
Basic Shell Syntax command [-[options]] [arg] [arg] … • The name of the command is first • Options are normally single letters that turn an option on or off. They can be combined or given separately. $ ls -dil $ ls -l -d -i • Options sometimes also take a value. The value can usually be either given right after the option or separately: $ ypcat -d ug.cs.ust.hk passwd
Command Options • Most commands require you to give all options before filename arguments. The following command works in Linux, but not SunOS: $ cat names -n George W. Bush Bill Gates Bill Gates Bill Clinton George W. Bush cat: cannot open –n • Spaces separate options. To turn something with spaces into a single argument, use quotes: $ grep vote thing letter1 grep: can’t open thing letter1:You have the Florida vote thing $ grep ”vote thing” letter1 You have the Florida vote thing
Command Options • Double quotes and single quotes are a bit different. For now, you can use them interchangeably. $ grep ‘vote thing’ letter1 You have the Florida vote thing • To escape a single character (prevent it from being treated specially) proceed it with a backslash: $ grep ”We\’ll” letter2 by my office. We'll tidy up a few more things before $ echo ”*” * $ echo ‘*’ * $ echo \* * $ echo * letter1 letter2 names secret/
How Does the Shell Find a Command? • The shell searches a list of directories for an executable file with the same name. • The list of directories is stored in the PATH variable for Bourne shells and in the path array for csh/tcsh $ PATH=/usr/local/bin:$PATH sh % set path=(/usr/local/bin $path) csh, tcsh • If there is a match in more than one directory, the shell uses the first one it finds. • If you want to run a command that is not in one of these directories, you can give a pathname (relative or absolute) instead. ~horner/bin/csound
How Does the Shell Find a Command? • A few commands are built into the shell. This varies from shell to shell. The echo command, for example, is often builtin, for efficiency. • You can find out where the shell is getting a particular command using the “which” command in any shell: $ which echo echo: shell built-in command. $ which cat /bin/cat $ which grep /bin/grep $ which ls ls: aliased to ls --color=tty Makes directories blue, executables green, and soft links aqua
Alias • The C Shell has the alias command, which allows you to create command shortcuts. $ alias ls "ls -F" $ alias rm "rm -i" $ alias + "chmod u+x *" $ alias - "chmod u-x *" $ alias 111 "cd ~horner/111" $ pwd /bin $ 111 $ pwd /homes/horner/111 • On most Unix machines (except Mandriva/Mandrake in CSLab2), if you put the alias commands in your .cshrc file, you can use them every time you login.
Standard Input • Every time you login, or run a shell, you are “connected” to the computer on a particular terminal. $ who horner pts/3 Feb 14 10:23 (csnt1.cs.ust.hk) horner pts/0 Feb 14 11:57 (csz096.cs.ust.hk) • These devices (pts/0) are actually files in the directory /dev. So, if you are logged in on pts/0, this works just fine: $ date > /dev/pts/0 Mon Feb 14 17:08:21 HKT 2005
Standard Input • In fact, you can redirect stdout to a different device (e.g., pts/3), if you have permission. (The write command works this way.) • You can find out which terminal a particular shell is connected to using the tty command: $ tty /dev/pts/0 $ echo "Hi Andrew!" > /dev/pts/3 $
Tee • A special command called tee acts like a T-joint in plumbing: $ who horner pts/3 Feb 14 10:23 (csnt1.cs.ust.hk) horner pts/0 Feb 14 11:57 (csz096.cs.ust.hk) $ who | sort | tee sortedwho | wc -l 2 $ cat sortedwho horner pts/0 Feb 14 11:57 (csz096.cs.ust.hk) horner pts/3 Feb 14 10:23 (csnt1.cs.ust.hk) $ In this example, the output of sort is placed in a file “sortedwho“ and piped to wc -l, which counts the number of lines.
Background Jobs • A simple command or pipeline can be put into the background by following it with the “&” character: $ sort names > names.sort & [1] 3236 $ • The shell will print the process ID (PID), and a job number (1, in this case). • In some shells, you will be notified when the job is done (you may have to hit return again): $ sort names > names.sort & [1] 3236 $ [1] Done sort names > names.sort $
Background Jobs • Put a job in the background by typing “CTRL-Z” $ ypcat passwd | sort >passwd.sort ^Z Suspended $ • The job is suspended - not running - until you either place it in the background using bg: $ bg [1] ypcat passwd | sort > passwd.sort & $ or back to the foreground usingfg: $ fg ypcat passwd | sort >passwd.sort $
Jobs • The jobs command tells you what jobs are running: $ ypcat passwd | sort > passwd.sort ^Z Suspended $ jobs [1] + Suspended ypcat passwd | sort > passwd.sort $ • You can stop a job with the kill command: $ ypcat passwd | sort > passwd.sort & [1] 3414 3415 $ kill %1 $ [1] Terminated ypcat passwd | Exit 2 sort > passwd.sort $ The “%1” means “job #1”. You can also use the PID.
Jobs • The ps command is the main way to find out about jobs: $ ps PID TTY TIME CMD 1401 pts/0 0:01 csh $ $ ypcat passwd | sort > passwd.sort & [1] 3476 3477 $ ps PID TTY TIME CMD 3477 pts/0 0:00 sort 1401 pts/0 0:01 csh 3476 pts/0 0:01 ypcat $
Jobs • Note that if you put something into the background, you better redirect stdout, or the output will appear on your screen anyway! $ ypcat passwd & ma_wmkaa:uq2jXK0sFQ8Jg:36747:5000:Woo Man Kei,,=EXP.2001.05.30=nc99S:/homes/ma_h ma_chyaa:CS9wq.1zOxnhI:35435:5000:Chu How Yin Agnes,,=EXP.2001.05.30=nc98F:/homs ee_tkcaa:9LtI7Tipk2Ca6:35651:5000:Tsang Kong Chau,,=EXP.2001.05.30=nc99S:/homesh eg_cck:yi7XtKxxP5KaQ:43555:10010:Cheung Chi Keung,,ce98_yr1:/homes/eg_cck:/bin/h cs_wks:dtjvwifI2G7v2:24514:10001:Wong Kin Shing,,cs98_yr1:/homes/cs_wks:/bin/tch cs_lwk:OWiGoJRXSjn.s:24032:10001:Leung Wai Kei Ricky,,cs98_yr2:/homes/cs_lwk:/bh ph_chyac:CSJUo9e2KGqKg:35955:5000:Chan Hoi Yan,,=EXP.2001.05.30=nc98F:/homes/phs ee_wkkab:dfbi3GqWjvf5U:35644:5000:Wong Ka Keung,,=EXP.2001.05.30=nc99S:/homes/eh ph_lcy:CSwGgr5IeIvqc:36689:5000:Lam Chi Yin,,=EXP.2001.05.30=nc99S:/homes/ph_lcx ^C $ ypcat passwd >file & $
More Pattern Matching • The notation “[abcd]” matches any single one of the enclosed characters. $ ls [il]* it it1 ith its@ letter1 letter4 $ • The notation “[a-z]” matches any lowercase letter. • The notation “[0-9]” matches any digit character. • The notation “[0-59]” matches any the digit characters 0, 1, 2, 3, 4, 5, and 9. $ ls letter* letter1 letter4 $ ls letter[0-35] letter1 $ ls letter[0-24] letter1 letter4
More Pattern Matching • Most shells allow you to give a list of strings in curly brackets, comma separated: $ ls *{1,.sort} NAMES1 it1 names.sort s1@ f1 letter1 passwd.sort secret1: secret1: Permission denied $
Switching Shells • You can switch shells by just typing its name: csl2wk01.cs.ust.hk> ps PID TTY TIME CMD 3496 pts/0 0:01 csh csl2wk01.cs.ust.hk> tcsh csl2wk01.cs.ust.hk> ps PID TTY TIME CMD 3650 pts/0 0:00 tcsh 3496 pts/0 0:01 csh csl2wk01.cs.ust.hk> sh $ ps PID TTY TIME CMD 3650 pts/0 0:00 tcsh 3496 pts/0 0:01 csh 3659 pts/0 0:00 sh $ ^D csl2wk01.cs.ust.hk> ps PID TTY TIME CMD 3650 pts/0 0:00 tcsh 3496 pts/0 0:01 csh
Combining Commands • Multiple pipelines can be input on one command line by separating them with semicolons. • When entering a long command, use a backslash (\) to continue the command on the next line. $ date; sort names; \ who Mon Feb 14 19:40:28 HKT 2005 Bill Clinton Bill Gates Bill Gates George W. Bush George W. Bush horner pts/3 Feb 14 10:23 (csnt1.cs.ust.hk) horner pts/0 Feb 14 19:11 (csz096.cs.ust.hk)
Combining Commands • Commands can be grouped together using parentheses • There are two main reasons to group commands: • To create a “single command” out of a group of commands (especially useful before a pipe): $ (cat letter1; head -2 names) | sort >list • To run a set of commands in their own subshell (especially when trying to limit the effect of a cd command): $ (cd secret; ls | wc -l); ls | wc -l 3 25 This line has the effect of counting the files in secret, and then counting the files in the current directory.