You are on page 1of 23

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin

hoc, informatique;co...

Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux


Vietsciences-Lng u Nhng bi cng tc gi Lot bi " Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux" ca tc gi Lng u gi bn quyn 2006. Ngi c ch c s dng cho mc ch hc tp hay ging dy cho c nhn. Cm mi hnh thc sao chp hay in li nhm mc ch mua bn hay trc li m khng c s ng chnh thc ca tc gi. Mi thng tin v vic ph bin rng ri c tnh qung b ti liu ny cho mc ch gio dc xin lin lc v vo_quang_nhan@yahoo.com 25/01/2006

Bi 5: 17 Cc lnh c sn (buildin) trong BASH Sau y l cc lnh ca BASH a s tha hng t Bourne. Cc lnh theo chun POSIX 1003.2. Mt s c din ging trong cc bi trc. Phn ny ch trnh by nhng g quan trng v cha c cp. Nhng lnh t quan trng hn hay d dng xin xem bng ph lc ca bi 1. Cc du ngoc vung [] trong cc c php lnh s c nghi rng cc tham s trong du ngoc l tu chn Lu : i vi cc lnh sn c ca BASH, ngi dng khng th dng man <Tn_Lnh> c cch s dng cc lnh ny m thay vo l lnh help 17.1 : Du hai chm (colon) : khng lm g ht, thc thi dng lnh k. Tr v gi tr 0 17.2 . <TN_TP_TIN> [Tham_S] Lnh du chm (period) dng ti, c, v thc thi cc lnh t trong ni dung ca <TN_TP_TIN> vi cc tham s l [ Tham_S] . Ga tr tr v l trng thi thot ca mnh lnh cui cng c thc thi trong tp tin. Nu Tp tin c ti c nh nghi cc hm, th cc hm ny c th c gi sau (Xem li phn ti hm s bi 4 ) nu tn l tn ring th trnh dch s i tm tn ny trong cc ung tm kim ch trong $PATH. Trng hp khng tm thy tn tp tin ny trnh dch tr v s khc 0. Nh ni mnh lnh ny tng ng vi source ... 17.3 eval <KHI_LNH> y l lnh nh gi. Lnh ny tr v gi tr chnh l gi tr trng thi thi hnh ca <KHI_LNH>. Nu khng, lnh khng c th n tr v 0 Th d: Lnh sau y s chp ni dung ca tt c cc dng ca tp tin source.txt tho mn dng thc ca tham s a vo (dc p dng ln lnh grep) vo trong tp tin found #!/bin/bash #mycommand while [ ! "$1" = "" ]; do returncode=`eval grep $1 source.txt >> ./found` shift if [ ! "$returncode" = "" ]; then echo "string \"$1\" nout found >> found fi done 17.4 exec [<LNH> [<THAM_S>]] Tng t nh C/C++, exec s thay th tin trnh ca mnh bng tin trnh thc thi <LNH>. Nu lnh khng c mt th n phi c cung ng qua ng ng dn truyn. 17.5 exit <n> Thot khi chng trnh (hay h v ang dng) tr v gi tr < n> cho mi trng m. Nu <n> khng dung ng th tr v gi tr ca gi tr m lnh cui dng thc thi lin trc .

Bng M thot thng dng chun S m thot 0 1 2 126 127 128 128+n nghi Vic thc thi vn lnh khng c li Ghi ch i khi khng cn thit tr v cc gi tr li th cng c th dng gi tr 0 Him dng, thng mc nh tr v gi tr 1

Cc li thng dng c bt gi tr Cc li linh tinh, such as "divide by zero" ny Dng sai lnh ca h v Lnh c gi khng th thi hnh "command not found" -Lnh khng tn ti "fatal error"- Li nghim trng signal "n" Vn lnh b ngng bi t hp phm Control-C

Quyn s dng c vn hay lnh l tp tin khng th thc thi (khng c thuc tnh +x chng hn) C th c vn trong ci t $PATH hay li chnh t exit ch chp nhn gi tr tr v t 0 n 255 $? tr v ti a 137 (128 + 9) Control-C l li nghim trng signal 2, (130 = 128 + 2, xem dng bn trn) exit ch nhn cc i s nguyn trong khong t 0 - 255

Tham s khng c hiu lc (hay sai)

255*

Trng thi thot ngoi mc

17.6 export [-f][-n] [<TN>[=<Gi_Tr>]] Dng th xut mt <TN> vo trong mi trng (bin ton cc hay bin mi trng) cho php cc tin trnh con truy cp. (Xem li phn trc ni v lnh ny) Cc tham s: -f cho bit l hm; ngoi ra, n s l bin. Ngoi ra, <TN> s ch l bin -n Hy b hiu lc ca vic xut bin ny Nu khng c <TN> trong lnh export th lnh ny s l lnh hin th danh sch cc < TN> xut Gi tr tr v l 0 tr khi lnh b gi sai tham s, hay <TN> khng phi l mt bin c hiu lc, hay trong trng hp dng -f, m <TN> khng phi l mt hm

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
17.7 getopts <Dy_Tham_S[:]> y l lnh tho mn tiu chun POSIX.2 c dng c v truy nhp cc gi tr ca tham s truyn vo mt vn lnh. y l 1 cng c tin li tin hnh truy nhp cc gi tr ca tham s. Trong c php trn, mi tham s khi gi s s c dng chun l - <T> [Gi_Tri]. Trong , <T> l tn ca tham s v l mt k t ch hay s bt k trong bng k t ngoi tr du hai chm : v du hi ? . Mt khc, trong khai bo th th mi tham s T trong dy tham s nu c vit lin sau bng du hai chm : th tham s s i hi phi c mt gi tr i km. Th d: nu <Dy_Tham_S[:]> c dng am:bc th vn lnh s chp nhn cc tham s gi bn ngoi ca n l: -a, -b, -c v -m <gi_tr> Ngi ta thng truy nhp cc tham s ca vn lnh thng qua mt vng lp. <Dy_Tham_S[:]> th tham s c gi tr null. Nu vn lnh c gi m khng cung ng tn tham s c trong

Ch s ca tham s c cha trong $OPTIND (c khi ng tng t 1) v gi tr ca tham s tng ng cha trong $OPTARG Lu : Tuy nhin, i vi cc tham s c khai bo gi tr i km (nh trong th d trn l m: th string i k trong cc tham s nhp vo s mc nhin xem l gi tr ca tham s m) Th d sau y minh ho cho vic truy nhp cc tham s thng qua lnh getopts Parama= Paramb= Paramb_Value= Paramc= Paramc_Value= Param1= Param1_Value= while getopts a1:b:c name do case $name in a) Parama=1" echo "Parama flag is $Parama" ;; b) Paramb=1 Paramb_Value="$OPTARG" echo "Paramb flag is $Paramb, and its value is $Paramb_Value" ;; c) Paramc=1 ;; 1) Param1=1 Param1_Value="$OPTARG" echo "Param1 flag is $Param1, and its value is $Param1_Value" ;; *) echo "Usage: `basename $0`: [-a] [-b value] [c] [-1 value] args\n" exit 2 ;; esac done shift $(($OPTIND - 1)) echo "Remaining arguments are: $*" 17.8 hash [-r] [-dt] [<Tn_lnh>] Ghi nh tn y ca mt lnh sau ny trnh dch s tm ra m khng cn qua bin mi trng $PATH. Cc tham s thng dng: -r lnh cho trnh dch qun i mi gi tr ghi nh -d Yu cu trnh dch ch qun tn ca <Tn_lnh> -t Hin th li tn y ca <Tn_lnh> ghi nh 17.9 readonly [-apf] <Danh_Sch_Tn_Bin>] Ci cc tn trong danh sch t tnh ch c c. Cch thc ny c th dng nh nghi cc hng. Cc tn trong danh sch c th phn cch bi k t space. Lnh tr v 0 tr khi mt tn bin l khng hp l hay trong trng hp dng tham s -f m tn hm khng tn ti Th d: a=1 b=2 readonly a b Cc tham s thng dng: -f Khai bo bin hng l mt hm -a Khai bo bin hng l mt mng -p hin th cc bin hng khai bo dng lnh readonly Khng c tham s : Khai bo tn bin l hng. Ni dung ca n khng thay i c 17.10 test <Biu_Thc> nh gi <Biu_Thc> . Lnh ny hon ton tng ng vi biu thc [ <Biu_Thc> ] thng dng trong cc cu lnh phn nhnh v vng lp, cc php ton (Xem li bi 3). Cc Biu thc trong BASH c th kt hp nhau qua cc php ton to nn biu thc mi. Danh sch di y gim n th t u tin ca cc php ton: 1. 2. 3. 4. ! <Biu_Thc> : Tr v true nu <Biu_Thc> c gi tr false ( <Biu_Thc > ) : Tr v gi tr ca <Biu_Thc> <Biu_Thc1> -a <Biu_Thc2>: Tr v true nu c hai <Biu_Thc1 > v <Biu_Thc2> u c gi tr true <Biu_Thc1> -o <Biu_Thc2> : Tr v true nu hoc <Biu_Thc1> l true hoc <Biu_Thc1> l true

Th d: lnh sau y s kim tra nu tp tin ./myfile khng tn ti th s thi hnh lnh echo "Error: ./myfile not found" v ngng chng trnh tr v gi tr 1 test -e /myfile. || (echo "Error: ./myfile not found"; exit 1) Th d2: dng tng ng vi [ ] X=0 Y=1 if test x -gt y; then echo "$X greater than $Y" else echo "$X not greater than $Y" if

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
17.11 basename < Tn_ng_Dn> Tr v tn cui cng trong mt ng dn vi nhiu th mc Th d: Lnh basename /etc/init.d/boot s tr v gi tr boot 17.12 dirname <Tn_ng_Dn> Tr v phn tn ca <Tn_ng_Dn> loi tr gi tr cui cng Th d: Lnh dirname /etc/init.d/boot s tr v gi tr /etc/init.d 17.13 true v flase: Lnh true tr v trng thi thot thnh cng v khng lm g khc c. Ngc li false tr v trng thi thot tht bi cng khng c hnh ng g khc. Thng c dng trong cc vng lp Th d: cnt=0 while true ; do let "cnt +=1" echo "loop counter: $cnt" if [ $cnt -gt 9 ]; then echo "out of range" break fi done 17.14 trap [-lp] "<KHI_LNH;>" <Danh_Sch_Tn_Hiu> Khi lnh s uc thc thi khi vn lnh nhn c cc tn hiu (signal) ghi trong lnh trap. a s cc tn hiu b by (trap) s khng cn hiu lc (tc l b ngn chn) nh thng thng i vi cc chng trnh dng lnh ny m ch c <KHI_LNH;> c thi hnh. <Danh_Sch_Tn_Hiu> c th cung cp bng cc tn ngn, tn y , hay bng cc gi tr s ca tn hiu ngn cch nhau bi mt khong trng (space character). Tn ngn l tn y nhng b i tin t SIG. Lnh ny c nhiu ng dng nh l s dng trap n "cm" hay ngn ng cc thao tc hay tc nhn bn ngoi (do ngi dng hay chong trnh khc) c nh lm ngng tr cc x l ti quan trng ang xy ra trong lc vn hnh. Ngoi ra ngi ta hay dng trap trong qu trnh tm sa li. -p Nu tham s ny c mt trnh bao s hin th cc lnh trap tng ng vi cc tn hiu -l Yu cu trnh bao hin th danh sch cc tn y ca tn hiu v gi tr tng ng ca chng. Cc c php: trap "" <Danh_Sch_Tn_Hiu> : B qua cc tn hiu trong danh dch trap "<KHI_LNH>" <Danh_Sch_Tn_Hiu> : Thi hnh <KHI_LNH> nu tn hiu b tm thy trap <Danh_Sch_Tn_Hiu>: Tr li gi tr ban u cho cc tn hiu trong <Danh_Sch_Tn_Hiu> trap : <Danh_Sch_Tn_Hiu> : b qua tn hiu v chuyn n vo cc tin trnh con Lu : du ngoc kp c th thay th bng du sc ' trong vic t <KHI_LNH> vo kiu string Cc Tn hiu Quan trng Tn ngn/Tn ca Tn hiu EXIT /SIGEXIT HUB / SIGHUP INT / SIGINT QUIT / SIGQUIT SIGILL SIGBUS SIGFPE SIGKILL SIGUSR1 SIGSEGV SIGUSR2 SIGPIPE TERM / SIGTERM SIGSTKFLT SIGCLD / SIGCHLD SIGCONT SIGSTOP SIGTSTP SIGTTIN SIGTTOU TSTP SIGSYS DEBUG ERR Gi tr bng s 0 1 2 3 4 7 8 9 10 11 12 13 15 16 17 18 19 20 21 22 24 31

