You are on page 1of 15

bash shell

bash shell l mt trong nhiu shell c sn cho Linux. N cn c gi l shell da theo Bourne ( Bourne-again shell), sau khi Stephen Bourne, ngi sng to ra mt shell trc ( /bin/sh). V c bn bash tng thch vi sh, nhng n cung cp nhiu ci tin v c chc nng ln kh nng lp trnh. N kt hp cc tnh nng t Korn shell (ksh) v C shell (csh) v c d kin l mt shell tun th theo POSIX. Trc khi chng ta xoy su hn vo bash, hy nh li rng mt shell l mt chng trnh chp nhn v thi hnh cc lnh. N cng h tr cc cu trc lp trnh, cho php xy dng cc lnh phc tp t cc phn nh hn. Cc lnh phc tp ny, cn gi l cc kch bn lnh (scripts), c th c lu nh cc tp tin tr thnh cc lnh mi, vi t cch ring. Tht vy, nhiu lnh trn mt h thng Linux in hnh thc s l cc kch bn lnh. Cc shell c mt s lnh dng sn, chng hn nh cd, break, v exec. Cc lnh khc l lnh ngoi. Cc shell cng s dng ba lung (streams) Vo/Ra (I/O) tiu chun: stdin l lung u vo tiu chun, cung cp u vo cho cc lnh. stdout l lung u ra tiu chun, hin th u ra t cc lnh. stderr l lung li tiu chun, hin th u ra li t cc lnh. Cc lung u vo cung cp u vo cho cc chng trnh, thng l t g bn phm u cui. Cc lung u ra in cc k t vn bn, thng l ti mt u cui. Thit b u cui ban u l mt my nh ch ASCII hoc mn hnh hin th, nhng by gi n thng l mt ca s trn mn hnh nn ha. Chi tit hn na v cch chuyn hng cc lung I/O tiu chun ny s c trnh by trong mt bi vit khc trong lot bi ny. i vi phn cn li ca bi vit ny, chng ti s gi nh bn bit cch c c mt du nhc shell. Nu bn cha bit, bi vit "Cc nhim v c bn cho cc nh pht trin Linux mi" (Basic tasks for new Linux developers) ca developerWorks s cho bn bit cch thc hin c iu ny v hn th na. Nu bn ang s dng mt h thng Linux m khng dng mn hnh nn ha hoc nu bn m mt ca s u cui trn mn hnh nn ha, bn s c cho n bng mt du nhc, c l ging nh mt du nhc c hin th trong Lit k 1.

Lit k 1. Mt s cc du nhc ca ngi s dng in hnh


[db2inst1@echidna db2inst1]$ ian@lyrebird:~> $

Nu bn ng nhp nh l ngi dng root (hoc siu ngi dng - superuser), du nhc ca bn c th trng ging nh c hin th trong Lit k 2.

Lit k 2. Cc v d v du nhc ca ngi dng root hoc superuser


[root@echidna ~]# lyrebird:~ # #