nghi Dng bt cc tn hiu thot khi script logout, ngng gi (hang up) Ngt (interrupt) chng trnh (bng <Ctrl>+<c>) Thot khi lnh ang thi hnh (bng <Ctrl>+<\> Ch th khng hp l (illegal instruction) Li BUS Ngoi l im chm ng (Floating point exception) Hy b (kill), khng th ngn chn hay b qua tn hiu ny c. Tn hiu ngi dng t nh nghi 1 Vi phm phn an (segmentation violation) Tn hiu ngi dng t nh nghi 2 ng dn truyn b gy Kt thc (terminate) - kt thc mc nh Li chng xp (stack fault) Trng thi tin trnh con thay i Tip tc Stop, khng th ngn chn tn hiu ny c Ngng bn phm c trong nn t tty Vit trong nn ln tty Tn hiu <Ctrl>+<z> Gi t h thng khng ng Tn hiu thng dng g li, <khi_Lnh> thi hnh sau mi lnh c thc thi ngoi tr cc dng ch thch Khi lnh c thi hnh mi khi mt mnh lnh trong vn lnh tr v gi tr khc 0. Tuy nhin, tn hiu ny khng c thc thi nu cc lnh tr v gi tr khc 0 nm bn trong vng lp, cu lnh phn nhnh hay trong biu thc c && || v !

Th d: Lnh sau y khi t vo trong mt vn lnh s lm mt hiu lc ca t hp phm bm <Ctrl>+<c> ngng chng trnh: trap '' 2 # Ignore Control-C key stroke

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
Tng t nh vy, nhng mnh lnh sau s hin th dng ch "Control-C was pressed!" mi khi n by c tn hiu s 2 trap 'echo "Control-C was pressed!"' 2 # Message when Control-C pressed. Th d2: on m sau y s ch cch ngn chn vic bm t hp <Ctrl>+<c> trong mt giai on cn thit no v sau tr li trng thi bnh thng cho chng trnh trap '' 2 command1 command2 command3 ... trap 2 command5 command6 ... # Control-C, now disabled.

# Control-C re-enabled

Th d3: chng trnh test sau dy s gi chong trnh test2 nh l mt tin trnh con v sau 5 giy tin trnh m (test) d nh hy tin trnh con ny bng lnh kill vi tn hiu 16 nhng trong test2 c by ngn khng cho n php ngng chy bng tn hiu 16 ny (dng trong cc trng hp chy chng trnh con trong thi im nghim trng khng th ngng) . test2 s t kt thc sau 10 giy. Ni dung ca tp tin test #!/bin/bash #file name: test ./test2 & #call test2 as a child in background pid=$! #record process ID of test2 echo "The PID of child process: $pid" i=0 while [ $i -lt 5 ]; do sleep 1 echo -n ". " let "i +=1" done echo -e "\nAttempt to kill the child process and release signal 16 by 'kill' command:" kill -16 $pid Ni dung tp tin test2 #!/bin/bash #File name test2 i=0 trap 'echo "some body tried to kill my process through signal 16"' 16 echo "Verifying child process number:`pgrep test2`" while [ $i -lt 10 ]; do sleep 1 " let "i += 1" echo -n "+" done echo "I exit myseft now" Th d4: Truyn tn hiu 2 (tc l t hp phm bm <Ctrl>+<c>) t parent sang cho child x l #!/bin/bash #parent echo parent running trap 'echo parent exiting; exit' 0 trap :2 ./child & sleep 1000 #!/bin/bash #child echo child started. pid is $$ trap 'echo child got signal 2; exit' INT sleep 1000 17.15 umask [-p] [-S] [<s_c_ch>] Nu nh lnh chmod cho php thay i hay xc nh quyn truy cp ca cc tp tin th lnh umask ngc li xc nh gii hn truy cp ca mt tp tin. Cc gi tr <s_c_ch> bng s trong lnh umask chnh l gi tr b ca gi tr quyn truy cp trong c s bt phn. Sau khi mt lnh umask c thc thi, th tt c cc tp tin to ra trong khi thi hnh vn lnh (chng hn qua cc lnh chuyn hng) u s phi c gi tr truy cp theo ng gii hn ca umask. Ngoi ra, lnh umask s c gi tr hiu lc k t khi n c nh nghi cho dn khi c lnh umask mi hay kt thc vn lnh Th d: Th d sau s to ra tp tin mylog.txt c gi tr quyn truy cp l 755 (tc l gi tr b ca n khi ra lnh umask l 022) #!/bin/bash umask 022 tail -n 10 myfile >

mylog.txt

Lu : gi tr umask thng dng khc l 177, vi gi tr ny th cc tp tin c to ra trong vn lnh s c php truy cp l 600 (tc l ch cho ngi to ra n hay root c quyn vit/c tp tin.) Cc tham s: -S Nu khng c s c ch th lnh s hin th cc gi tr ci t hin ti dng k t -p Yu cu hin th lnh umask hin ang c hiu lc. Nu ra lnh umask khng c tham s i km th gi tr <s_c_ch> c hin th 17.16 command <Lnh> <Tham_S_Lnh> Thc thi <Lnh> <Tham_S_Lnh> b qua cc hm c cng tn. Ch c nhng lnh sn c hay cc lnh tm thy c trong $PATH l c th c thi hnh. Trng hp ny thng c dng khi trong vn lnh c nh nghi hm trng tn vi mt lnh no ca BASH hay bn ngoi. Lnh ny tr v gi tr 127 nu <Lnh> khng tm thy hay nu c li xy ra. 17.17 enable [-n] [-p] [-a] < Tn> Dng hot ho (enable) hay ngn tr (diable) cc lnh c sn ca BASH. Vic ngn tr ca mt lnh BASH s cho php mt lnh no khc c cng tn c thc thi m khng cn phi ghi r tn y ca lnh (nu n c lu trong th mc c tn trong $PATH). Bnh thng th BASH s thc thi lnh sn c ca n v nu c lnh khc cng tn, m khng c gi bng tn y , th lnh ny s khng c thc thi (v c mc u tin thp hn) . Cc tham s bao gm: -n dng ngn tr lnh sn c ca BASH c tn l <Tn> -p Hin thi danh mc cc lnh sn c ca BASH ang c hot ho

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
-a HIn th danh mc cc lnh sn c ca BASH vi thng bo nh km lnh no c hot ho v lnh no ang b ngn tr Khi gi lnh m khng cung cp bt k <Tn> hay tham s no th tng ung vi vic dng tham s -p Lnh tr v 0 tr khi <Tn> khng phi l lnh sn c hay c li khi gi enable. 17.18 help [<TN>] [-s <Dng_thc>] HIn th cc thng tin h tr v cch dng ca cc lnh sn c <TN>. Nu dng tham s -s th lnh ny s hin th cch dng ca cc lnh no c tn tng thch vi <Dng_thc> v lnh tr v 0 tr khi khng c lnh sn c no tho mn <TN> hay <Dng_thc> 17. 19 printf <nh_Dng> [<Cc i_S>] y l lnh m phng theo lnh printf trong C. Lnh ny hin th dng vn bn c nh dng theo s sp xp ca ngi lp trnh. <nh_Dng> l mt string bao gm 3 loi i tng: Cc chui k t thng thng, s c chp thng ra stdout Cc dy k t thot theo chun ANSI C, c hon chuyn theo ng nghi v a ra stdout Cc c t nh dng m mi c t s c nhp vo t mt i s tng ng theo th t. Ngoi %% s cho hin th du % %b Hin th string vi vic chuyn dch i s tng ng, v nu i s c k t thot theo chun ANSI sang ng nghi ca n %s Hin th i s tng ng. %q HIn th i s tng tng trong dng m n c th c dng nh l ng vo ca h v Th d: PI=3.1415926 Dec=31373 Msg1="\tHello" Msg2="world" printf printf printf printf "PI with 2 decimal = %1.2f" $PI "Pi to 5 decimal places and round off = %1.5" $PI "Constant = \t%d\n" $DecimalConstant # Inserts tab (\t). "%b %s \n" $Msg1 $Msg2

17.20 read [-rs] [-a <Tn_Mng>] [-d <K_t_gii_hn>] [-n <n>] [-t <Thi_hn>] [-u <fd>] [< Danh_Sch_Bin>] c mt dng t ng vo chun hay t b m t tp tin df nu dng tham s -u, v t (word) u tin s c gn ln bin u tin, t th hai uc gn cho bin th hai ..., tt c phn cn li ca dng s c gn ht ln bin cui cng nu khng s bin trong <Danh_Sch_Bin> . Ngc li, nu s bin trong <Danh_Sch_Bin> nhiu hn s t c trong dng ang x l th cc bin i sau s c gn ga tr null. Cc k t trong $IFS s c dng lm k t gii hn. K t thot, du nghin v \, c th dng xa cc nghi c bit ca k t lin ngay sau n v dng c dng ni tip nu i i vi du u dng. Nu <Danh_Sch_Bin> khng c cung ng th read s gn ton b gi tr ca dng c c cho bin REPLY. Lnh s tr v 0 tr khi gp k t EOF , read b ht thi hn i khi c, hay b m t tp tin khng hp l khi dng tham s -u. Cc tham s quan trng nu c cung ng khi dng lnh ny l: -a <Tn_Mng> :Cc t c c s c gn ln cc phn t ca bin kiu c kiu mng <Tn_Mng> bt u t ch s 0. Tt c cc phn t sn c ca mng s b xo. Tt c cc bin tham s khc s b b qua khi dng cch ny. -d <K_t_gii_hn> :Dng < K_t_gii_hn> kt thc cho dng nhp vo thay v dng k t u dng. -n <n> : lnh read s ngng c sau khi c c n k t thay v i n ht dng nhp vo -r :tham s ny s hy b vai tr k t thot ca \ v du nghin v nay ch ng vai tr b phn ca dng nhp vo. c bit khi dng n th cp k t "du nghin v-du u dng" s khng cn gi tr nh l s ni tip ca dng vn bn na. -s : Ch lng l (silent mode) Nu ng vo l mt u cui th cc k t s khng c hin th lp li -t <Thi_hn> cung ng thi gian ti a v tr v li nu ton b dng nhp khng c c trong thi hn <Thi_hn> giy. Tham s ny khng c hiu lc nu lnh read khng nhp d liu t u cui hay t mt ng dn truyn. -u <fd> Ng nhp ly t b m t tp tin <fd> Cc th d sau y trch ra t Advanced Bash-Scripting Guide # A single 'read' statement can set multiple variables. echo -n "Enter the values of variables 'var2' and 'var3' (separated by a space or tab): " read var2 var3 echo "var2 = $var2 var3 = $var3" # If you input only one value, the other variable(s) will remain unset (null). echo -n "Enter another value: " read # No variable supplied for 'read', therefore... #+ Input to 'read' assigned to default variable, $REPLY. var="$REPLY" echo "\"var\" = "$var"" echo "Enter a string terminated by a \\, then press <ENTER>." echo "Then, enter a second string, and again press <ENTER>." read var1 # The "\" suppresses the newline, when reading $var1. # first line \ # second line echo "var1 = $var1" echo 1234567890 > File exec 3<> File read -n 4 <&3 echo -n . >&3 exec 3>&cat File exit 0 # # # # # # Write string to "File". Open "File" and assign fd 3 to it. Read only 4 characters. Write a decimal point there. Close fd 3. ==> 1234.67890

17.21 type [-afptP] [<Danh_Sch_Tn>] BASH ch ra vic s dng ca mi tn trong <Danh_Sch_Tn > l thuc loi no trong cc loi function, builtin, file, alias, hay keyword. Cc tham s c th dng bao gm: -p -P -a -r : Tr v tn ca tp tin trong m s c thc thi :Buc tm trong $PATH cho mi tn trong <danh sch> : Tr v tt c cc ni m cha tp tin kh thi c cng tn tp tin. N bao gm c hm v alias : Khng tm tn hm, v cc lnh c sn

Tr v 0 nu tn bt k trong danh sch c tm thy, tr v khc khng ngc li 17.22 ulimit [-acdflmnpstuvSH]limit] Cho php iu chnh cc ti nguyn dnh cho cc tin trnh khi ng bi trnh bao. Cc tham s sau c nghi:

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
-S :Thay i v bo co gii hn mm lin h n mt ti nguyn; cc gi tr c th l hard, soft, v unlimited -H :Thay i v bo co gii hn cng lin h n mt ti nguyn -a :Bo co tt c gii hn hin c -c : ln ti a ca cc tp tin ct li c to ra -d : ln ti a ca phn on (segment) d liu ca mt tin trnh -f : ln ti a ca mt tp tin to c bi trnh bao. -l : ln ti a c th c kho (lock) vo trong b nh -n : ln ti a s tp tin c th m c -p : ln ca b m kiu ng dn, n v dng l mt khi 512 bit -s : ln ti a ca chng xp -t : ln ti a ca thi gian x l trong CPU tnh bng giy -u :S ti a cc tin trnh m c th cung ng cho mt ngi dng -v : ln ti a ca b nha o c th cung cp cho mt tin trnh n v s dng cho cc bo co lin quan n tp tin l 1024 byte Lnh tr v 0 tr khi c tham s khng hp l hay li xy ra khi ci t gii hn mi. Chng ta xem xt qua phn ni dung chnh cc h tr ca vn lnh BASH. l cc kin thc thuc v l thuyt. Trong thc t, vic vit m cho mt chng trnh nghim tc thng ch chim ti a mt phn ba tng thi gian t khi to ra m ngun n khi thc s dng n. thay cho phn tng kt l thuyt, chng ta hy tm hiu thm vi chia s trong qu trnh truy sa li (debugging) 18 Qu trnh Truy sa li trong BASH 18.1 Mt s dng li c bn: Trong cc phin bn chun hin ti ca BASH khng cung cp bt k mt phong tin c bit no truy sa li (debug) . Mt s cch thc tin hnh qu trnh ny u do ngi lp trnh t to nn hay dng phn mm h tr nh phn bashdb Cc dng li chung trong vn lnh BASH thng bao gm: 18.1.1 Li chnh t: y l dng li thng thng v cng d cha nht. Vic vit sai thng s b trnh dch bt li ngay lp tc v thng bao li thng dng "syntax error" hay "command not found" hay "unexpect end of file". Mt trong nhng nguyn do l c th ngi g phm to li g hay do thi quen. Thi quen ny hnh thnh trong vic s dng cc ngn ng khc. Th d m VB s khng chiu c nhiu n vic ch khong trng l bao nhiu trong biu thc logic, hay m Pascal khng n vic vit hoa hay vit thng. Tuy nhin, trong mt s trng hp mt tn vit sai chnh t nhng vn hp l th vic truy li s kh hn nhiu. Th d : if [ "$1"="a" ]; then DO ....fi .... DONE #missing one space character between = sign #all BASH commands are in lowercase; do not capitalized!

WHILE [ $x = 1 ]; $x = 1 #

Wrong! To assign, use: x = 1 instead