Ngi dng root c quyn lc ln, v vy hy s dng n cn thn. Khi bn c cc c quyn root, th hu ht cc du nhc c mt du (#) ui. Cc c quyn ca ngi dng bnh thng lun c nh du bng mt k t khc, thng l mt du hiu ng la ($). Thc t du nhc ca bn c th trng khc so vi cc v d trong bi vit ny. Du nhc ca bn c th bao gm tn ngi dng, tn my ca bn, th mc hin ti, ngy thng hoc thi gian m du nhc c in ra v v.v. Cc bi vit ny bao gm cc v d m ngun c ct v dn t cc h thng Linux thc, s dng cc du nhc mc nh cho cc h thng . Cc du nhc root ca chng ta c mt du # ui, do bn c th phn bit chng vi cc du nhc ca ngi dng bnh thng, c du $ ui. Quy c ny ph hp vi nhiu sch vit v ti ny. Nu c mt ci g khng chy trong cc v d, hy kim tra du nhc. V u trang

Cc lnh v cc dy lnh
Vy l by gi bn c mt du nhc, chng ta hy xem bn c th lm g vi n. Chc nng chnh ca shell l thng dch cc lnh ca bn sao cho bn c th tng tc vi h thng Linux ca mnh. Trn cc h thng Linux (v UNIX ), cc lnh c mt tn lnh v sau l cc ty chn v cc tham s. Mt s lnh c ci ny nhng khng c ci kia.

Nu mt dng cha mt k t #, th tt c cc k t cn li trn dng c b qua. V vy, mt k t # c th ch bo mt li bnh lun cng nh mt du nhc root. N l ci g s r rng t ng cnh.

Lnh echo
Lnh echo in li (hay di tr li) cc i s ca n ti thit b u cui nh trong Lit k 3.

Lit k 3. Cc v d v lnh echo


[ian@echidna Word [ian@echidna A phrase [ian@echidna Where are my [ian@echidna Here are ~]$ echo Word ~]$ echo A phrase ~]$ echo Where spaces? ~]$ echo "Here my spaces. are are my my spaces? spaces." # plus comment

Trong v d th ba ca Lit k 3, tt c cc khong trng tha c nn thnh mt khong trng duy nht u ra. trnh iu ny, bn cn phi t cc chui k t trong cp du nhy kp (") hoc du nhy n ('). Bash s dng khong trng, v d nh k t trng, du tab v k t xung dng mi, tch dng u vo ca bn thnh cc th (token), ri chuyn ti lnh ca bn. Vic t cc chui k t trong cp du nhy s bo tn khong trng d tha v lm cho ton b chui k t thnh mt th duy nht. Trong v d trn, mi th sau tn lnh l mt tham s, do chng ta ln lt c cc tham s 1, 2, 4 v 1. Lnh echo c mt vi ty chn. Thng thng lnh echo s ni thm mt k t xung dng mi vo ui ca kt qu u ra. S dng ty chn -n loi b iu ny. S dng ty chn -e cho php mt s k t nht nh c p m thot l du gch cho ngc c ngha ring c bit. Mt s trong cc k t ny c hin th trong Bng 1.

Bng 1. Cc k t c m thot v lnh echo


Dy lnh thot \a \b \c \f \n \r \t Chc nng Cnh bo (chung) Li mt v tr Loi b k t xung dng mi ui (cng chc nng nh ty chn -n) In ra v bt u mt trang mi (xa mn hnh trn mn hin th video) Dng mi Xung dng Du tab ngang

M thot v tip tc dng


C mt vn nh ny sinh ra khi s dng cc du gch cho ngc trong bash. Khi k t du gch cho ngc ( \) khng t trong du nhy, n c tc dng nh mt lnh thot bo hiu cho chnh bash gi nguyn ngha nguyn vn ca k t tip theo. iu ny l cn thit cho cc siu k t (metacharacter) ca shell c bit m chng ta s trnh by ngay sau y. C mt trng hp ngoi l vi quy tc ny: mt du gch cho ngc tip theo l mt du dng mi lm cho bash nut c hai k t v x l dy nh mt yu cu tip tc dng. iu ny rt tin li ngt cc dng di, c bit l trong cc kch bn lnh ca shell. cho cc dy m t trn c x l ng bi lnh echo hay cc lnh khc c s dng cc k t iu khin vi m thot tng t, bn phi a dy m thot vo trong cp du nhy hoc l mt phn ca mt chui k t c t trong cp du nhy, tr khi bn s dng mt du gch cho ngc th hai buc shell gi nguyn n dnh cho lnh x l. Lit k 4 cho thy mt s v d v cch s dng khc nhau ca du \.

Lit k 4. Thm cc v d v echo


[ian@echidna ~]$ echo -n No new line No new line [ian@echidna ~]$ echo -e "No new line\c" No new line [ian@echidna ~]$ echo "A line with a typed > return" A line with a typed return [ian@echidna ~]$ echo -e "A line with an escaped\nreturn" A line with an escaped return [ian@echidna ~]$ echo "A line with an escaped\nreturn but no -e option" A line with an escaped\nreturn but no -e option [ian@echidna ~]$ echo -e Doubly escaped\\n\\tmetacharacters Doubly escaped metacharacters [ian@echidna ~]$ echo Backslash \ > followed by newline \ > serves as line continuation. Backslash followed by newline serves as line continuation.

Lu rng bash hin th mt du nhc c bit (>) khi bn g mt dng vi cc du nhy khng ph hp. Chui u vo ca bn tip tc trn dng th hai v c cha mt k t dng mi.

Cc siu k t ca bash shell v cc ton t iu khin


Bash c mt vi siu k t, khi khng c t trong du nhy, cng c dng chia u vo thnh cc t. B n cnh mt khong trng, chng l: | & ; ( ) < > Chng ta s tho lun chi tit hn mt s trong cc siu k t ny trong cc phn khc ca bi vit ny. By gi, lu rng nu bn mun c mt siu k t nh l mt phn ca vn bn ca bn, th n hoc phi c t trong du nhy hoc p m thot bng cch dng mt du gch cho ngc ( \) nh trong Lit k 4. Cc dng mi v cc siu k t nht nh no hoc cc cp siu k t cng c dng nh l cc ton t iu khin. l: || && & ; ;; | ( ) Mt s trong cc ton t iu khin ny cho php bn to cc dy hoc cc danh sch ca cc lnh. Dy lnh n gin nht ch l hai lnh c phn cch nhau bng du chm phy (;). Mi lnh c thc thi theo th t. Trong bt k mi trng lp trnh no, cc lnh tr v mt biu th thnh cng hay tht bi; cc lnh Linux thng tr v mt gi tr bng khng khi thnh cng v mt gi tr khc khng cho trng hp tht bi. Bn c th a vo thm mt s x l c iu kin trong danh sch ca bn bng cch s dng cc ton t iu khin && v ||. Nu bn tch hai lnh bng ton t iu khin && th lnh th hai c thc hin khi v ch khi lnh th nht tr v m kt thc (exit) bng khng. Nu bn tch cc lnh bng ||, th lnh th hai c thc hin ch khi lnh th nht tr v mt m kt thc khc khng. Lit k 5 cho thy mt s dy lnh khi s dng lnh echo. Cc dy ny cha thc s th v do lnh echo tr v 0, nhng bn s thy nhiu v d sau ny, khi chng ta c thm vi lnh s dng.

Lit k 5. Cc dy lnh

[ian@echidna ~]$ echo line 1;echo line 2; echo line 3 line 1 line 2 line 3 [ian@echidna~]$ echo line 1&&echo line 2&&echo line 3 line 1 line 2 line 3 [ian@echidna ~]$ echo line 1||echo line 2; echo line 3 line 1 line 3

Lnh Exit
Bn c th kt thc mt shell bng cch s dng lnh exit (thot ra). Bn c th ty a ra mt m exit nh l mt tham s. Nu bn ang chy shell ca mnh trong mt ca s u cui trn mt mn hnh nn ha, ca s ca bn s ng. Tng t nh vy, nu bn kt ni ti mt h thng t xa bng cch s dng ssh hoc telnet (v d th), kt ni ca bn s chm dt. Trong bash shell, bn cng c th gi phm Ctrl v nhn phm d thot ra. Hy xem mt ton t iu khin khc. Nu bn bao bc mt lnh hoc mt danh sch lnh trong cc du ngoc n, th lnh hay trnh t c thc thi trong mt shell con, nh vy lnh exit thot ra khi shell con ch khng phi thot khi shell bn ang lm vic vi n. Lit k 6 cho thy mt v d n gin lin quan n && v || v hai m exit khc nhau.

Lit k 6. Cc shell con v dy lnh


[ian@echidna ~]$ (echo In subshell; exit 0) && echo OK || echo Bad exit In subshell OK [ian@echidna ~]$ (echo In subshell; exit 4) && echo OK || echo Bad exit In subshell Bad exit

Hy theo st bit nhiu dy lnh hn na phn sau trong bi vit ny. V u trang

Cc bin mi trng
Khi bn ang chy trong mt bash shell, c nhiu th to nn mi trng ca bn, chng hn nh hnh dng ca du nhc ca bn, th mc nh ca bn, th mc lm vic ca bn, tn ca shell ca bn, cc tp tin bn m, cc chc nng m bn xc nh v v.v. Mi trng ca bn bao gm nhiu bin. Cc bin ny c th do bash hay do bn thit lp. Bash shell cng cho php bn c cc bin shell v bn c th xut khu cc bin sang mi trng ca bn cho cc tin trnh khc ang chy trong shell s dng hoc cho cc shell khc do bn c th to ra t shell hin hnh s dng. C cc bin mi trng ln cc bin shell c mt tn (name). Bn tham kho gi tr ca mt bin bng cch thm du '$' vo trc tn ca n. Mt s bin mi trng bash chung m bn s bt gp c ch ra trong Bng 2.

Bng 2. Mt s bin mi trng bash chung


Tn USER UID HOME PWD Chc nng Tn ca ngi dng ng nhp. S nhn dng ngi dng ca ngi dng ng nhp. Th mc nh ca ngi dng. Th mc lm vic hin ti.

SHELL $ PPID ?

Tn ca shell. S nhn dng tin trnh (hay PID) ca tin trnh bash shell (hoc tin trnh khc) ang chy. S nhn dng tin trnh ca tin trnh bt u tin trnh ny (tc l, s nhn dng ca tin trnh cha m). M exit ca lnh cui cng.

Lit k 7 hin th bn c th thy nhng g trong mt s cc bin bash chung ny.

Lit k 7. Mi trng v cc bin shell


[ian@echidna ~]$ echo $USER $UID ian 500 [ian@echidna ~]$ echo $SHELL $HOME $PWD /bin/bash /home/ian /home/ian [ian@echidna ~]$ (exit 0);echo $?;(exit 4);echo $? 0 4 [ian@echidna ~]$ echo $$ $PPID 2559 2558

Khng s dng bash?


Bash shell l shell mc nh trong hu ht cc bn phn phi Linux. Nu bn khng chy trong bash shell, bn c th mun xem xt mt trong nhng cch sau y thc hnh vi bash shell. S dng

chsh -s /bin/bash

S dng su - $USER -s /bin/bash

lnh thay i shell mc nh ca bn. Shell mc nh ny s c hiu lc trong ln ti khi bn ng nhp.

lnh to ra mt tin trnh khc nh mt shell con trong shell hin ti ca bn. Tin trnh mi s l mt shell ng nhp, s dng bash. To mt m nhn dng (id) vi mc nh l ca mt bash shell s dng cho vic chun b k thi LPI.

Bn c th to hoc thit lp mt bin shell bng cch g tn, ngay sau l mt du bng (=). Nu bin tn ti, bn s sa i n gn gi tr mi. Cc bin c phn bit dng ch hoa ch thng, do var1 v VAR1 l cc bin khc nhau. Theo quy c, cc bin, c bit l cc bin xut khu, l bin ch hoa, nhng y khng phi l mt yu cu bt buc. V mt k thut, $$ v $? l cc tham s shell hn l cc bin. Chng ch c th c tham chiu; bn khng th gn mt gi tr cho chng. Khi bn to mt bin shell, bn thng s mun export n n mi trng cho n s c sn cho cc tin trnh khc m bn khi u cc tin trnh y t shell ny. Cc bin m bn xut khu khng c sn i vi mt shell cha m. Bn s dng lnh export xut khu mt tn bin. Nh mt phm tt trong bash, bn c th gn mt gi tr v xut khu mt bin trong mt bc. minh ha vic gn v xut khu, chng ta hy chy lnh bash shell khi trong bash shell v sau chy Korn shell (ksh) t bash shell mi. Chng ta s s dng lnh ps hin th thng tin v lnh ang chy. Chng ta s tm hiu thm v ps trong mt bi vit khc trong lot bi ny. (Xem Ti nguyn v l trnh ca lot bi ny).

Lit k 8. Thm cc bin mi trng v cc bin shell


[ian@echidna ~]$ PID PPID CMD 2559 2558 -bash [ian@echidna ~]$ [ian@echidna ~]$ PID PPID CMD 2811 2559 bash [ian@echidna ~]$ [ian@echidna ~]$ [ian@echidna ~]$ [ian@echidna ~]$ [ian@echidna ~]$ var1 var2 var3 [ian@echidna ~]$ ps -p $$ -o "pid ppid cmd" bash ps -p $$ -o "pid ppid cmd" VAR1=var1 VAR2=var2 export VAR2 export VAR3=var3 echo $VAR1 $VAR2 $VAR3 echo $VAR1 $VAR2 $VAR3 $SHELL

var1 var2 var3 /bin/bash [ian@echidna ~]$ ksh $ ps -p $$ -o "pid ppid cmd" PID PPID CMD 2840 2811 ksh $ export VAR4=var4 $ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL var2 var3 var4 /bin/bash $ exit [ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL var1 var2 var3 /bin/bash [ian@echidna ~]$ ps -p $$ -o "pid ppid cmd" PID PPID CMD 2811 2559 bash [ian@echidna ~]$ exit exit [ian@echidna ~]$ ps -p $$ -o "pid ppid cmd" PID PPID CMD 2559 2558 -bash [ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL /bin/bash

Lu : 1. Lc bt u dy lnh ny, bash shell c PID 2559. 2. Bash shell th hai c PID 2811 v shell cha m ca n l PID 2559, l bash shell ban u. 3. Chng ta to ra cc bin VAR1, VAR2 v VAR3 trong bash shell th hai, nhng ch xut khu bin VAR2 v VAR3. 4. Trong Korn shell, chng ta to ra bin VAR4. Lnh echo ch hin th cc gi tr cho cc bin VAR2, VAR3 v VAR4, iu ny xc nhn rng bin VAR1 khng c xut khu. Bn c ngc nhin khng khi thy rng gi tr ca bin SHELL khng thay i, mc d du nhc thay i? Bn khng th lun da vo SHELL cho bn bit bn ang chy trong shell no, nhng lnh ps s ni cho bn bit lnh hin ti. Lu rng ps t mt du ni (-) pha trc ca bash shell u tin bo hiu rng y l shell ng nhp. 5. Quay li bash shell th hai, chng ta c th nhn thy cc bin VAR1, VAR2 v VAR3. 6. V cui cng, khi chng ta quay tr li shell ban u, khng c bin no trong s cc bin mi ca chng ta cn tn ti. Cc cuc tho lun trc v vic t cc du nhy ni rng bn c th s dng hoc du nhy n hoc du nhy kp. C mt s khc bit quan trng gia chng. Shell ch khai trin cc bin shell nm gia cc du nhy kp ($quot;), n khng khai trin nu s dng du nhy n ('). Trong v d trc, chng ta bt u mt shell khc bn trong shell ca chng ta v chng ta nhn c mt m nhn dng tin trnh mi. Khi s dng ty chn -c, bn c th chuyn mt lnh ti shell khc n thc hin lnh v tr v. Nu bn chuyn mt chui k t t trong du nhy nh l mt lnh, shell bn ngoi ca bn s loi b cc du nhy v chuyn tip chui k t i. Nu du nhy kp c s dng, cc bin c khai trin trc khi chui k t c chuyn i, nn kt qu c th khng c nh bn mong i. Shell v lnh s chy trong tin trnh khc nn chng s c mt m nhn dng tin trnh (PID) khc. Lit k 9 minh ha cc khi nim ny. PID ca bash shell cp cao nht c t m.

Lit k 9. t du nhy v cc bin shell


[ian@echidna ~]$ echo "$SHELL" '$SHELL' "$$" '$$' /bin/bash $SHELL 2559 $$ [ian@echidna ~]$ bash -c "echo Expand in parent $$ $PPID" Expand in parent 2559 2558 [ian@echidna ~]$ bash -c 'echo Expand in child $$ $PPID' Expand in child 2845 2559

Cho n nay, mi tham kho bin ca chng ta kt thc bng khong trng, v th tn bin kt thc u l r rng. Thc vy, cc tn bin ch gm cc ch ci, ch s hoc k t gch di. Shell bit rng mt tn bin kt thc ni tm thy k t khc. i khi bn cn s dng cc bin trong cc biu thc m ngha c th mp m. Trong trng hp ny, bn c th s dng cc du ngoc mc ({}) phn nh tn bin nh trong Lit k 10.

Lit k 10. S dng du ngoc m vi cc tn bin

[ian@echidna ~]$ echo "-$HOME/abc-" -/home/ian/abc[ian@echidna ~]$ echo "-$HOME_abc-" -[ian@echidna ~]$ echo "-${HOME}_abc-" -/home/ian_abc-

Lnh Env
Lnh env khng c bt k tu chn hoc cc tham s no s hin th cc bin mi trng hin ti. Bn cng c th s dng n thc thi mt lnh trong mt mi trng ty chnh. Ty chn -i (hoc ch cn -) xa mi trng hin ti trc khi chy lnh, trong khi ty chn -u b cc thit lp bin mi trng m bn khng mun chuyn i. Lit k 11 cho thy mt phn kt qu u ra ca lnh env m khng c bt k tham s no v sau l ba v d v cch gi cc shell khc nhau khng c mi trng cha m. Hy xem xt cn thn nhng iu ny trc khi chng ta tho lun v chng. Lu : Nu h thng ca bn khng ci t cc shell ksh (Korn) hoc tcsh, th bn s cn phi ci t chng t mnh lm nhng bi tp ny.

Lit k 11. Lnh env


[ian@echidna ~]$ env HOSTNAME=echidna SELINUX_ROLE_REQUESTED= TERM=xterm SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=9.27.206.68 1316 22 SELINUX_USE_CURRENT_RANGE= QTDIR=/usr/lib/qt-3.3 QTINC=/usr/lib/qt-3.3/include SSH_TTY=/dev/pts/3 USER=ian ... _=/bin/env OLDPWD=/etc [ian@echidna ~]$ env -i bash -c 'echo $SHELL; env' /bin/bash PWD=/home/ian SHLVL=1 _=/bin/env [ian@echidna ~]$ env -i ksh -c 'echo $SHELL; env' /bin/sh _=/bin/env PWD=/home/ian _AST_FEATURES=UNIVERSE - ucb [ian@echidna ~]$ env -i tcsh -c 'echo $SHELL; env' SHELL: Undefined variable.

Nhn thy rng bash t bin SHELL, nhng khng xut khu n n mi trng, mc d c ba bin khc do bash to ra trong mi trng . Trong v d ksh, chng ta c hai bin mi trng, nhng n lc ca chng ta nhn li gi tr ca bin SHELL ch cho mt dng trng. Cui cng, tcsh khng to ra bt k bin mi trng no v a ra mt li khi ta c gng tham kho gi tr ca SHELL.

B thit lp v thit lp
Lit k 11 cho thy hnh vi khc nhau trong cch cc shell x l cc bin v cc mi trng. Trong khi bi vit ny tp trung vo bash, nn bit rng khng phi tt c shell hnh x theo cng mt cch ging nhau. Hn na, cc shell hnh x theo mt cch khc nhau ty theo chng c l mt shell ng nhp hay khng. By gi, chng ta s ch c th ni rng mt shell ng nhp l shell m bn nhn c khi bn ng nhp vo h thng; bn c th bt u cc shell khc vn hnh nh shell ng nhp nu bn mun. Ba shell bt u trn bng cch s dng env -i khng phi l cc shell ng nhp. Hy th thm ty chn -lvo chnh lnh shell thy nhng s khc nhau m bn s nhn c vi mt shell ng nhp. Vy th chng ta hy xem xt n lc ca chng ta hin th gi tr ca bin SHELL trong cc shell khng ng nhp:

Khi bash bt u, n thit lp bin SHELL, nhng n khng t ng xut khu bin ny ti mi trng. Khi ksh bt u, n khng thit lp bin SHELL. Tuy nhin, vic tham kho mt bin mi trng cha c nh ngha l tng ng vi vic tham kho mt bin c mt gi tr rng. 3. Khi tcsh bt u, n khng thit lp bin SHELL. Trong trng hp ny, hnh vi mc nh khc vi ksh (v bash) ch l c thng bo mt li khi chng ta c gng s dng mt bin khng tn ti. Bn c th s dng lnh unset b thit lp mt bin v loi n khi danh sch bin shell. Nu bin c xut khu n mi trng, lnh ny cng s loi b bin khi mi trng. Bn c th s dng lnh set kim sot nhiu kha cnh v cch lm vic ca bash (hoc cc shell khc). Lnh set l mt lnh shell dng sn, do cc ty chn khc nhau l c th ring ca shell. Trong bash, ty chn -u lm cho bash thng bo mt li vi cc bin cha c nh ngha ch khng x l chng nh l cc bin nh ngha nhng rng. Bn c th bt cc ty chn khc nhau ca lnh set bng mt du - v tt chng bng mt du +. Bn c th hin th ty chn set hin ti bng cch s dng lnh echo $-. 1. 2.

Lit k 12. B thit lp v thit lp


[ian@echidna ~]$ echo $himBH [ian@echidna ~]$ echo $VAR1 [ian@echidna himuBH [ian@echidna -bash: VAR1: [ian@echidna [ian@echidna v1 [ian@echidna -bash: VAR1: [ian@echidna himBH ~]$ set -u;echo $~]$ echo $VAR1 unbound variable ~]$ VAR1=v1 ~]$ VAR1=v1;echo $VAR1 ~]$ unset VAR1;echo $VAR1 unbound variable ~]$ set +u;echo $VAR1;echo $-

Nu bn s dng lnh set khng c bt c ty chn no, th lnh ny s hin th tt c cc bin shell ca bn v cc gi tr ca chng (nu c). Ngoi ra cn c lnh khc, declare (khai bo) m bn c th s dng lnh to, xut khu v hin th cc gi tr ca cc bin shell. Bn c th kho st t m nhiu ty chn set cn li v lnh declare bng cch s dng cc trang hng dn s dng (man pages). Chng ta s tho lun v cc trang hng dn s dng sau trong bi vit ny.

Lnh Exec
Mt lnh cui cng cn trnh by l exec. Bn c th s dng lnh exec chy mt chng trnh khc thay th shell hin hnh. Lit k 13 bt u mt bash shell con v sau s dng exec thay th n bng mt Korn shell. Khi thot khi Korn shell, bn quay tr li ti bash shell ban u (trong v d ny l PID 2852).

Lit k 13. S dng lnh exec


[ian@echidna 2852 [ian@echidna [ian@echidna 5114 [ian@echidna 5114 $ exit [ian@echidna 2852 ~]$ echo $$ ~]$ bash ~]$ echo $$ ~]$ exec ksh $ echo $$ ~]$ echo $$

V u trang

Thng tin h thng vi lnh uname


Lnh uname in thng tin v h thng ca bn v nhn (kernel) ca n. Lit k 14 hin th cc ty chn khc nhau cho lnh unamev thng tin kt qu; mi ty chn tng c nh ngha trong Bng 3.

Lit k 14. Lnh uname

[ian@echidna ~]$ uname Linux [ian@echidna ~]$ uname -s Linux [ian@echidna ~]$ uname -n echidna.raleigh.ibm.com [ian@echidna ~]$ uname -r 2.6.29.6-217.2.3.fc11.i686.PAE [ian@echidna ~]$ uname -v #1 SMP Wed Jul 29 16:05:22 EDT 2009 [ian@echidna ~]$ uname -m i686 [ian@echidna ~]$ uname -o GNU/Linux [ian@echidna ~]$ uname -a Linux echidna.raleigh.ibm.com 2.6.29.6-217.2.3.fc11.i686.PAE #1 SMP Wed Jul 29 16:05:22 EDT 2009 i686 i686 i386 GNU/Linux

Bng 3. Cc ty chn cho lnh uname


Ty chn -s M t

In tn ca nhn. y l ty chn mc nh nu khng c ty chn no khc c ch r. In tn nt (nodename) hoc tn my. In bn pht hnh ca nhn. Ty chn ny thng c s dng vi cc lnh x l m un. In phin bn ca nhn. In tn phn cng (CPU) ca my tnh. In tn h iu hnh. In tt c cc thng tin trn.

-n -r

-v -m -o -a

Lit k 14 l t mt h thng Fedora 11 ang chy trn mt CPU Intel. Lnh uname c sn trn hu ht cc h thng UNIX v h thng ging nh UNIX cng nh Linux. Thng tin c in ra s khc nhau ty theo phin bn v bn phn phi Linux cng nh theo loi my tnh bn ang chy. Lit k 15 cho thy kt qu u ra ca mt h thng AMD Athlon 64 ang chy trn Ubuntu 9.04.

Lit k 15. S dng lnh uname vi mt h thng khc


ian@attic4:~$ uname -a Linux attic4 2.6.28-14-generic #47-Ubuntu SMP Sat Jul 25 01:19:55 UTC 2009 x86_64 GNU/Linux

V u trang

Lc s lnh
Nu bn ang g vo cc lnh nh bn c, bn c th nhn thy rng bn thng s dng mt lnh nhiu ln hoc ging ht nhau hoc ch thay i nh. Mt tin tt l bash shell c th duy tr mt lc s ca cc lnh ca bn. Theo mc nh, lc s lun bt ln. Bn c th tt n i bng cch s dng lnh set +o history v bt ln li bng cch s dng lnh set -o history. Mt bin mi trng c gi l HISTSIZE ni cho bash bit c th lu gi

bao nhiu dng lc s. Mt s cc gi tr ci t khc iu khin cch lc s hot ng v c qun l nh th no. Xem cc trang hng dn s dng bash bit cc chi tit y . Mt s cc lnh gip bn c th s dng chc nng lc s l: history Hin th ton b lc s. history N Hin th N dng cui cng ca lc s ca bn. history -d N Xa dng N t lc s ca bn; bn c th lm iu ny nu dng c cha mt mt khu chng hn !! Lnh gn y nht ca bn. !N Lnh lc s th N. !-N Li li N lnh trong lc s (!-1 tng ng vi !!) !# Lnh hin ti bn ang g. !string Lnh gn y nht bt u vi chui k t (string). !?string? Lnh gn y nht c cha chui k t (string). Bn cng c th s dng mt du hai chm (:) tip theo l mt gi tr nht nh truy cp hoc sa i mt phn hoc mt lnh t lc s ca bn. Lit k 16 minh ha mt s tnh nng lc s.

Lit k 16. Thao tc lc s lnh


[ian@echidna ~]$ echo $$ 2852 [ian@echidna ~]$ env -i bash -c 'echo $$' 9649 [ian@echidna ~]$ !! env -i bash -c 'echo $$' 10073 [ian@echidna ~]$ !ec echo $$ 2852 [ian@echidna ~]$ !en:s/$$/$PPID/ env -i bash -c 'echo $PPID' 2852 [ian@echidna ~]$ history 6 595 echo $$ 596 env -i bash -c 'echo $$' 597 env -i bash -c 'echo $$' 598 echo $$ 599 env -i bash -c 'echo $PPID' 600 history 6 [ian@echidna ~]$ history -d598

Cc lnh trong Lit k 16 lm nhng vic sau: 1. Di tr li m nhn dng tin trnh PID ca shell hin ti. 2. Chy mt lnh echo trong shell mi v di tr li PID ca shell . 3. Chy li lnh gn nht va qua. 4. Chy li lnh gn nht bt u bng 'ec'; y s chy li lnh u tin trong v d ny. 5. Chy li lnh gn nht bt u bng 'en', nhng thay th '$PPID' vo ch '$$', sao cho PID cha m c hin th thay th. 6. Hin th 6 lnh gn nht va qua ca lc s. 7. Xo mc 598 ca lc s, l lnh echo gn nht. Bn cng c th chnh sa lc s mt cch tng tc. Bash shell s dng th vin readline qun l vic chnh sa lnh v lc s. Theo mc nh, cc phm v t hp phm c s dng di chuyn i qua lc s hoc chnh sa cc dng tng t nh nhng phm v t hp phm c s dng trong trnh son tho GNU Emacs. Cc t hp g phm Emacs thng c th hin nh l C-x hoc M-x, trong x l mt phm thng thng, cn C v M l cc phm Control v Meta, tng ng. Trn h thng my tnh c nhn (PC) in hnh, phm Ctrl dng nh phm Control cho Emacs v phm Alt dng nh phm Meta. Bng 3 tm tt mt s chc nng chnh sa lc s

sn c. Ngoi cc t hp phm c hin th trong Bng 3, cc phm dch chuyn con tr nh cc phm mi tn phi, tri, ln, xung v phm Home v End thng c thit lp hot ng mt cch hp l. Cc chc nng b sung cng nh cch lm th no ty chnh cc ty chn ny bng cch s dng mt tp tin khi to readline (thng l inputrc trong th mc nh ca bn) c th c tm thy trong cc trang hng dn s dng.

Bng 3. Chnh sa lc s bng cc lnh emacs


Lnh Phm PC thng dng Right arrow Left arrow Up arrow Down arrow M t

C-f C-b C-p C-n C-r

Di chuyn sang phi mt khong trng. Di chuyn sang tri mt khong trng. Di chuyn ln lnh trc trong lc s. Di chuyn xung mt lnh sau trong lc s. Tm kim ngc tng dn. G mt ch ci hoc cc ch ci tm kim ngc v trc mt chui k t. n C-r mt ln na tm kim s xut hin trc na ca cng chui k t y.

M-f

Alt-f

Di chuyn n u t tip theo; cc mi trng GUI thng nhn t hp phm ny m trnh n File ca ca s . Di chuyn n u ca t trc . Di chuyn ti u dng. Di chuyn ti cui dng. Xa k t trc con tr. Xa k t trong con tr (cc chc nng Del v Backspace c th c t cu hnh theo ngha ngc li). Xa (loi b) ti cui dng v lu li vn bn b xa s dng sau ny. Xa (loi b) ti cui t v lu li vn bn b xa s dng sau ny. Ly li vn bn loi b bng mt lnh loi b ni trn.

M-b C-a C-e

Alt-b Home End

Backspace Backspace C-d Del

C-k M-d C-y

Ctrl-k Alt-d Ctrl-y

Nu bn mun thao tc lch s bng cch s dng mt ch chnh sa ging nh vi, th bn s dng lnh set o vi chuyn sang ch vi. S dng lnh set -o emacs chuyn v ch emacs. Khi bn gi mt lnh trong ch vi, ban u bn ang ch chn ca vi. Trnh son tho vi c cp trong mt bi vit khc trong lot bi ny. (Xem Ti nguyn v l trnh ca lot bi ny). V u trang

Cc ng dn - lnh ca ti u?
Mt s lnh bash c dng sn, trong khi cc lnh khc bn ngoi. By gi chng ta hy xem cc lnh bn ngoi v cch chy chng v cch lm th no bit mt lnh l lnh bn trong.

Shell tm thy lnh u?


Cc lnh bn ngoi ch l cc tp tin trong h thng tp tin ca bn. Vic qun l tp tin c bn s c trnh by trong bi vit khc ca lot bi ny. (Xem Ti nguyn v l trnh ca lot bi). Trn cc h thng Linux v UNIX, tt c cc tp tin c truy cp nh mt phn ca mt cy ln duy nht c gc /. Trong v d ca chng ta, cho n nay, th mc hin ti ca chng ta l th mc nh ca ngi dng. Nhng ngi dng khng l root thng c mt th mc nh trong th mc /home, v d nh l /home/ian, trong trng hp ca ti. Th mc nh ca root lun l

/root. Nu bn g mt tn lnh, th bash s tm lnh ny trnng dn ca bn, l mt danh sch cc th mc c phn tch bng du hai chm trong bin mi trng PATH. Nu bn mun bit lnh no s c thc hin khi bn g mt chui k t c th, hy s dng lnh which hay type. Lit k 17 cho thy ng dn mc nh ca ti cng vi cc v tr ca mt s lnh.

Lit k 17. Tm cc v tr lnh


[ian@echidna ~]$ echo $PATH /usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/bin:/usr/b in:/home/ian/bin [ian@echidna ~]$ which bash env zip xclock echo set ls alias ls='ls --color=auto' /bin/ls /bin/bash /bin/env /usr/bin/zip /usr/bin/xclock /bin/echo /usr/bin/which: no set in (/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache :/usr/local/bin:/bin:/usr/bin:/home/ian/bin) [ian@echidna ~]$ type bash env zip xclock echo set ls bash is hashed (/bin/bash) env is hashed (/bin/env) zip is /usr/bin/zip xclock is /usr/bin/xclock echo is a shell builtin set is a shell builtin ls is aliased to `ls --color=auto'

Lu rng cc th mc trong ng dn ch yu l kt thc /bin. y l mt quy c chung, nhng khng phi l mt yu cu bt buc, nh bn c th thy t /usr/lib/ccache. Lnh which thng bo rng lnh ls l mt alias (b danh) v khng th tm thy lnh set. Trong trng hp ny, chng ta din gii iu c ngha l lnh khng tn ti hay l mt lnh dng sn. Lnh type thng bo rng lnh ls l mt alias, nhng n nhn bit lnh set nh l mt lnh shell dng sn. N cng thng bo rng c mt lnh echo dng sn cng nh c mt lnh trong /bin m which tm thy. Cc lnh cng to ra kt qu u ra theo cc th t khc nhau. Chng ta thy rng lnh ls c s dng lit k cc ni dung th mc, l mt alias. Cc b danh l mt cch tin dng cu hnh mt s lnh s dng cc tp hp mc nh khc nhau hoc cung cp mt tn thay th cho mt lnh. Trong v d ca chng ta, ty chn --color=tty lm cho cc lit k th mc s phn bit kiu tp tin hoc th mc bng mu sc khc nhau. Hy th chy dircolors --print-database xem cc m mu sc c kim sot nh th no v loi mu no c dng cho loi tp tin no. Mi mt trong s cc lnh ny c cc ty chn b sung. Ty thuc vo nhu cu ca bn, bn c th s dng lnh ny hay lnh kia. Ti c xu hng s dng lnh which khi ti kh chc chn l s tm thy mt tp tin thi hnh c v ti ch cn c t ng dn y ca n. Ti thy rng lnh type cho ti bit thm nhiu thng tin chnh xc hn, m i khi ti cn trong mt kch bn lnh shell.

Chy cc lnh khc


Chng ta thy trong Lit k 17 rng cc tp tin c th thi hnh c c mt ng dn y bt u bng /, tc l th mc gc. V d, chng trnh xclock thc s l /usr/bin/xclock, mt tp tin nm trong th mc /usr/bin. Trn cc h thng c hn, thay vo , bn c th tm thy tp tin ny trong th mc /usr/X11R6/bin. Nu mt lnh khng c trong c t PATH (ng dn) ca bn, bn vn c th chy n bng cch ch r ng dn cng vi tn lnh. Bn c th s dng hai loi ng dn: Cc ng dn tuyt i (absolute) l nhng ng dn bt u bng /, nh l nhng ng dn chng ta thy trong Lit k 17 (/bin/bash, /bin/env, v.v). Cc ng dn tng i (relative) so vi v tr th mc lm vic hin ti ca bn, nh lnh pwd bo li. Nhng lnh ny khng bt u bng /, m cha t nht mt /. Bn c th s dng cc ng dn tuyt i bt k th mc lm vic hin ti ca bn u, nhng nhiu kh nng bn s c th s dng cc ng dn tng i ch khi mt lnh nm rt gn vi th mc hin ti ca bn. Gi s bn ang pht trin mt phin bn mi ca chng trnh "Hello World!" kinh in trong mt th mc con ca th mc nh ca bn tn l mytestbin. Bn c th s dng ng dn tng i chy lnh ca bn di dng mytestbin/hello. C hai tn c bit bn c th s dng trong mt ng dn; mt du chm duy nht (.) dng ch th mc hin ti v mt cp du chm (..) ch th mc cha m ca th mc hin hnh. V th mc nh ca bn thng khng c trn PATH ca bn (v ni chung khng nn c), bn s cn phi cung cp tng

minh mt ng dn cho bt k tp tin thi hnh c no m bn mun chy t th mc nh ca bn. V d, nu bn c mt bn sao ca chng trnh hello ca bn trong th mc nh ca bn, bn c th chy n bng lnh./hello. Bn c th s dng c du . v du .. nh mt phn ca mt ng dn tuyt i, mc d mt du chm . n khng c ch li g trong trng hp ny. Bn cng c th s dng mt du ng (~) c ngha l th mc nh ca bn v ~username c ngha l th mc nh ca ngi dng c tn username. Mt s v d c hin th trong Lit k 18.

Lit k 18. Cc ng dn tuyt i v tng i


[ian@echidna ~]$ /bin/echo Use echo command rather than builtin Use echo command rather than builtin [ian@echidna ~]$ /usr/../bin/echo Include parent dir in path Include parent dir in path [ian@echidna ~]$ /bin/././echo Add a couple of useless path components Add a couple of useless path components [ian@echidna ~]$ pwd # See where we are /home/ian [ian@echidna ~]$ ../../bin/echo Use a relative path to echo Use a relative path to echo [ian@echidna ~]$ myprogs/hello # Use a relative path with no dots -bash: myprogs/hello: No such file or directory [ian@echidna ~]$ mytestbin/hello # Use a relative path with no dots Hello world! [ian@echidna ~]$ ./hello Hello world! [ian@echidna ~]$ ~/mytestbin/hello # run hello using ~ Hello world! [ian@echidna ~]$ ../hello # Try running hello from parent -bash: ../hello: No such file or directory

Thay i th mc lm vic ca bn
Cng ging nh bn c th thi hnh cc chng trnh t cc th mc khc nhau trong h thng, bn c th thay i th mc lm vic hin ti ca bn bng cch s dng lnh cd. i s ca cd phi l ng dn tuyt i hay tng i ti mt th mc. Cng ging nh vi cc lnh, bn c th s dng du ., du .., du ~, v ~ username trong ng dn. Nu bn s dng cd m khng c tham s no, s l chuyn ti th mc nh ca bn. Mt gch ni duy nht (-) l tham s dng chuyn n th mc lm vic trc . Th mc nh ca bn c lu tr trong bin mi trng HOME v th mc trc c lu tr trong bin OLDPWD, do mt mnh cd tng ng vi cd $HOME v cd - tng ng vi cd $OLDPWD. Thng thng chng ta ni thay i th mc thay cho ton vn thay i th mc lm vic hin ti. Cng ging nh i vi cc lnh, cng c mt bin mi trng, CDPATH, cha mt tp hp cc th mc c phn tch bng du hai chm cn c tm kim (ngoi th mc lm vic hin ti) khi phn gii cc ng dn tng i. Nu vic phn gii s dng mt ng dn t CDPATH, th cd s in ng dn y ca th mc kt qu lm u ra. Thng thng, nu chuyn i th mc thnh cng, khng dn n kt qu u ra no khc hn l mt du nhc mi, c th i khc. Mt s v d c hin th trong Lit k 19.

Lit k 19. Thay i cc th mc


[ian@echidna ~]$ cd /;pwd / [ian@echidna /]$ cd /usr/local;pwd /usr/local [ian@echidna local]$ cd ;pwd /home/ian [ian@echidna ~]$ cd -;pwd /usr/local /usr/local [ian@echidna local]$ cd ~ian/..;pwd /home [ian@echidna home]$ cd ~;pwd /home/ian [ian@echidna ~]$ export CDPATH=~ [ian@echidna ~]$ cd /;pwd / [ian@echidna /]$ cd mytestbin /home/ian/mytestbin

V u trang

Cc trang hng dn s dng


Ch cui cng ca chng ta trong bi vit ny s cho bn bit cch lm th no c c ti liu hng dn v cc lnh Linux thng qua cc trang hng dn s dng v cc ngun ti liu khc.

Cc trang v cc phn hng dn s dng


Ngun ti liu chnh (v truyn thng) l cc trang hng dn s dng, m bn c th truy cp bng cch s dng lnh man. Hnh 1 minh ha trang hng dn s dng ca chnh lnh man. S dng lnh man man hin th thng tin ny.

Hnh 1. Trang hng dn s dng cho lnh man

Hnh 1 cho thy mt s mc tiu biu trong cc trang hng dn s dng: Mt tiu c tn ca cc lnh tip theo l s phn ca n trong du ngoc n. Tn ca lnh v cc lnh c lin quan bt k c m t trong cng mt trang hng dn s dng. Mt bn tm tt cc ty chn v cc tham s p dng cho lnh ny. Mt m t ngn gn v lnh.

Thng tin chi tit v mi ty chn. Bn c th tm thy nhng phn khc v cch s dng, lm th no thng bo cc li, thng tin tc gi v mt danh sch cc lnh c lin quan. V d, trang hng dn s dng cho lnh man cho chng ta bit rng cc lnh lin quan (v cc phn hng dn s dng ca chng) l:
apropos(1), whatis(1), less(1), groff(1), and man.conf(5). C tm nhm trang hng dn s dng thng gp. Cc trang hng dn s dng thng c ci t khi bn ci t mt gi, v vy nu bn cha ci t mt gi phn mm, nhiu kh nng bn s khng c trang hng dn s dng cho n. Tng t, mt s phn hng dn s dng ca bn c th rng hoc gn nh rng. Di y l nhng nhm trang hng dn s dng thng gp v mt s ni dung v d: 1. Cc lnh ca ngi dng (env, ls, echo, mkdir, tty). 2. Cc cuc gi h thng hoc cc chc nng nhn (link, sethostname, mkdir. 3. Cc thng trnh th vin (acosh, asctime, btree, locale, XML::Parser). 4. Thng tin lin quan n thit b (isdn_audio, mouse, tty, zero). 5. M t nh dng tp tin (keymaps, motd, wvdial.conf). 6. Cc tr chi (lu rng nhiu tr chi hin nay c ha v c tr gip ha ngoi h thng trang hng dn s dng). 7. Cc nhm linh tinh khc (arp, boot, regex, unix utf8). 8. Qun tr h thng (debugfs, fdisk, fsck, mount, renice, rpm). Cc nhm khc m bn c th tm thy bao gm 9 cho ti liu ca nhn Linux, n cho ti liu mi, o cho ti liu c v l cho ti liu hng dn cc b. Mt s mc xut hin trong nhiu nhm. V d chng ta cho thy mkdir c trong nhm 1 v 2 v tty trong nhm 1 v 4. Bn c th ch r mt nhm c th, v d, man 4 tty hoc man 2 mkdir, hoc bn c th ch r ty chn a lit k tt c cc nhm hng dn s dng c th c. Bn c th nhn thy trong hnh minh ha l lnh man c nhiu ty chn cho bn t khm ph. By gi, chng ta hy xem nhanh mt s cc lnh "Xem thm" (See also) c lin quan n man.

Xem thm
Hai lnh quan trng lin quan n man l whatis v apropos. Lnh whatis tm kim cc trang hng dn s dng theo tn m bn a ra v hin th cc thng tin tn t cc trang hng dn s dng thch hp. Lnh apropos thc hin tm kim t kho ca cc trang hng dn s dng v lit k cc trang c cha t kha ca bn. Lit k 20 minh ho cc lnh ny.

Lit k 20. V d v lnh whatis v apropos


[ian@echidna ~]$ whatis man man [] (1) - format and display the on-line manual pages man [] (1p) - display system documentation man [] (7) - macros to format man pages man [] (7) - pages - conventions for writing Linux man pages man.config [] (5) - configuration data for man man-pages (rpm) - Man (manual) pages from the Linux Documentation Project man (rpm) - A set of documentation tools: man, apropos and whatis [ian@echidna ~]$ whatis mkdir mkdir [] (1) - make directories mkdir [] (1p) - make directories mkdir [] (2) - create a directory mkdir [] (3p) - make a directory [ian@echidna ~]$ apropos mkdir mkdir [] (1) - make directories mkdir [] (1p) - make directories mkdir [] (2) - create a directory mkdir [] (3p) - make a directory mkdirat [] (2) - create a directory relative to a directory file descriptor mkdirhier [] (1) - makes a directory hierarchy

You might also like