18.1.2 Li vn phong: Li vn phong l tt c cc dng li lin quan n ni dung ca cc bin. Vic gn hay dng sai kiu trn 1 loi bin nh nghi kiu cng thuc loi ny nhng hay thy nht l vic s dng sai hay thiu cc du ngoc, cc k t thot ca ni dung mt bin string Th d: echo number 8 > $1 # should be quoted. e.g. echo "number 8 > $1" myvar=$1 in mycodefile;

cat mycodefile | grep myvar=$1 # intent to find lines content word #iit should rewite as: cat mycodefile | grep "myvar=\$1"' echo 'value of variable x is $x'

# wrong quotation; should be echo "value of x is $x" # Should change to echo -e "he said: \"it is

echo "he said: "it is OK!", but is is really not OK." OK!\", but it is really not OK."

18.1.3 Li thiu, tha hay dng sai t kho: Cc li dng ny c th xy ra trong cc cu lnh phn nhnh. Th d thay v if .... elif ... else ... fi th vit thnh if ... else if ... else ... fi hay l vit sai thnh if .... elif .... else .... if 18.1.4 Dng cng tn c sn t trc. Mt khi vic ny xy ra, thng th trnh dch s c th khng pht hin c li loi ny. ng x ca chng trnh s cn tu thuc vo cch thit lp m v cc gi tr ca s trng lp tn ny nh hng nh th no n d liu x l cng nh n mi trng x l. Nn trnh ti a dng li cc tn ca cc hm, cc bin mi trng v cc lnh chun ca BASH v nh vy s buc trnh dch hoc bt li hoc s dng tn c th t u tin cao hn gi trc (tr khi dng cc lnh c th x l loi ny). Vic t tn bin trng vi cc t kho s chc chn b trnh dch pht hin v bo li. Ngoi ra, trong chng mc no phi nh r cc bin c xut thnh bin ton cc cng nh cc loi

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
bin khai l bin a phng th khng nn lm dng sai chc nng s c th gy hu qu khn lng. Vic t tn bin trnh khng b "ng hng" th kh d dng m ngi lp trnh c th c cc k nng ring lm chuyn ny. Ghi ch: Cc lnh chun thng cha trong cc th mc tn bin hay sbin nh l /bin, /sbin, /usr/bin, /usr/sbin. C th kim thm gi tr ca $PATH tn ra cc tn lnh khc trong h thng Cc tn lnh sn c v cc t kho trong BASH c th d dng tm thy cc ta liu tham chiu BASH Cc bin mi trng c th c hin th hu ht qua lnh env Cc lnh nh hash v command c th nh hng hay thay i n th t u tin chun ca cc m BASH gi mt lnh c trng tn 18.1.5 Dng sai/lm ln c php lnh: Mi lnh trong Linux u c cc iu kin v tham s v c php ring. Thng thng, cc lnh s pht hin ra nhng li th thin nh l sai c php thiu hay tha cc tham s, tham s qa hn mc (out of range), ... Vic thng bo li s hin th thng qua ng ra chun (thng l stderr) hay tr v cc gi tr khc 0. i vi cc lnh h tr biu thc chnh quy m rng (nh grep, awk, sed, ...) th ngi dng nn c li cc siu k t m lnh h tr; chng c th khng hon ton c cng nghi cho mi lnh.. Ngoi ra, cn lu c trng hp phi dng cc tham s c bit m hay mt chc nng no ca lnh (th d mun h tr biu thc chnh quy m rng trong grep th phi dng tham s -E). Trong trng hp ngi lp trnh dng lnh dng script da trn lnh getops th vic gi n cng phi cn thn hn. Th d sau y s cho thy iu #!/bin/bash #content of mycmd Parama= Paramb= Parama_Value= while getopts a:b name do case $name in a) Parama=1" Parama_Value="$OPTARG" echo "Parama flag is $Parama, and its value is $Parama_Value" ;; b) Paramb=1 echo "Paramb flag is $Paramb" ;; *) echo "Usage: `basename $0`: [-a value] [-b]\n" exit 2 ;; esac done Lnh mycmd trn i hi tham s a phi c gi tr i km. Khi gi, nu ngi lp trnh "qun" khng cung ng th hu qa s c th sai Chng hn, d nh gi lnh mycmd vi hai tham s -a v -b nhng v thiu gi tr cho tham s -a nn mycmd hiu "lm" rng "-b" l gi tr ca tham s -a v tham s -b c gi tr null #./mycmd -a -b #Parama flag is 1, and its value is -b khc phc nhc im ny th ngi lp trnh c th thm vo mycmd mt vi cu lnh kim nghim tham s nhm pht hin sm hn ngay t bn trong mycmd mi khi tham s -a thiu gi tr 18.1.6 Vit sai cu trc logic ca cc mnh : Vic vit sai logic ca cc mnh hay trnh by sai ni dung ca mt mnh s gy ra cc li m trnh dch khng th tm ra. Cc li ny thng l do ngi lp trnh khng kim sot k cc mnh logic hay dng mnh logic vi qu nhiu php ton logic ni nhau. Cch tt nht trnh li loi ny l ng bao gi dng mt mnh c nhiu hn hai php ton logic. V Nhiu hn th, s t hp logic ca bng chn tr s ln n 8 hay hn cc trng hp kh d, v nh th gy kh khn cho vic kim nghim nu khng mun mt th gi. Thay v vy, ngi ta c th chia mch tiu thnh nhiu phn nhnh nh mi phn nhnh x l 1 hay hai trng hp Logic l tt nht. Mt dng him thy hn l hiu sai v cch trnh by ca mnh Th d xo tt c cc tp tin trong th mc hin hot m ni dung tn ca c c k t khong trng (space). Ngi ta c th lm mt cch sai st nh sau: ls | grep ' ' | xargs -i rm {} L do ca s sai st ny l: Trong vic hin th cc tn tp tin c k t khong trng th trnh dch hin th cc tn ny rt bnh thng. Nhng mt khi cc tn c dng lm tham s cho lnh rm th lnh rm s khng th bit c cc thnh phn ngn cch nhau b k t khobng trng l ca 1 tn duy nht v do n s tm xo cc thnh phn ny thay v tn ng ca tp tin. iu chnh c th th dng sed thay v gr ls | sed -n '/ /s/ /\\ /gp' | xargs -i rm {} 18.1.7 Thit lp sai dng iu khin Trinh dch khng c kh nng pht hin li kiu ny. Vic ny thuc v cch thc kin trc mt chng trnh ca ngi vit m. Cch tt nht i vi cc chng trnh nh, ngi ta c th dng lu (flow chart) kim tra cc thut ton, vic x l ton vn cc dng d liu, hay cc cch thc x l ca chng trnh. i vi cc chng trnh c trung bnh (vi trm dng lnh tr ln) v ln (t vi ngn dng lnh) th cch tt nht l phi c cc s khi phn chia chc nng v kim tra hot ng ca tng khi. Tu theo mc phc tp, cc khi ny c th bao gm nhiu s khi con nh hn nhm lo liu cc phn ring l ca khi ln. Cui cng, cc n v nh nht c th l cc lu logic. Vit 1 chng trnh c trung bnh v c ln thng tn thi gian kin trc v truy sa li hn thi gian xy dng m ngun rt nhiu. Vic kim tra v th nghim hiu qu ca mt chng trnh ph thuc vo kh nng ca ngi (nhm hay nhiu nhm) tham gia. C nhiu k thut khc nhau nh l: Kim nghim kiu hp en, kiu hp trng, kim d liu ngu nhin, kim tra iu kin bin, ...Cc loi th nghim ny i hi ngi lp trnh phi c trang b hiu bit v cng ngh phn mm. 18.2 Vi phng cch truy sa li Vic truy sa li thng cn nhiu thi gian v cng sc hn l khi pht trin m. Do , ngi vit s cng thnh cng v t tn th gi nu cng c kinh nghim, cn thn trong lc kin trc, thit k, xy dng m, v c bin php kim sot hay phn bin r rng. Vic phi lm u tin khi c mt vn vi chng trnh l: vn phi lp li c bi ngi truy sa. Do , vn c m t cng r rng chnh xc v chi tit bao nhiu th vic truy sa s mt th gi by nhiu. Trong nhiu trng hp, vn khng xy ra i vi chng trnh m l i vi vic hiu, cch s dng ng, hay vic vn hnh hp l ca chng trnh . Trong trng hp ny, cn phi bn bc li vi ngi (ch th) nu vn . Mt khi vn c ti lp (dupplicate) v xc nh l do chng trnh to ra th qu trnh truy li bt u. Ngi truy sa lc ny xc nh c iu kin v trng thi chng trnh b li. Vn cn li l tm ra cn nguyn (root cause) ca li, t tm n dng hay khi m c li, so snh li vi kin trc hay thit k ca chng trnh tm ra cc khc phc.

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
Cc phn sau y s khng cp n qu trnh truy sa m ch ch trng n chi tit cc k nng truy sa li khi vit vn lnh BASH 18.2.1 Da vo thng bo ca trnh dch hay ca lnh dng: Thng bo ca trnh dch l phng tin cn bn phn tch li. Hu ht cc li c php u b tm thy qua trnh dch. Ngoi ra cc thng bo tr v qua stderr cng cho bit v tnh trng s dng lnh khi mc li. C nhiu trng hp li c php s khng bo co ng s th t dng lnh b li. Chng hn nh s thiu hay sai trong vic ng v m cc du ngc cho kiu string. Thiu cc t kho hay k t (nh l du ;; trong lnh case) trong vic ng cc mnh lnh phn nhnh v vng lp (nh l fi, done, esac ...) s khin cho trnh dch tm n ht tp tin v thng bo dng "unexpected end of file". 18.2.2 : Trnh by m theo "khung m": y l phng cch hu hiu thy c cc cu lnh lng nhau. Ngi lp trnh c th li dng vic trnh by "cha khong trng u dng" kim tra li cc khung m. Cc khi m nm cng su bn trong cc lnh lng nhau th khong trng u dng ca n cng ln. nh vy mi khi khi m b thiu t kho s d dng kim tra li ch no thiu.. vi cch trnh by ny ngi truy li c th thy c d dng cc phn cp ca cc lnh lng nhau to iu kin cho vic truy sa li d hn nhiu Th d:

18.2.3: Gi thng tin v d liu hin ti ra ngoi bng lnh echo, printf hay bng i hng ng ra chun Mt trong nhng phng cc rt hu hiu truy sa li l dng lnh echo, lnh printf, hay i hng ng ra chun ln mt tp tin log kim nghim li trng thi hay gi tr ca d liu v bin (bng mt hay bng cc c li thng tin trong tp tin log sau .) Vic dng i hng ng ra ln tp tin c th tin li khi lng thng tin qu nhiu hay vic x l qu nhanh hay v l do no khng tin theo di trc tip din bin x l d liu qua mn hnh. Cc thng tin ny nn c lp t trn mi khi m con hay ngay c trn tng dng lnh (nu cn) khu vc nghi ng li bt u xut hin. Rocky Bernstein, trong ti liu Advanced Bash-Scripting Guide cung ng mt cch thc tinh t cho php ngi dng cch thc to ra mt ch truy sa li. Cc lnh echo hin th cc thng tin trong qu trnh truy sa ch hin th khi bin $DEBUG c gi tr on ### debecho (debug-echo), by Stefano Falsetto ### ### Will echo passed parameters only if DEBUG is set to a value. ### debecho () { if [ ! -z "$DEBUG" ]; then echo "$1" >&2 # ^^^ to stderr fi } DEBUG=on Whatever=whatnot debecho $Whatever # whatnot #turn $DEBUG on, anywhere there is debecho function, theree will ehoes DEBUG= Whatever=notwhat debecho $Whatever # (Will not echo.) $DEBUG is off, it will not display information even the function debecho is present 18.2.4: Dng cc cng c sn c trong BASH nh $?, trap, tee Trong BASH c mt s lnh v bin c th c dng trong cng vic truy sa li l $?, trap, v tee $? Nh bit s cha ni dung tr v ca mnh lnh cui cng c thi hnh. Nh vy, nu c li gi tr ny th ngi lp trnh c th bit c l cc mnh lnh c b li khi thi hnh hay khng. Th d: mv myfile1 myfile2 if [ ! $? = 0 ]; then echo "change name error" else echo "change name suceed!" if tee l lnh dng hin th ni dung ca ng ra chun ng thi chp cc hin th ny vo mt tp tin. Vi cch ny ngi ta c th "trch ly" cc thng bo ra mn hnh chun (hay ngc li vo trong mt tp tin) dng trong truy li sau ny Th d: c li PCI ID ca cc thit b lu tr ng thi chp thng tin vo tp tin l mylog th c th dng lnh lspci -n | grep class 01 | tee mylog

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
Nh cp trn lnh trap c th dng "bt" cc tn hiu trong lc truy sa li. Th d: an m sau y cho thy cch hin th gi tr ca cc bin trc khi thot khi chng trnh: #!/bin/bash # trap 'echo "value when exit of a = $a and a=1 b=2 echo "value of a is $a and b is $b" a=0 exit

b = $b"' EXIT

Th d sau y cho thy cch hin th gi tr ca mt bin tn l VAR trong mi dng m vn lnh thi hnh. vic lm ny s tin li nu mun c bit theo di trng thi ni dung ca mt bin no qua tng dng thi hnh lnh. VAR=value trap 'echo "the value of # rest of the script #!/bin/bash .... 18.2.5: Ngt cc dng x l bng vic dng du ghi ch # Trong nhiu trng hp vic pht hin ra dng lnh b li gp kh khn. Ngi pht trin m c th th dng phng php loi suy bng cch chn cc du ghi ch u cc dng lnh ngng khng cho nhng dng c thi hnh. C th kt hp cch ny vi cc lnh echo vic truy sa li hu hiu hn. Ngoi ra, ngi ta c th truy ra dng li bng cch "ghi ch ho" phn na s dng m nu li khng xy ra trong s dng khng b ghi ch th dng li s nm trong phn m b ghi ch v c th tip tc theo cch phn chia nh phn cui cng dng li s b pht hin. 18.2.6: Thay i cung cch vit m Vic ti cu trc li cch vit m cng c th dng trong truy sa li nhng vic lm ny s tr gi cao v thi gian. i khi li khng thuc v ngi lp trnh vit m m l li sai st ca trnh dch hay ca cc lnh h thng c dng thc thi trong vn lnh. Mc d trng hp nh vy him khi xy ra nhng c khi vn khng trnh c. Cch hay nht l dng mt cch vit khc (hay cc lnh khc) cho my thc thi cng mt thao tc c chc nng tng ng hay tng t. i khi s hn ch ca lnh s gy ra b tc, chng hn, vic x l trc tip thng qua cc ng dn truyn c khi bt kh thi hay khng chc nng th ngi lp trnh c th ngh ti vic xut cc thng tin vo trong mt tp tin v x l tp tin nh l mt ng nhp ca cc mnh lnh tip theo i khi rt hiu qu. Th d: C mt loi mu n form.txt s c "in tn" thay th cho t kho NAME. Bin ny s c thay gi tr vo ty theo bin myName c gi trong vn lnh fillform v vit ra thnh tp tin $myName.txt Content of form.txt dear NAME, As your subscription to the X magazine will be expired. .... ...... Ngi lp trnh c th "th" vit vn lnh fillform nh sau #!/bin/bash if [ "$1" = "" ];then echo "missing device name" exit 1 else myName="$1" fi sed 's/NAME/$myName/g' form.txt > ./$myName.txt VAR is $VAR"' DEBUG

M nu trn s khng hot ng c v du k t ' s hn ch tn bin $myName c chuyn i thnh ni dung ng. khc phc c th thay i cch vit thnh sed "s/NAME/$myName/g" form.txt > ./$myName.txt 18.2.6 Dng cch vit "" cho cc loi lnh ch nhnh dng iu khin Trong cc phn nhnh thng ngi lp trnh ch ch n dng iu khin m mnh quan tm v b qua khng x l cc phn nhnh cn li. Truy nhin trong thc t, nhiu khi d liu c li c a ti s lt vo ng ngay tnh hung phn nhnh m ngi lp trnh b qua khng x l. Trong trng hp ny vic truy s li s tr nn kh khn hn v khng c dng x l lin quan n trng thi li hin ti v do chng trnh c th s c nhng ng x bt ng. Cch lp trnh c tnh cch "t v" tt l vic "bao thu" ht cc dng ch nhnh mc d ngi ta khng mong mun phn nhnh s xy ra. Th d sau y dng m gi. Thay v vit dng if [ iu kin1 ]; then .... if [ iu kin 2 ]; then .... fi ...

fi Th iu chnh thnh dng ch c x l "" nhm gip cho vic truy sa li c thun tin hn if [ iu kin1 ]; then .... if [ iu kin 2 ]; then .... esle X l li bt ng hay li ni b vi phm iu kin 2 (unexpectable error or internal error) fi ... X l li ni b hay vi phm iu kin 1

else fi

18.2.7 Dng h tr khc: Cc h tr ny c th c tung ra dng sn phm bn ngoi th trng hay t do dng giy php GNU. Hin ti, c mt n h tr vic truy s li l bashdb. Lnh ny c th c download t trang http://bashdb.sourceforge.net/.

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
Vic trnh by cch x dng thm cc cng c bn ngoi s vt khi yu cu ni dung ca lot bi ny. Nu ngi c c mong mun xin hy c thm cc ti liu ring ca cc h tr . 19. Lp trnh a lung (multi threading) trong BASH: Trong BASH ngi ta t khi dng n cho mch ch lp trnh a lung thay vo l cc ngn ng mnh hn (nh C/C++). Tuy nhin, BASH vn c kh nng cho ngi lp trnh vit trong kiu kin trc ny. Th d ca Rocky Bernstein sau y trch t h s m Advanced Bash-Scripting Guide" # parent.sh # Running multiple processes on an SMP box. # Author: Tedman Eng # This is the first of two scripts, #+ both of which must be present in the current working directory.

LIMIT=$1 # Total number of process to start NUMPROC=4 # Number of concurrent threads (forks?) PROCID=1 # Starting Process ID echo "My PID is $$" function start_thread() { if [ $PROCID -le $LIMIT ] ; then ./child.sh $PROCID& let "PROCID++" else echo "Limit reached." wait exit fi } while [ "$NUMPROC" -gt 0 ]; do start_thread; let "NUMPROC--" done while true do trap "start_thread" SIGRTMIN done exit 0

# ======== Second script follows ======== #!/bin/bash # child.sh # Running multiple processes on an SMP box. # This script is called by parent.sh. # Author: Tedman Eng temp=$RANDOM index=$1 shift let "temp %= 5" let "temp += 4" echo "Starting $index Time:$temp" "$@" sleep ${temp} echo "Ending $index" kill -s SIGRTMIN $PPID exit 0 # ======================= SCRIPT AUTHOR'S NOTES ======================= # # It's not completely bug free. # I ran it with limit = 500 and after the first few hundred iterations, #+ one of the concurrent threads disappeared! # Not sure if this is collisions from trap signals or something else. # Once the trap is received, there's a brief moment while executing the #+ trap handler but before the next trap is set. During this time, it may #+ be possible to miss a trap signal, thus miss spawning a child process. # No doubt someone may spot the bug and will be writing #+ . . . in the future. # ===================================================================== # # ----------------------------------------------------------------------# ################################################################# # The following is the original script written by Vernia Damiano. # Unfortunately, it doesn't work properly. ################################################################# #!/bin/ bash # Must call script with at least one integer parameter #+ (number of concurrent processes). # All other parameters are passed through to the processes started. INDICE=8 TEMPO=5 E_BADARGS=65 # Total number of process to start # Maximum sleep time per process # No arg(s) passed to script.

if [ $# -eq 0 ] # Check for at least one argument passed to script. then echo "Usage: `basename $0` number_of_processes [passed params]" exit $E_BADARGS fi NUMPROC=$1 shift # Number of concurrent process

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
PARAMETRI=( "$@" ) # Parameters of each process

function avvia() { local temp local index temp=$RANDOM index=$1 shift let "temp %= $TEMPO" let "temp += 1" echo "Starting $index Time:$temp" "$@" sleep ${temp} echo "Ending $index" kill -s SIGRTMIN $$ } function parti() { if [ $INDICE -gt 0 ] ; then avvia $INDICE "${PARAMETRI[@]}" & let "INDICE--" else trap : SIGRTMIN fi } trap parti SIGRTMIN while [ "$NUMPROC" -gt 0 ]; do parti; let "NUMPROC--" done wait trap - SIGRTMIN exit $? : <<SCRIPT_AUTHOR_COMMENTS I had the need to run a program, with specified options, on a number of different files, using a SMP machine. So I thought [I'd] keep running a specified number of processes and start a new one each time . . . one of these terminates. The "wait" instruction does not help, since it waits for a given process or *all* process started in background. So I wrote [this] bash script that can do the job, using the " trap" instruction. --Vernia Damiano SCRIPT_AUTHOR_COMMENTS A17 lnh lspci Lnh lspci l mt tin ch (utility) dng hin th cc thng tin v tt c cc PCI BUS ca my tnh cng nh l tt c cc thit b phn cng ni vi chng. Lnh ny l khng th thiu c cho nhng ngi pht trin cc phn mm mc thp c lin quan n BUS hay cc thit b cng nh l cc chng trnh chn khm (diagnostics). Ngoi ra, n cn c dng pht hin cc thit b phn cng v to cc chng trnh ti b iu vn t ng trong cc phng tin khi ng c (bootalbe media) Th d: lspci Trong ch mc nh th lnh ny s hin th tm lc danh sch cc thit b. Cc tham s c th c dng xut ra cc thng tin c th cn dng cho cc chng trnh khc gi n. Cc tham s quan trng bao gm: -v : thng tin c gii m v hin th chi tit thng tin ny v tt c cc thit b. -vv: Tng t -v nhng cung cp thm nhng thng tin c th hu dng -vvv: Tng t -vv nhng hin th- mi th thng tin tm c k c nhng thng tin c v khng hay ho -n : Hin th tn nh sn xut (vendor) v m s PCI ca thit b thay v s dng bng danh mc chuyn thnh ngn ng d hiu -x :Hin th cc thng tin nguyn dng (dump) trong thp lc phn ca cc b phn tiu chun ca khng gian cu hnh PCI -xxx : Hin th cc thng tin nguyn dng (dump) trong thp lc phn ca ton b khng gian cu hnh PCI. Trong mt s thit b c vit lnh ny c th dy treo my -xxxx : Hin th cc thng tin nguyn dng (dump) trong thp lc phn ca khng gian cu hnh PCI m rng (4096 byte) trn cc BUS PCI-X 2.0 v PCI Express -b : Hin th tt c IRQ v cc a ch nh l c thy t cc bo trn PCI BUS thay v nh l c thy bi ht nhn -t : Trnh by dng s phn nhnh bao gm mi BUS, cu (bridge), thit b v cc lin kt gia chng d [<Hng>]:[<Thit_b>] Ch Hin th cc ID ca <Thit_b> thuc v <Hng> . -i <Tp_tin> : dng cc PCI ID thng tin trong < Tp_tin> thay v trong /use/share/hwdata/pci.ids -m : Hin th cc thng tin nguyn dng (dump) trong dng x l bng cc vn lnh Lu : Cc thng tin c lspci chuyn dch thnh ngn ng hiu c uc da trn tp tin /usr/share/hwdata/pci.ids Bng lp cc thit b PCI Bng s ID ca lp cc thit b PCI M (hex) 0x000000 0x000100 0x010000 0x010100 Lp thit b cc thit b PCI c (khng tng thch vi VGA) cc thit b PCI c (tng thch vi VGA) B iu khin SCSI bus B iu khin kho lu tr Ultra ATA v /proc/bus/pci

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
0x010180 0x01018a 0x0101fa 0x010200 0x010300 0x010400 0x018000 0x020000 0x020100 0x020200 0x020300 0x020400 0x028000 0x030000 0x030001 0x030100 0x030200 0x038000 0x040000 0x040100 0x040200 0x048000 0x050000 0x050100 0x058000 0x060000 0x060100 0x060200 0x060300 0x060400 0x060401 0x060500 0x060600 0x060700 0x060800 0x060801 0x068000 0x070000 0x070001 0x070002 0x070003 0x070004 0x070005 0x070006 0x070100 0x070101 0x070102 0x070103 0x0701fe 0x070200 0x070300 0x070301 0x070302 0x070303 0x070304 0x078000 0x080000 0x080001 0x080002 0x080010 0x080020 0x080100 0x080101 0x080102 0x080200 0x080201 0x080202 0x080300 0x080301 B iu khin IDE bus master (UDMA33?) B iu khin IDE bus master (ATA66?) B iu khin IDE bus master (UDMA33, ALi M1533 only) B iu khin FDD (vit tt t Floppy Disk Device: thit b c mm) B iu khin IPI bus B iu khin kho lu tr Ultra ATA (RAID) B iu khin kho lu tr Ultra ATA (RAID) B iu hp ethernet B iu khin token ring B iu khin FDDI B iu khin ATM B iu khin ISDN B iu khin mng kiu khc B iu khin tng thch vi VGA B iu khin tng thch vi 8514 B iu khin XGA B iu khin 3D B iu khin hin th kiu khc Thit b video Thit b audio Thit b in htoi my tnh Thit b a phong tin khc B iu khin RAM B iu khin flash ROM B iu khin b nh khc Cu (bridge) CPU ti PCI Cu PCI sang ISA Cu PCI sang EISA Cu micro channel Cu PCI sang AGP Cu PCI sang PCI (h tr gii m hiu chnh (subtractive decode)) Cu PCI sang PCMCIA Cu Nu Bus B iu khin Cardbus PCMCIA Cu RACEWay (c ch transparent) Cu RACEWay (c ch endpoint) B iu khin qun l nng lng B iu khin lin tc tng thch vi XT tng qut B iu khin lin tc tng thch vi 16450 B iu khin lin tc tng thch vi 16550 B iu khin lin tc tng thch vi 16650 B iu khin lin tc tng thch vi 16750 B iu khin lin tc tng thch vi 16850 B iu khin lin tc tng thch vi 16950 B iu khin cng song song B iu khin cng song song hai chiu B iu khin cng song song tho mn chun CP 1.X B iu khin IEEE1284 Thit b mc tiu IEEE1284 B iu khin lin tc a cng (multi port serial) modem tng qut modem modem tng thch vi hayes (16450 compatible serial) modem tng thch vi hayes (16550 compatible serial) modem tng thch vi hayes (16650 compatible serial) modem tng thch vi hayes (16750 compatible serial) PCI modem 8259 PIC tng qut ISA PIC EISA PIC B iu khin ngt I/O APIC B iu khin ngt I/O APIC B iu khin 8237 DMA tng qut B iu khin ISA DMA B iu khin EISA DMA B nh thi h thng 8254 tng qut B nh thi h thng ISA B nh thi h thng EISA B iu khin RTC tng qut B iu khin ISA RTC

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
0x080400 0x088000 0x090000 0x090100 0x090200 0x090300 0x090400 0x090401 0x098000 0x0a0000 0x0a8000 0x0b0000 0x0b0100 0x0b0200 0x0b1000 0x0b2000 0x0b3000 0x0b4000 0x0c0000 0x0c0010 0x0c0100 0x0c0200 0x0c0300 0x0c0310 0x0c0380 0x0c03fe 0x0c0400 0x0c0500 0x0d0000 0x0d0100 0x0d1000 0x0d8000 0x0e0000 0x0f0000 0x0f0100 0x0f0300 0x0f0400 0x100000 0x100100 0x108000 0x110000 0x118000 0xff0000 B iu khin PCI cm nng tng qut Thit b ngoi vi (peripheral) h thng khc B iu khin bn phm thit b s ho (vit) B iu khin chut B iu khin my qut (scanner) B iu khin cng chi B iu khin cng chi kiu c (legacy) Thit b nhp khc Thit b b gn (docking station) tng qut Thit b b gn khc 386 486 Pentium Alpha chip PowerPC MIPS B ng x l (Co-processor) B iu khin ch IEEE1394 (firewire) B iu khin ch OHCI i.LINK(IEEE 1394) ACCESS.bus SSA B iu khin ch m PCI sang USB B iu khin ch m PCI sang USB B iu khin ch USB khc Thit b USB (khng phi l b iu khin ch ) Knh quang (fibre channel) B iu khin qun l nng lng B iu khin tng thch vi IrDA B iu khin IR tiu tn B iu khin RF controller B iu khin khng dy khc B iu khin I/O thng minh B iu khin lin lc v tinh TV B iu khin lin lc v tinh audio B iu khin lin lc v tinh voice B iu khin lin lc v tinh d liu B iu khin m/ gii m my tnh hay mng B iu khin m/gii m gii tr B iu khin m/gii m khc B iu khin DSP module DIPO B iu khin DSP khc Lp khng xc nh

Th d: Bng trn c th gp tm hiu v PCI -ID ca 1 my c th lspci 0000:00:00.0 Host bridge: ServerWorks CMIC-HE (rev 22) ... 0000:00:02.0 System peripheral: Compaq Computer Corporation Advanced System Management Controller 0000:00:03.0 VGA compatible controller: ATI Technologies Inc Rage XL (rev 27) 0000:00:04.0 Ethernet controller: Intel Corporation 82557/8/9 [Ethernet Pro 100] (rev 08) 0000:00:05.0 SCSI storage controller: Adaptec AHA-3960D / AIC-7899A U160/m (rev 01) 0000:00:0f.0 ISA bridge: ServerWorks CSB5 South Bridge (rev 93) 0000:00:0f.1 IDE interface: ServerWorks CSB5 IDE Controller (rev 93) 0000:00:0f.2 USB Controller: ServerWorks OSB4/CSB5 OHCI USB Controller (rev 05) 0000:00:0f.3 Host bridge: ServerWorks CSB5 LPC bridge 0000:00:10.0 Host bridge: ServerWorks CIOB30 (rev 03) ... 0000:01:02.0 Network controller: Compaq Computer Corporation Compaq Netelligent 10 T PCI UTP TLAN 2.3 (rev 10) 0000:01:1e.0 PCI Hot-plug controller: Compaq Computer Corporation PCI Hotplug Controller (rev 14) 0000:0d:01.0 SCSI storage controller: Adaptec AHA-3960D / AIC-7899A U160/m (rev 01) ... A19 Tm hiu v tp tin kin to (makefile) v lnh make make l mt lnh c bit ca Linux/UNIX thng c dng h tr vic chuyn dch cp nht ha phn mm t m ngun (m thng l C/C++) ra mt chng trnh hay phn mm ng dng. Lnh ny rt hu dng i vi vic kin trc, phn phi, v t chc dch cc tp tin m ngun cho ph hp. Hot ng ca lnh make gn cht v ph thuc vo mt tp tin c bit. Tp tin ny cha cc ch th v cc m t cho make hot ng. N c gi l tp tin kin to (makefile). Thao tc tc ng ca lnh make nhm cp nht ho mt hay nhiu i tng c gi l kin to V khi lng thng tin rt ln, phn ny ch trnh by nhng kin thc thc t nht thng c dng to cc tp tin kin to A19.1 Lnh make lspci -n 0000:00:00.0 Class 0600: 1166:0011 (rev 22) ... 0000:00:02.0 Class 0880: 0e11:a0f0 0000:00:03.0 Class 0300: 1002:4752 (rev 27) 0000:00:04.0 Class 0200: 8086:1229 (rev 08) 0000:00:05.0 Class 0100: 9005:00c0 (rev 01) 0000:00:0f.0 0000:00:0f.1 0000:00:0f.2 0000:00:0f.3 0000:00:10.0 ... 0000:01:02.0 Class Class Class Class Class 0601: 0101: 0c03: 0600: 0600: 1166:0201 1166:0212 1166:0220 1166:0225 1166:0010 (rev 93) (rev 93) (rev 05) (rev 03)

Class 0280: 0e11:ae34 (rev 10)

0000:01:1e.0 Class 0804: 0e11:a0f7 (rev 14) 0000:0d:01.0 Class 0100: 9005:00c0 (rev 01) ...

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
Theo vn bn hng dn ca GNU, make l mt tin ch c kh nng t xc nh xem nhng phn no ca mt chng trnh cn c dch (hay dch li) v t a ra cc mnh lnh chuyn dch chng. phin bn GNU make c pht trin bi Richard Stallman v Roland McGrath. Sau , k t phin bn 3.76 n c "trng coi" bi Paul D. Smith. a s trng hp make c dng cho C/C++ nhng n khng b gii hn bi ngn ng lp trnh m cn c th h tr bt k thao tc no trong c cc tp tin ca thao tc ny cn c cp nht t ng khi c s thay i t cc i tng xc nh trc. Nu khng c tham s c bit, th lnh make s tm v c tp tin kin to ngay ti th mc hin hot. Tn ca tp tin kin to ny trong ch mc nh phi l Makefile C php: make [<tham_s>] [<i_Tng>] [<nh_Nghi_macro>] Cc tham s cho sn quan trng: -d : hin th chi tit cc thng tin truy sa li -f <Tp_Tin> : dng < Tp_Tin> lm tp tin kin to thay v mc nh -i: B qua cc li tr v (ch i l vit tt ca "ignore") v c gng tip tc thi hnh lnh make nu c th -k: B i tc hin ti nu qa trnh cp nht tht bi, nhng vn tip tc lm vic vi cc i tng khc khng lin quan (ti i tng b hng) (k vit tt t ch "keep going") -n hay --dryrun : Hin th cc lnh nhng khng thi hnh dng trong th nghim (n c nghi l "no operation") -o <Tp_Tin> : khng ti to <Tp_Tin> ngay c khi n c hn cc tp tin m n ph thuc vo. -p: Hin th thm cc lut l v cc bin khi thc thi -q : (q l vit tt ca question) khng thc thi ch kim tra xem tt c u cp nht hay khng tr v gi tr 0 nu mi th u cp nht. Nu khng tr li khc 0 -r: Hy b hiu lc ca cc quy nh ngm. ng thi xa cc mc nh v phn ui ca cc quy nh v phn ui -s: Khng hin th cc dng lnh -t: Ch nh du cc tp tin nh cp nht nhng khng thc s kin to chng (vit tt t ch "touch") --warn-underfined-variables Hin th cnh bo (warning) nu macro c s dng m khng c nh nghi trc -C <Th_Mc> chuyn sang <Th_Mc> trc khi bt u cc vn hnh ca make -I <Th_Mc> Bao gm thm <Th_Mc> trong danh sch cc th mc cha cc tp tin bao gm (included file) Gi tr tr v ca lnh make: make ch tr v mt trong 3 gi tr 0 : Lnh hon tt khng li 1: Gi tr ny xy ra nu dng tham s '-q' v make tm thy mt s ch cha c cp nht 2 Nu make tm thy li trong khi thi hnh v s hin th thng bo li A 19.2 Tp tin kin to: A19.2.1 Khi nim Lnh make cn v hon ton ph thuc vo cc thao tc c dn ra trong tp tin kin to ca n. a s cc trng hp th tp tin kin to s ch dn cho lnh make lm th no dch v lin kt mt chng trnh. N cng hng dn cho make lm cch no chy cc lnh b tr (nh l cc thao tc xoc mt s tp tin th sau khi dch xong chng hn). Thi d: tp tin Makefile sau y s cho php dch thnh mt chng trnh n gin vi tn tp tin thc thi l program: #content of file Makefile program: file1.o file2.o file2.c: echo 'char *builddate="' `date` '";' >file2.c Khi ng trong th mc c cha Makefile ny v g lnh make th cc thao tc sau y s t ng thc thi: $ make echo 'char *builddate="' `date` '"' >>file2.c cc -c -o file2.o file2.c cc -c -o file1.o file1.c cc file1.o file2.o -o program Dng u l dng b ch -- make s b qua Dng th nh l lnh chn bin con tr *builddate vi gi tr ban u l thng tin xut ra t lnh date vo dng cui ca tp tin file2.c . Dng th ba, v th t theo th t l lnh make t gi trnh bin dch cc dch cc tp tin file1.c v file2.c ri lin kt chng vi nhau thnh tp tin kh thi program (trong dng cui) Lu : trong th d trn bt buc lnh echo phi c cha l bng mt k t <tab> duy nht A19.2.2 Cc thnh t ca mt tp tin kin to Mt tp tin kin to c th bao gm cc thnh t sau y: Cc quy nh (rule) hay cn gi l cc hin quy (explicit rule) : cho php khi no v cch no to ra hay ti to li mt hay nhiu tp tin. Cc tp tin ny gi l cc tp tin ch (hay ngn gn l ch ). N cng lit k cc tp tin m cc ch ph thuc vo, cc tp tin gi l cc tin . Ngoi ra, trong n cng c th c cc lnh ng to ra hay cp nht cc ch. Cc quy nh ngm (implicit rule) : Cho php khi no v cch no ti to mt lp cc tp tin da trn tn ca chng. N m t cch thc mt ch c th ph ph vo mt tp tin khi m tn ca tp tin ny tng t vi ch (chng hn ch khc nhau phn tn m rng) cng nh l cung cp cc lnh to ra hay cp nht cc ch ny. Cc nh nghi bin: l cc dng khai bo bin Cc dng b ch: Cc dng hay chui k t bt u bng du # l dng bi ch. Cc lnh thi hnh: y l mt b phn ca mt ch. Mi dng lnh ny phi c bt u bng mt k t nhy bc (tab), sau l cc lnh. Cc lnh ny c make xem nh l lnh h thng v s gi ra h v thi hnh. H v s c ton quyn thc thi cc lnh . Cc nh hng (directive) : L cc lnh yu cu make thc thi mt thao tc c bit trong khi make c tp tin kin to. Cc thao tc bao gm: c mt tp tin kin to khc Quyt nh (da vo gi tr ca cc bin) xem khi no b qua hay khi no dng n mt b phn ca tp tin kin to Xc nh bin trc tip t mt chui k t c nhiu dng B phn quan trng nht ca cc nh hng l cc iu kin (conditional) : Cung cp s phn nhnh cho dng iu khin cho lnh make t cc tp tin kin to. Th d: tin theo di th d ny, cc dng dc nh s. Tuy nhin trong thc t cc makefile s khng c cc con s dng ny
1 2 3 #This is the remarked line #file name : Myporgram #Name: ABC

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 17 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 PROG = Myprogram OBJS = main.obj io.obj RM = /bin/rm -f # Configuration: INCLUDES= -I../include -I/usr/include CC = gcc LD = gcc # name of compiler # name of linker # initialize variable PROG # list of object files (define varibale line)

# Compiler-dependent section %if $(CC) == gcc # if compiler is bcc (conditional line) CFLAGS = $(INCLUDES) -g -wall %elif $(CC) == icc # else if compiler is icc LD = icc CFLAGS = $(INCLUDES) g %else # conditional "else" % abort Unsupported CC==$(CC) # compiler is not supported %endif # conditional "endif" all: $(PROG) #top level rule: support "make all" command (see phony target)

$(PROG): $(OBJS) #rule for linking (two lines: this line define dependency) $(LD) $(OBJS) -o $(PROG) #defind command to execute the rule # rule for "main.o". main.o: main.c file1.h file2.h $(CC) $(CFLAGS) -c main.c # rule for "file1.o". file1.o: file1.c file1.h $(CC) $(CFLAGS) -c file1.c # rule for "file2.o". file2.o: file2.c file2.h $(CC) $(CFLAGS) -c file2.c # rule for cleaning re-compilable files: "make clean" clean: $(RM) $(PROG) $(OBJS)

Trong th d trn th: cc cp dng 33-34, 37-38, 41-42, v 45-46 l cc quy nh m Dng u khai bo tn ca cc i tng nm trong quy nh. Cc tn nm sau du hai chm l cc tp tin m cc i tng ph thuc vo (phi c trnh dch hay lnh make c th hot ng ng) Cc dng tip theo l dng lnh s c gi ra h v thc thi. Cc dng 17,19,23,24, v 25 l cc nh hng iu kin (conditional directive) Cc dng 5,6,8,11, 13,14, 18, 20, 21 ,.. l cc dng khai bo bin v/hay nh nghi gi tr ca chng Cc dng bt u bng du # l dng b ch make s b qua A19.2.3 Thc thi mt lnh make: Vic thc thi lnh make s ty theo cc ci t c trong tp tin kin to. Tuy nhin, cch n gin nht l th nhp lnh make khng cn tham s. Ngoi cc tham s cho sn, cc tp tin kin to c th cung ng nhiu i s khc nhau ty theo ch v cc ch nhm to ra d^'i s cho lnh make ny gi l ch gi (phony target) (hay ngn gn l ch nu khng s b nhm ln). Cc ch gi ny s c nh nghi t bn trong cc tp tin kin to (xem thm phn ch ) D sao, nhng i s chun hay c dng l: (xem thm ch gi ) all : to ra tt c cc ch mc cao nht m tp tin kin tin c th lm c. clean : Xa tt c cc tp tin m thng chng c lm ra t vic thi hnh lnh make install : Chp cc tp tin kh thi vo trong cc th mc ng ch ca n (ni m ngi dng thng tm ti cc lnh) ng thi chp cc tp ph tr vo cc th mc m m cc chng trnh to c ra bi make s tm ti chng. check hay test : Tin hnh cc th nghim (nh l kim tra cc iu kin vn hnh) ln chng trnh m makefile s to ra. Tm li c php gi lnh make l: make [<Tham_s>] [<Cc_ch>] Th d Gi s mt makefile tn l "myMakefile" c h tr hai dch l clean v all. Th n c th c gi bng cch make -f myMakefile clean all A19.2.3 Vit mt tp tin kin to Phn ny s hng dn s lc cch to ra mt tp tin kin to. Tuy nhin, v khi lng thng tin khng l, chng ta ch tm tt ngn gn nhng yu t thit yu c th bt u vit mt tp tin kin to. Phn o su thm s i hi cc bn c xem thm ti liu tham kho chnh ca GNU v make ti trang WEB hhttp://www.gnu.org/software/make/manual/make.html A19.2.3.1 Bin, gi tr bin v cc hm h tr Bin hay con gi l macro trong lnh make c hiu nh l mt tn thay th cho mt chui k t, chui ny gi l gi tr ca bin. Tn ca mt bin c th xut hin mi ni mi thnh phn ca mt makefile v s c thay bng gi tr ca n khi thc thi.Ni dung ca bin c th l bt k c th tn cu mt tp tin hay nhiu tp tin hay c th ch l mt phn ca cc tham s ... Quy nh v tn bin: Tn bin c th l chui k t bt k min l khng cha cc k t :, #, =, hay l khng th bt u hay kt thc bng cc k t khong trng (whitespace). Ti liu c t v lnh make c khuyn rng nn t tn bin ch dng cc k t ch, s v du gch di (underscore) ng thi trnh dng ch vit hoa (cc bin vit hoa thng c dng trong cc quy nh ngm -- nu dng trng tn c th to ra cc hiu ng cung tr (override) ln cc bin ca quy nh ngm) biu th gi tr ca bin X th c th vit l ${X} hay $(X) A19.2.3.1.1 Gn ga tr cho bin: = Th d: SOURCE = main.c main.h file1.c file1.h Vi cch gn gi tr ny th tn bin c th c khai trin hi quy. Nghi l gi tr ca bin c th c trung chuyn thng qua cc tn bin gn bi du =. Thi d: one = $(two)

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
two = $(three) three = "ABC" Khi , gi tr ca bin three s c chuyn dch sang cho bin one tc l n s c gi tr l ABC := Th d: OBJS = main.o file1.o Cch gn gi tr ny s khng cho php khai trin hi quy. Ni cch khc gn gi tr kiu ny l ch cho php b>khai trin n gin. Cc gn n gin ny s c mt ng dng ring trnh by phn sau. Dng nh hng define <Cc_dng_k_t> endef Cch ny cho php gn ni dung ca nhiu dng ch <Cc_dng_k_t> ln mt bin. Thng c dng gn cc chui mnh lnh vo gi tr ca mt bin. Th d: define two-lines echo file1 echo $(file2) endef Khi thc thi (gi ra h v) th s tng ng vi hai lnh thi hnh lin nhau (tc l echo file1; echo ${file2} ) Lu : khi dng cch ny nh nghi th cc du k t c bit nh l k t $ cc du ngoc v tn cc bin u tr thnh thnh phn ca gi tr bin c nh nghi bi nh hng define. ${<Tn_bin>:<phn_mun_b>=<phn_thay_vo>} hay $(<Tn_bin>:<phn_mun_b>=<phn_thay_vo>) Cc khai bo ny s cho php dng bin mi vi ni dung tng t nh cc bin c m ch i phn tip v ng. iu ny khc tin li cho vic khai bo bin mi vi ni dung ch khc phn m rng tn cc tp tin Th d: file1 := a.o b.o c.o file2 := $(file1:.o=.c) s cho ra bin file2 vi ni dung l a.c b.c c.c B ch: Thc ra, y l ng dng dng vit ngn ca hm patsubstr (xem phn sau) A19.2.3.1.2 Cc hm v php ton h tr thay i ni dng bin: A19.2.3.2.2.1 Php ton += S cho php ni thm vo ni dng sn c ca bin mt gi tr trng (space) v gi tr mi gn vo Th d: OBJS = main.o file1.c OBJS += file2.o gi tr ca OBJS s l main.o file1.o file2.o A19.2.3.2.2.2 Cc hm gip truy cp gi tr ca bin: make h tr mt s hm nhm thay i cc gi tr ca dng vn bn, hay ni dung ca bin. Lu : Cc du phy, du k t trng v cc du ngoc s khng c c mt trong ni dung dng vn bn cng nh ni dung cc tham s ca hm. vt qua chng ngi ny th c th vit gin tip Th d: comma:= , empty:= space:= $(empty) $(empty) file1:= a b c file2:= $(subst $(space),$(comma),$(file1)) # file2 is now `a,b,c'. Cc hm h tr quan trng bao gm: subst hm ny cho php thay th mt b phn ca dng k t bi b phn thay th. C Php: $(subst <phn_c_b>,<phn_thay_vo>,<Dng_vn_bn>) Th d: $(subst a,CC,the hat on the cat) s i dng the hat on the cat thnh dng the hCCt on the cCCt patsubst s tm v thay th cc t tho mn mt dng thc bng t mi trong dng vn bn cho sn. C Php: $(patsubst <Dng_thc>,<T_thay_th>,<Dng_vn_bn> Lu : Khc vi cc dng thc trong BASH, dng thc y ch gii hn trong mt t (word) -- t trong lnh make l mt chui k t trong dng vn bn con c ngn cch vi t khc bi cc k t trng -- make ch h tr mt siu ki t. l : k t % s cho php ng hp vi mi loi k t theo sau c di t 1 k t tr ln (cho n kt thc t ang c cu xt) (gn tng t nh siu k t * trong BASH nhng siu k t * khng b gi hn trong bin gii ca 1 t); Th d: $(patsubst %.c,%.o,x.c.c file2.c) s thay cc t kt thc bi .c thnh t nhng kt thc l .o v hm ny cho ra gi tr x.c.o file2.o. Cc dng vit tt ca hm patsubst bao gm $(<Tn_bin>:<Dng_thc>=<T_thay_th>) s tng ng vi $(patsubstr <Dng_thc>,<T_thay_th>,$(<Tn_Bin>)). $(<Tn_bin>:<Tip_v_ng>=<T_thay_th>) s tng ng vi $(patsubst %<Tip_v_ng>,%<T_thay_th>,$(<Tn_bin>)). Th d: c bin source= main.c file1.c file2.c th c th nhn v tn cc tp tin i tng .c bng cch vit objs= $(source:.c=.o). Hon ton tng ng vi cch vit objs= $(patsubst %c, %o, $(source)) $(strip string) Hm ny s xo tt c cc k t trng gia cc t trong string v thay bng mt k t trng duy nht nm gia cc t . $(findstring <Gi_tr>,<Dng_vn_bn>) : Tm < Gi_tr> trong <Dng_vn_bn> . Th d $(findstring a,a b c) s tr v gi tr a; trong khi $(findstring a,b c) s tr v gi tr '' (chui k t trng) $(filter <Cc_dng_thc>, <Dng_vn_bn>) xo tt c cc t khng tng hp vi < Cc_dng_thc> v ch tr v phn cn li tng hp vi <Cc_dng_thc> trong dng vn bn. y cc dng thc c vit ngn cch nhau bng mt k t trng Th du: Trong mt tp tin kin to c ba dng source := file1.c file2.c def.h mydat.dat mydat.s file1: $(sources) cc $(filter %.c %.h,$(source)) -o file1 dng lnh th ba s c gi tr l cc file1.c file2.c def.h -o file1 $(filter-out <Cc_dng thc>,<Dng_vn_bn>) ngc li vi hm filter, hm ny s ch tr v phn cn li ca dng vn bn sau khi loi b cc t no tng hp vi cc dng thc $(sort <Dng_vn_bn>) Xp th t theo li t in v xo cc t trng lp trong <Dng_vn_bn> Th du: $(sort file1 file2 main file1)

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
s tr v gi tr file2 file1 main $(dir <Cc_Tn>) : tng t lnh dirname trong BASH, hm tr v tn phn th mc cha tn cui cng. Th d: $(dir /home/myname/file1.c /home/myname/file2.c test) s tr v gi tr file1.c file2.c $(notdir <Cc_tn>) Tng t nh lnh basename trong BASH, hm tr v cc tn nhng ct b phn tn th mc cha gi tr cui ca t. Th d: $(notdir src/file1.c /home/myname/file2.c test) tr v file1.c file2.c test . $(suffix <Cc_tn>) Ch tr v cc tip v ng ca <Cc_tn> m bt u bng du chm (tng ng vi phn tn m rng ca cc tp tin) Th d: $(suffix file1.c /home/myName/file2.c mydata.dat) tr v .c .dat $(basename <Cc_tn>) Ngc vi hm suffix, hm ny tr v tt c ngoi tr phn tn m rng (tc l phn cui ca tn bt u t du chm cui cng) Th d: $(basename home/myname/file1.c mydat.dat) tr v home/myname/file1 mydat. Lu : hm basename ny c ni dung tr v hon ton khc vi hm basename trong BASH. $(addsuffix <Tip_v_ng>,<Cc_tn>) : Thm <Tip_v_ng> vo <Cc_tn> Th d: $(addsuffix .c,file1 file2) tr v file1.c file2.c. $(addprefix <Tip_u_ng> , <Cc_tn >) Thm <Tip_u_ng> vo trong <Cc_tn> Th du: $(addprefix /usr/src/,file1 file2) cho kt qu /usrsrc/file1 /usrsrc/file2. $(wildcard <Dng_thc>) Dng gn gi tr cho bin cc tn tp tin nhng dng k t phng nh Th d: OBJS= $(wildcard *.c) cho kt qu l tt c cc tn c phn m rng l .c A19.2.3.2.2.3 Cc hm thng dng khc c tc ng ln bin bao gm: $(if condition,then-part[,else-part]) : make s nh gi condition bng cch ct b cc k t trng trc v sau condition ri sau khai trin (expand) tham s ny (thng l tn bin). Nu condition c gi tr false (tc l mt string di bng 0) th phn else-part(nu c) s c khai trin; ngc li phn then-part s c khai trin. Th d: INCLUDE_FLG += -Iinclude $(if ($BUILDSRC, -Iinclude2, -I$(src)/include) $(foreach var,list,text) : khai trin i s list, sau ln lt gn ln var cc gi tr ca mi t c trong list theo th t v thc thi text. Th d1: dirs := a b c d files := $(foreach dir,$(dirs),$(wildcard $(dir)/*)) S cho kt qu ni dung ca bin file ln lt l $(wildcard a/*), $(wildcard b/*), $(wildcard c/*), v $(wildcard d/*). Mnh for trn s tng ng vi vic gn files := $(wildcard a/* b/* c/* d/*) Th d2: LINK_HEDERS := $(for header, $(LINK_HEADERS), include/asm/$(header)) $(call <Tn_bin>,<Tham_S1>,<Tham_S2>,...) : Khi thc thi (expand) hm ny, make s tm thi gn cc gi tr <Tham_S1>, <Tham_S2>, ... vo thnh gi tr ca cc bin tham s mc nh $1, $2, ... Sau n s tin hnh khai trin gi tr ca bin <Tn_bin>. Do , nu <Tn_bin> c ni dung cha ng cc gi tr bin $1, $2 , .. th n s lm nh hng ti ni dung tng ng ca <Tn_bin> Th d: reverse = $(2) $(1) file1 = $(call reverse,a,b) kt qu l file1 = b a $(shell <Lnh> Hm ny s tin hnh thc thi <Lnh> thng qua h v v hin th ng ra sau khi th thi s c tr v Th du: contents := $(shell cat file1) A19.2.3.2.3 Cng tr (override) v khng cng tr ca bin khi gi lnh make Gi s c bin X c gn gi tr trong tp kin to l Makefile. Nay ngi dng mun thay i gi tr mc nh ny ca X m khng mun iu chnh ni dung tp tin kin to th thay v gi make <Cc_Tham_S> c th dng cch gi dng make X='<gi_tr>' <Cc_Tham_S> thay i n. Bin X trong thao tc ny c gi l b cng tr. Trong trng hp ny, tham s X s c ci t gi tr ban u mi (<gi_tr>) thay v gi tr khi ng sn c trong Makefile. Make ch h tr mt s tham bin c php cng tr hu ht l dng vi cc tham s ca cc lnh trnh dch (hng thy nht l bin CFLAGS ). Sau y l danh sch cc bin (mc nh) quan trng c th b cng quyn: ASFLAGS : Bin thm vo dng vi hp ng (assembler) (khi gi vi tp tin .s hay .S). CFLAGS : Bin thm vo dng vi trnh dch C. CXXFLAGS : Bin thm vo dng vi trnh dch C++ . COFLAGS : Bin thm vo dng vi trnh RCS co program. CPPFLAGS : Bin thm vo dng vi chng trnh tin x l C v cc chng trnh dng ti n (nh l trnh dch C v Fortran). FFLAGS Bin thm vo dng vi trnh dch Fortran. GFLAGS Bin thm vo dng vi trnh SCCS . LDFLAGS Bin thm vo dng vi trnh dch m n h tr gi b lin kt (linker) `ld'. LFLAGS Bin thm vo dng vi trnh Lex. YFLAGS Bin thm vo dng vi trnh Yacc. PFLAGS Bin thm vo dng vi trnh dch Pascal. RFLAGS Bin thm vo dng vi trnh dch Fortran ln cc chng trnh Ratfor. LINTFLAGS Bin thm vo dng vi trnh lint. Th d trong mt Makefile ta nh nghi CFLAGS = -g dng trong lnh cc -c $(CFLAGS) file1.c . Nhng trong mt s trng hp ngi dng c th i gi tr tham s ny thnh -g -O bng cch gi lnh make dng: make CFLAGS='-g -O' hay l make CFLAG:='-g -O' Nu ch mun dng php gn n gin Gn nh ngc li trong nhiu trng hp rt c bit, mt s dng c th no ca Makefile, ngi ta khng cho php lnh make p dng thao tc cng tr ln nhng dng m c bin c gi tr c bit th c th dng thao tc khng li tnh cng tr thng qua nh hng cng tr (overide directive) theo c php:

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
override <Tn_bin> = <Gi_tr> Vic thit k nh hng override l nhm cho ngi vit makefile c th iu chnh cc i s m ngi dng gi vo. A19.2.3.3 Quy nh: y l thnh phn quan trng nht ca mt Makefie. Nh tn gi cc quy nh s quy nh cch thc cng nh s ph thuc v cch to ra cc ch tc l cc tp tin, cc chng trnh m ngi lp trnh mun c. C php chung ca mt quy nh l: < Cc_ch>: <Cc_Tin_> <Khi_Lnh> Trong : <Cc_ch> (targets) trng hp tng qut l tn ca cc tp tin ngn cch nhau bi k t trng. Trng hp c bit <Cc_ch> khng phi l tn tp tin s l cc ch gi (phony target) <Cc_Tin_> l tn ca cc tp tin m cc tp tin ch ph thuc vo. Mi lnh cn thit to nn mt tin s phi c thc thi hon ton trc khi bt u thi hnh cc lnh to ra mt tp tin ch tng ng <Khi_Lnh> lun lun bt u vi mt k t TAB (k t nhy bc). Cc lnh ngn cch nhau bi du chm phy (;) s c gi ra trnh bao thi hnh Lu : Bt u ca dng <Khi_Lnh> phi l mt k t nhy bc (<TAB>) v ch mt m thi Danh sch tn cc tp tin trong <Cc_ch> v trong <Cc_Tin_> u c th dng k t phng nh miu t cng mt lc nhiu tp tin vo trong danh sch. Tuy nhin, iu ny khng ng khi dng trong nh nghi bin (Th d: nh nghi OBJS = *.o s khng c hiu l cc tp tin c phn ni di l .o m t iu ny phi dng hm h tr cho ni dung bin tc l phi khai bo thnh OBJS = $(wildcard *.o) Cc dng qu di c th ct ra thnh nhiu dng con ngn hn bng cch chn du nghing v \ ch b ct cui mi dng con Mi quy nh s cung cp cho make hai thng tin: Khi no cc ch b qu hn (out-of-date) v lm th no cp nht chng khi cn. Mt ch c xem l qu hn khi n c hn bt k mt trong cc tp tin tin hoc khi n khng c mt. Khi lnh l phng thc ti to cc ch qu hn v y l cc lnh m h v s thi hnh. Tt c cc lnh kin to Th d: edit : main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o A19.2.3.2.1: Quy nh ngm: tin li v gim cng sc cho vic vit m, mt s ln cc quy nh c cung cp sn. Cc quy nh s c make tm kim v p dng t ng mt khi make tm thy mt tn tp tin trong makefile (nh l tn ca mt ch hay tn ca mt tin ) m li khng c mt quy nh no ch ra cch to nn tp tin . Th d: Mt makefiel c ni dung: CFLAGS = -c -O LDFLAGS = -g myprog: myprog.o file1.o cc -o myprogram file1.o myprog.o $(CFLAGS) $(LDFLAGS) V trong tp tin c cp ti file1.o nhng li khng ch ra lm th no c file1.o nn make s t ng tm trong cc quy nh ngm ca n m p dng (Trng hp ny d trn mnh lnh l cc nn make s t tm file1.c v dch ra thnh file1.o) A19.2.3.2.2 Cc quy nh ngm thng dng: Dch cc chng trnh C : <Tn>.o s c t ng lm ra t <Tn>.c qua mnh lnh dng: $(CC) -c $(CPPFLAGS) $(CFLAGS)' Dch cc chng trnh C++ : <Tn>.o s c t ng lm ra t <Tn>.cc, <Tn>.cpp hay <Tn>.C qua mnh lnh dng: $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) Dch cc chng trnh Pascal : <Tn>.o s c t ng lm ra t <Tn>.p qua mnh lnh dng: $(PC) -c $(PFLAGS) Dch cc chng trnh Fortran v Raftor : Tu theo s c mt ca tn m rng, <Tn>.o s c t ng lm ra: .f Qua mnh lnh dng: $(FC) -c $(FFLAGS) .F Qua mnh lnh dng: $(FC) -c $(FFLAGS) $(CPPFLAGS) .r Qua mnh lnh dng: $(FC) -c $(FFLAGS) $(RFLAGS) Dch cc chng trnh hp ng v tin x l : Tu theo s c mt ca tn m rng, <Tn>.o s c t ng lm ra: .s t trnh dch as qua mnh lnh dng $(AS) $(ASFLAGS) .S t cc b tin x l C, cpp qua mnh lnh dng $(CPP) $(CPPFLAGS) Lin kt (link) mt tp tin i tng: <Tn> c t ng t <Tn>.o bng cch chy linker (b lin kt) qua trnh dch C bng mnh lnh $(CC) $(LDFLAGS) <Tn>.o $(LOADLIBES) $(LDLIBS) Xem thm chi tit h tr trong cc ti liu tra cu ca make (lit k trong phn ti liu tham kho) Trong c cc bin m make nh nghi sn. Khi cn ngi vit makefile c th nh nghi li. Mt s bin bao gm AS Trnh dch cho cc tp tin hp ng mc nh l as. CC Trnh dch cho chng trnh C mc nh l cc. CXX Trnh dch cho chng trnh C++ mc nh l g++. CPP Chng trnh chy b tin x l C vi cc kt qu cho ra ng ra chun mc nh l $(CC) -E . FC Trnh dch cho chng trnh Fortran v Ratfor mc nh l `f77'. PC Trnh dch cho chng trnh Pascal mc nh l pc ASFLAGS Tham s cho hp ng (khi gi ln cc tp tin.s hay .S). CFLAGS Tham s cho trnh dch C. CXXFLAGS Tham s cho trnh dch C++. CPPFLAGS Tham s cho b tin x l C (C preprocessor) v cc chng trnh no dng n (trnh dch C v Fortran). FFLAGS Tham s cho trnh dch Fortran. LDFLAGS Tham s cho trnh dch khi n gi b lin kt (linker) ld. PFLAGS Tham s cho trnh dch Pascal. RFLAGS Tham s cho trnh dch Fortran cho cc chng trnh Ratfor. A19.2.3.3 ch gi : ich gi l ch m thc s tn ca n khng phi l tn ca tp tin. ch gi to ra nhm ch thc thi nhng thao tc ring bit m ngi vit makefile to ra. Thi d1: clean: rm *.o *.tmp Trong trng hp ny, nu khng tn ti tp tin vi tn clean, th lnh rm ca quy nh clean s thi hnh mi ln nhp make clean. Tuy

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
nhin, nu nh tn ti mt tp tin vi tn clean th do tp tin ny khng b nh hng bi cc tin (khng c t k tn ca cc tp tin tin ca quy nh clean) nn lnh gi bi quy nh ny (rm) s khng c thc thi v make cho rng khng c g mi cp nht. trnh trng hp ny, c th dng ch gi c bit cung cp sn bi make l .PHONY. Vi tn ny th quy nh s c thc thi bt k tp tin clean c tn ti hay khng: Th d2: Thay v dng tn clean hy dng .PHONY lm tn ch .PHONY: clean clean: rm *.o *.tmp Mt ng dng khc ca ch gi c trnh bay trong cc th d sau: Th d3: thc thi cc tp tin kin to trong cc th mc con thng qua mt quy nh bng cch vit: SUBDIRS = dir1 dir2 dir3 subdirs: for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir; \ done Cch vit trn c im yu l nu xy ra mt li bt k trong qu trnh thi hnh cc makefile con trong vng lp th make (m) vn tip tc chy m khng dng li v tr li. ng thi, s h tr vic chy song song cc quy nh ca make cng khng xy ra (v tt c gom chung li trong mt quy nh) nn nh hng n hiu nng ca vic thc thi make. Cch vit khc phc hai yu im ny l tn dng ch gi .PHONY SUBDIRS = dir1 dir2 dir3 .PHONY: subdirs $(SUBDIRS) subdirs: $(SUBDIRS) $(SUBDIRS): & $(MAKE) -C $@ dir1: dir3 Theo cch vit ny th dir1 s khng th c chy cho n khi dir3 c hon tt Lu : ch gi c th "ph thuc" vo nhiu tin . Mi tin n lt n li l mt ch c lnh thc thi ring.. Th d3: all : prog1 prog2 prog3 .PHONY : all prog1 : prog1.o utils.o cc -o prog1 prog1.o utils.o prog2 : prog2.o cc -o prog2 prog2.o prog3 : prog3.o sort.o utils.o cc -o prog3 prog3.o sort.o utils.o vi cch vit ny th ngi dng c th gi to nhng ch khc nhau chng hn nh make all to ra prog1 prog2 v prog3 . Nhng cng c th gi make prog2 ch to prog2 m thi. Ngoi ra, make cn cung cp cc tn ch c chc nng khc t ph bin nh .PRECIOUS, .INTERMEDIATE, .SECONDARY, .EXPORT_ALL_VARIABLES , ... (xem thm ta liu tra cu ca GNU) A19.2.3.4 Cc bin thng dng A19.2.3.4.1 VPATH: bin VPATH l mt bin ton cc ca make dng ch ra danh sch cc th mc m make s tm kim. Bin ny s bao gm tn cc th mc c cha cc tp tin tin m chng khng c mt trong th mc hin hot; ng thi n cng c th l tn cc th mc cha cc tp tin ch ca cc quy nh. Mt khi tn mt tp tin d l ch hay l tin m khng c mt trong th mc hin hot th make s tm kim n thng qua bin VPATH. Tng t nh bin PATH trong BASH, VPATH ni tn cc th mc bi cc du : Th d: VPATH = /src:../include Xin xem thm cc bin khc nh ca make trong cc ti liu tra cu chnh thc ca GNU v make AA19.2.3.4.2 Bin t ng (Automatic Variable) Vic to ra cc bin t dng nhm tho mn nhu cu t ng ho cc thao tc v gim thiu m cn vit cho makefile. Th d ngi lp trnh c b m ngun C l A.c B.c, C.c., ... Vic thng thy trong qu trnh dch l to ra cc tp i tng tng ng A.o, B.o, C.o, ... Ri sau cng, c th lin kt n thnh chng trnh thc dng. Cc bin ny s gip t ng hon i tn (trong trng hp ny l vic thay i cc tn m rng cu cc tp tin) Lu : Cc bin t ng ch c gi tr v hu hiu ni trong cc cu lnh. Nu s dng cc bin ny bn ngoi cc cu lnh th chng ch c gi tr rng. Danh sch cc bin t ng ph bin bao gm $@ : C ni dung l tn tp tin ch ca quy nh tng ng. Trong trng hp quy nh l quy nh dng thc c nhiu ch th $@ s l tn ca ch no lm nguyn nhn cho s thc thi mnh lnh ca quy nh $< : C ni dung l tn ca tp tin tin l u tin. Nu ch c lnh thc thi ca n nm trong mt quy nh ngm, th bin ny s l tp tin tin l u tin c thm vo bi quy nh ngm $? : Tn ca tt c cc tp tin l no mi hn tp tin ch v l danh sch c vit ngn cch cc tn vi nhau bi cc k t trng. (y l tn bao gm c tn th mc cha ca cc tp tin l) $^ : Tn ca tt c cc tp tin l v l danh sch c vit ngn cch cc tn vi nhau bi cc k t trng. Tuy nhin, n s b i nhng tn no trng lp $+ : Tng t nh $^, nhng y cc tn trng lp c lp li theo ng th t m chng c lit k ttrong makefile. iu ny hu dng ch yu trong cc lnh lin kt, n c nghi khi m n lp li tn ca cc th vin trong mt th t ring no . $* : Phn gc (stem) m mt quy nh ngm tng thch. Nu ch l dir/a.file1.b v dng thc ch l a.%.b th phn gc l dir/file1. Phn gc ny hu dng to ra cc tn ca nhng tp lin h. Trong mt quy nh dng thc tnh, phn gc l b phn ca tn tp tin m n tng thch vi % trong ch ng thc. $(@D) : Phn tn ca mt th mc ca mt ch m b xo i phn bt u t k t nghin ti (slash) Th d nu gi tr ca $@ l dir/file1.o th $(@D) l dir . Khi m $@ khng c du nghin ti th $(@D) l du chm . $(@F) : Phn tn ngn ca tn ca mt ch. Nu gi tr ca $@ l dir/file1.c th $(@F) c gi tr l file1.c Lu : $(@F) tng ng vi $(notdir $@) Th d:( trch t http://www.opussoftware.com/tutorial/TutMakefile.htm ) 1 CC=g++ 2 CFLAGS=-c -Wall 3 LDFLAGS= 4 SOURCES=main.cpp hello.cpp factorial.cpp .IGNORE,

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
5 6 7 8 9 10 11 12 13 OBJECTS=$(SOURCES:.cpp=.o) EXECUTABLE=hello all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $@ .cpp.o: $(CC) $(CFLAGS) $< -o $@

Dng 10 tng ng vi: $(CC) $(LDFLAGS) $(OBJECTS) -o $(EXECUTABLE) Dng 12: quy nh p dng cho cc tp c cng tn m rng .cpp v .o lnh thc thi l (dng 13): $(CC) $(CFLAGS) $< -o $@ (bin dch t .cpp sang .o cho mi tp tin c tn m rng l .cpp) Th d2: VPATH = /src:../headers file1.o : file1.c defs.h hack.h cc -c $(CFLAGS) $< -o $@ (dng lnh ny tng ng vi cc -c $(CFLAGS) file1.c -o file1.o ) A19.2.3.5 Cc nh hng thng dng ca make A19.2.3.5.1 include : nh hng ny c tc dng lnh cho make ngng c tp tin kin to hin ti v chuyn sang c cc tp tin kin to khc trc khi tip tc cc dng k tip. nh hng ny dng t chc mt chng trnh ln bao gm nhiu chng trnh nh trong nhiu th mc v mi chng trnh nh ny c cc makefile ring (th d nh trng hp makefile ca m ngun nht nhn) C php: include <Tn_cc_tp_tin> A19.2.3.5.2 export : Dng xut cc bin vo trong cc tp tin kin to con. Khi gp lnh ny make s thm vo tn v gi tr ca cc bin c xut ra vo trong mi trng ca tp tin kin to con. c bit bin MAKFLAGS lun lun c xut dng chung cho cc tp tin kin to con. C php: export <Tn_Bin> export <Tn_Bin> = <Gi_tr> export <Tn_Bin> := <Gi_tr> c bit nu ch vit: export khng c < Tn_Bin> i km c nghi l yu cu make xut tt c cc bin hin c trong tp tin kin to hin ti, ngoi tr cc tn bin c ngn chn bi lnh unexport A19.2.3.5.3 unexport: l nh nhng ngn khng cho mt tn bin c xut ra cho cc tp tin kin to con. C Php: unexport <Tn_Bin> A19.2.3.5.4 define : Dng nh nghi cc dng lnh m chng i din bi mt tn bin v bin ny c nh nghi ring bit. C php: define <Tn> <Cc_dng_lnh > endef Th d: nh nghi mt khi lnh hay c s dng: define run-yacc yacc $(firstword $^) mv y.tab.c $@ endef Khi cn dng trong mt quy nh s gi chng hn nh : file1.c : file1.y $(run-yacc) A19.2.3.5.5 override : Vic thit k nh hng override l nhm cho ngi vit makefile c th iu chnh cc i s m ngi dng gi vo. C th p dng trong trng hp ngn ngi dng gi/gn cc gi tr khng mong mun ln cc bin khi gi lnh make. (Xem thm phn A19.2.3.2.3) Vi nh hng ny th ty theo cch gn gi tr ta c cc c php sau: override <Tn_bin> = <Gi_tr> override <Tn_bin> := <Gi_tr> override <Tn_bin> += <Gi_tr> A19.2.3.5.6 Cc nh hng iu kin (conditional) : L nh hng khin cho mt phn ca tp tin makefile c thc thi hay b qua ty theo gi tr ca cc bin. Trong th d ca phn A19.2.2 th cc dng 17,19,23,24, v 25 m t cc nh hng (dng lnh if) Th d: ifeq ($(CC),gcc) libs=$(libs_for_gcc) else libs=$(normal_libs) endif C php: <nh_Hng_iu_Kin> <Cc_dng_m ngun_nu_ng> endif <nh_Hng_iu_Kin> <Cc_dng_m ngun_nu_ng> else <Cc_dng_m ngun_nu_sai> endif <nh_Hng_iu_Kin1> <Cc_dng_m ngun_nu_ng1> else <nh_Hng_iu_Kin2> <Cc_dng_m ngun_nu_ng2> else <Cc_dng_m ngun_nu_sai>

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
endif Trong <nh_Hng_iu_Ki> thuc v mt trong cc dng ifeq <String1> <String2> (hay cn vit dng ifeq(<String1> ,< String2> ) ) Nu < String1> <String2> ifneq <String1> <String2> . Nu <String1> khng bng <String2> ifdef <Tn_Bin> Nu <Tn_Bin> c dnh nghi ifndef <Tn_Bin> Nu <Tn_Bin> cha c nh nghi Lu : <String2> y nu khng c mt s xem nh l so snh vi chi k t trng (Th d ifdef ($file2, ) ) bng

A19.2.4 Cc quy nh c bit: L cc quy nh m thnh phn ca n c th khng c mt hoc c nhiu hn 1 thnh phn ca cng loi. Bao gm A19.2.4.1 Quy nh thiu lnh v tin : Nu mt quy nh A ch c tn m khng c mt ca dng lnh v cc tin th make s tin hnh thc thi cc quy nh cha quy nh A nh l tin mt cch v iu kin. Th d: clean: FORCE rm -f *.o; touch * FORCE: y FORCE thuc vo trng hp ny v do khi gi make clean th dng lnh rm -f *.o; touch * s c thc thi m khng cn kim tra li s cp nht ca cc tp tin lin i. Quy nh vit cch ny tong ng vi ch gi .PHONY A19.2.4.2 Quy nh vi ch l tp tin trng: y lcng l mt cch trnh by khc tng t vi ch gi dng thc thi mt s lnh ci sn khi c yu cu. Khc vi ch thng thng hay ch gi, tp tin ch y l hin hu nhng ni dung ca n khng cn c quan tm v thng l tp tin c di bng 0. Mc ch ca tp tin ny l lu gi thi im cui cng m n c truy cp dng trong mch ch kim tra s ph thuc hay s cp nht ho. Dng lnh ca quy nh ny bao gm lnh touch ( ci li du thi gian (time stamp) ) Th d: Lnh sau y dng hin th tp tin m ngun no c s thay i (cp nht) mi khi gi lnh make update update: file1.c file2.c cat $? touch update A19.2.4.3 Quy nh a ch : Cch vit ny tng ng vi vit nhiu quy nh v nhng quy nh ny c chung tin v cu lnh. Hn th na, c th vn dng cc bin t ng v cc hm to thm s linh hot. Th d: Quy nh sau y s cho php trch cc dng c cha ch long ca tp tin mytext.dat vit vo trong tp tin longprint khi gi make longprint; v tng ng trch cc dng ca mytext.dat c cha ch short vo trong tp tin shortprint khi nhp lnh make shortprint longprint, shortprint : mytext.dat grep -$(subst print,,$@) mytext.dat > $@ A19.2.4.4 Quy nh dng thc (pattern rule) : m rng ni hm hay thu gn cch vit cho tn (tp tin) ch v tn tin ca quy nh ngi ta t thm mt siu k t l % . K t nu tng thch vi dy k t bt k khc trng (hy so snh vi siu k t * v, + trong dng thc ca lnh grep). Thm vo , nu k t % c mt trong tin th n phi tng ng vi k t % (nu c trong ch) Th d khi vit %o : %c $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ Th quy nh trn s ch ra cch to tp tin <tn>.o t tp tin cng tn <Tn>.c thng qua dng lnh A19.2.4.5 Quy nh dng thc tnh (static patern rule) : Cch vit ny c to ra nhm c bit x l trng hp nhiu ch v cu trc cc tn tin cho mi ch da vo tn ca ch tng ng. Phng tin ny tng qut hn l cc quy nh nhiu ch thng thng v n khng i hi cc ch phi c cng tin . Cc tn tin ch phi tng t nhau (m khng cn trng lp) C php: < Cc_ch> : <Dng_thc_ch> : < Cc_dng_thc_tin_> <Dng_lnh> Trong , <Cc_ch> l danh sch cc ch m quy nh s p dng ln. Tn cc tp ch ny c th dng k t phng nh. <Dng_thc_ch> v <Cc_dng_thc_tin_> ch ra cch thc xc nh tin cho mi ch. Mi ch s tng hp vi <Dng_thc_ch> trch ly ra mt phn ca tn ch, phn tng hp ny c gi l gc (stem). Gc s c thay vo trong mi tn <Cc_dng_thc_tin_> to ra cc tn tin . (Mi tn cho mt dng thc) Mi dng thc thng ch cha mt k t %. Khi < Dng_thc_ch> tng hp vi mt ch, th % c th ng vi b phn no ca tn ch ny. Cc tn tin cho tng ch c to (tm) ra bng cch thay th gc ln k t % trong mi dng thc tin . Trng hp mt dng thc tin khng cha k t % th khi , tin ny khng i (tn) cho mi ch. Th d: objects = file1.o file2.o all: $(objects) $(objects): %.o: %.c $(CC) -c $(CFLAGS) $< -o $@ i vi ch th nht file1.o th gc l file1 tng ng vi k t % trong %.o. Do , % s b thay bi file1 trong dng thc %.c v cu lnh s tng ng vi $(CC) -c $(CFLAGS) file1.c -o file1.o Tng t, cho ch file2.o. A19.2.5 Lu v tp tin tin : Trong cc makefile, nhiu quy nh khi cc tp tin i tng (obj) ph thuc vo mt s tp header. (th d main.c s dng def.h thng qua lnh #include). Do trong tp tin kin to s vit thnh main.o: def.h.h Quy nh ny nhm cp nht li main.o mi ln def.h thay i. Trong cc chong trnh ln cc quy nh nh vy s i hi s cn thn khi thm hay bt cc cu lnh #include. trnh tnh trng kh khn ny, cc trnh dch C thng h tr tham s -M. Chng hn nh lnh: cc -M main.c s to thnh : main.o : def.h m khng cn ngi vit makefile pi vit quy nh ra. iu ny s gim thiu cc kh khn v tp tin . A19.3 Cc Th d: Th d1 Mt trong nhng tp tin kin to phc tp nht l tp tin Makefile ca ht nhn Linux. Nh mt bi tp hy tm tt c cc ch gi ca tp tin ny (HD: Dng lnh grep trch ly ra cc dng PHONY t Makefile) T bit c cc i s no c th dng c gi t make (cc i s thng dng l mrproper, clean, dep, modules, modules_install, all) S dng dch mt ht nhn cho Linux: i vi mt m ngun ht nhn mi c th dng cch sau y cu hnh v ci t ln my theo th t:;:

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
make make make make make make mrpoper : xo sch v iu chnh li cc gi tr cu hnh mc nh menuconfig : ti cu hnh (thm bt chc nng cho ht nhn) dep : to cc mi lin h tng thuc (nhiu ht nhn nay b qua khng dng ch ny) bzImgaes (hay i khi l make compressed) to mt tp tin nh ca ht nhn modules: to ra ton b cc tp th vin v cc b iu vn cn thit cho ht nhn modules_install: ci t ln cc th mc ht nhn v c to ra vo ng ch ca n

Sau c th chp tp tin bzImage vo trong th mc khi ng (thng l /boot) v dng lnh mkinitrd to ra RAM khi ng (initial RAM disk) v cui cng to ra mt trnh n con trong tp tin cu hnh ca b ti khi ng (boot loader) thng l LiLo hay Grub. Th d2: Nh mt s khi u th d sau y trch t trang http://mrbook.org/tutorials/make/ ca Hector Urtubia Chng trnh tnh 5! bao gm tng cng 4 tp tin m ngun (well! hi nhiu cho 1 chng trnh b nh th. Nh y l th d minh ha) Ni dng main.cpp: #include <iostream.h> #include "functions.h" int main(){ print_hello(); cout << endl; cout << "The factorial of 5 is " << factorial(5) << endl; return 0; } Ni dung function.h: void print_hello(); int factorial(int n); Ni dung factorial.cpp #include "functions.h" int factorial(int n){ if(n!=1){ return(n * factorial(n-1)); } else return 1; } Ni dung hello.cpp #include <iostream.h> #include "functions.h" void print_hello(){ cout << "Hello World!"; } V ni dung Makefile: CC=g++ CFLAGS=-c -Wall LDFLAGS= SOURCES=main.cpp hello.cpp factorial.cpp OBJECTS=$(SOURCES:.cpp=.o) EXECUTABLE=hello all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $@ .cpp.o: $(CC) $(CFLAGS) $< -o $@ Th d3: Makefile kt cu vi hai chng trnh v ba tp ngun. Th d ny ly t http://www.cs.toronto.edu/~reid/csc209/02f/examples/make/make.html ca Karen Reid nm 2002. Th d c iu chnh vi chi tit so vi th d nguyn thy c th c iu chnh x l nhiu chong trnh trong Linux Ni dung ca Makefile CFLAGS = -g -Wall CC = gcc LIBS = -lm INCLUDES = OBJS = a.o b.o c.o SRCS = a.c b.c c.c prog1.c prog2.c HDRS = abc.h all: prog1 prog2 # The variable $@ has the value of the target. In this case $@ = psort prog1: prog1.o ${OBJS} ${CC} ${CFLAGS} ${INCLUDES} -o $@ prog1.o ${OBJS} ${LIBS} prog2: prog2.o ${OBJS} ${CC} ${CFLAGS} -o $@ prog2.o ${OBJS} ${LIBS} .c.o: ${CC} ${CFLAGS} ${INCLUDES} -c $< depend: makedepend ${SRCS} clean: rm *.o core *~ tar: tar cf code.tar Makefile *.c *.h testfile1 print: more Makefile $(HDRS) $(SRCS) Ni dung abc.h: void a(); void b(); void c(); Ni dung a.c: #include <stdio.h> void a() {

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

Vietsciences ; V Quang Nhn; Cc Lc Ging Chuyn Su v S Dng Vn Lnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
printf("function a\n"); } Ni dung b.c: #include <stdio.h> void a() { printf("function b\n"); } Ni dung c.c: #include <stdio.h> void a() { printf("function c\n"); } Ni dung prog1.c #include <stdio.h> #include <stdlib.h> #include "abc.h" int main() { printf("Program 1 \n"); a(); b(); c(); exit(0); } Ni dung prog2.c #include <stdio.h> #include <stdlib.h> #include "abc.h" int main() { printf("Program 2 \n"); a(); b(); c(); exit(0); }

Bi k ti: awk, rpm -- Kt lun --Cc Tham chiu http://vietsciences.free.fr , http://vietsciences.org v http://vietsciences2.free.fr Lng u

http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]

You might also like