markdown:
This action might not be possible to undo. Are you sure you want to continue?
, khoa hoc, khoahoc, tin hoc, informatique;co...
**Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux
**
Vietsciences-Làng Đậu Những bài cùng tác giả Loạt bài " Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux" của tác giả Làng Đậu giữ bản quyền 2006. Người đọc chỉ được sử dụng cho mục đích học tập hay giảng dạy cho cá nhân. Cấm mọi hình thức sao chép hay in lại nhằm mục đích mua bán hay trục lợi mà không có sự đồng ý chính thức của tác giả. Mọi thông tin về việc phổ biến rộng rãi có tính quảng bá tài liệu này cho mục đích giáo dục xin liên lạc về vo_quang_nhan@yahoo.com 25/01/2006
Bài 5: 17 Các lệnh có sẵn (buildin) trong BASH Sau đây là các lệnh của BASH đa số thừa hưởng từ Bourne. Các lệnh theo chuẩn POSIX 1003.2. Một số đã được diễn giảng trong các bài trước. Phần này chỉ trình bày những gì quan trọng và chưa được đề cập. Những lệnh ít quan trọng hơn hay dể dùng xin xem bảng phụ lục của bài 1. Các dấu ngoặc vuông [] trong các cú pháp lệnh sẽ có ý nghiã rằng các tham số trong dấu ngoặc là tuỳ chọn Lưu ý: Đối với các lệnh sẵn có của BASH, người dùng không thể dùng man <Tên_Lệnh> để đọc cách sử dụng các lệnh này mà thay vào đó là lệnh help 17.1 : Dấu hai chấm (colon) : không làm gì hết, thực thi dòng lệnh kế. Trả về giá trị 0 17.2 . <TÊN_TẬP_TIN> [Tham_Số] Lệnh dấu chấm (period) dùng để tải, đọc, và thực thi các lệnh từ trong nội dung của <TÊN_TẬP_TIN> với các tham số là [ Tham_Số] . Gía trị trả về là trạng thái thoát của mệnh lệnh cuối cùng được thực thi trong tập tin. Nếu Tập tin được tải có định nghiã các hàm, thì các hàm này có thể được gọi sau đó (Xem lại phần tải hàm số bài 4 ) nếu tên là tên riêng thì trình dịch sẽ đi tìm tên này trong các đuờng tìm kiếm chưá trong $PATH. Trường họp không tìm thấy tên tập tin này trình dịch trả về số khác 0. Như đã nói mệnh lệnh này tương đương với source ... 17.3 eval <KHỐI_LỆNH> Đây là lệnh đánh giá. Lệnh này trả về giá trị chính là giá trị trạng thái thi hành của <KHỐI_LỆNH>. Nếu không, lệnh không có thì nó trả về 0 Thí dụ: Lệnh sau đây sẽ chép nội dung của tất cả các dòng của tập tin source.txt thoả mãn dạng thức của tham số đưa vào (dược áp dụng lên lệnh grep) vào trong tập 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 [<LỆNH> [<THAM_SỐ>]] Tương tự như C/C++, exec sẽ thay thế tiến trình của mình bằng tiến trình thực thi <LỆNH>. Nếu lệnh không có mặt thì nó phải được cung ứng qua ngỏ ống dẫn truyền. 17.5 exit <n> Thoát khỏi chương trình (hay hệ vỏ đang dùng) trả về giá trị < n> cho môi trường mẹ. Nếu <n> không dung ứng thì trả về giá trị của giá trị mà lệnh cuối dùng đã thực thi liền trước đó.
Bảng Mã thoát thông dụng chuẩn Số mã thoát 0 1 2 126 127 128 128+n Ý nghiã Việc thực thi văn lệnh không có lỗi Ghi chú Đôi khi không cần thiết để trả về các giá trị lỗi thì cũng có thể dùng giá trị 0 Hiếm dùng, thường mặc định trả về giá trị 1
Các lỗi thông dụng được bắt ở giá trị Các lỗi linh tinh, such as "divide by zero" này Dùng sai lệnh của hệ vỏ Lệnh được gọi không thể thi hành "command not found" -Lệnh không tồn tại "fatal error"- Lỗi nghiêm trọng signal "n" Văn lệnh bị ngưng bởi tổ hợp phím Control-C
Quyền sử dụng có vấn đề hay lệnh là tập tin không thể thực thi (không có thuộc tính +x chẳng hạn) Có thể có vấn đề trong cài đặt $PATH hay lỗi chính tả exit chỉ chấp nhận giá trị trả về từ 0 đến 255 $? trả về tối đa 137 (128 + 9) Control-C là lỗi nghiêm trọng signal 2, (130 = 128 + 2, xem dòng bên trên) exit chỉ nhận các đối số nguyên trong khoảng từ 0 - 255
Tham số không có hiệu lực (hay sai)
255*
Trạng thái thoát ngoài mức
17.6 export [-f][-n] [<TÊN>[=<Giá_Trị>]] Dùng thể xuất một <TÊN> vào trong môi trường (biến toàn cục hay biến môi trường) để cho phép các tiến trình con truy cập. (Xem lại phần trước nói về lệnh này) Các tham số: -f cho biết đó là hàm; ngoài ra, nó sẽ là biến. Ngoài ra, <TÊN> sẽ chỉ là biến -n Hủy bỏ hiệu lực của việc xuất biến này Nếu không có <TÊN> trong lệnh export thì lệnh này sẽ là lệnh hiển thị danh sách các < TÊN> đã xuất Giá trị trả về là 0 trừ khi lệnh bị gọi sai tham số, hay <TÊN> không phải là một biến có hiệu lực, hay trong trường hợp dùng -f, mà <TÊN> không phải là một hàm
http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.04.2012 14:59:47]
Vietsciences ; Võ Quang Nhân; Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux ; science, khoa hoc, khoahoc, tin hoc, informatique;co...
17.7 getopts <Dãy_Tham_Số[:]> Đây là lệnh thoả mãn tiêu chuẩn POSIX.2 được dùng để đọc và truy nhập các giá trị của tham số truyền vào một văn lệnh. Đây là 1 công cụ tiện lợi để tiến hành truy nhập các giá trị của tham số. Trong cú pháp trên, mỗi tham số khi gọi sẽ sẽ có dạng chuẩn là - <T> [Giá_Tri]. Trong đó, <T> là tên của tham số và là một kí tự chữ hay số bất kì trong bảng kí tự ngoại trừ dấu hai chấm : và dấu hỏi ? . Mặt khác, trong khai báo thì thì mỗi tham số T trong dãy tham số nếu được viết liền sau đó bằng dấu hai chấm : thì tham số đó sẽ đòi hỏi phải có một giá trị đi kèm. Thí dụ: nếu <Dãy_Tham_Số[:]> có dạng am:bc thì văn lệnh sẽ chấp nhận các tham số gọi bên ngoài của nó là: -a, -b, -c và -m <giá_trị> Người ta thường truy nhập các tham số của văn lệnh thông qua một vòng lặp. <Dãy_Tham_Số[:]> thì tham số đó có giá trị null. Nếu văn lệnh được gọi mà không cung ứng tên tham số có trong
Chỉ số của tham số được chứa trong $OPTIND (được khởi động tăng từ 1) và giá trị của tham số tương ứng chứa trong $OPTARG Lưu ý: Tuy nhiên, đối với các tham số có khai báo giá trị đi kèm (như trong thí dụ trên là m: thì string đi kề trong các tham số nhập vào sẽ mặc nhiên xem là giá trị của tham số m) Thí dụ sau đây minh hoạ cho việc truy nhập các tham số thông qua lệnh 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] [<Tên_lệnh>] Ghi nhớ tên đầy đủ của một lệnh để sau này trình dịch sẽ tìm ra mà không cần qua biến môi trường $PATH. Các tham số thông dụng: -r lệnh cho trình dịch quên đi mọi giá trị đã ghi nhớ -d Yêu cầu trình dịch chỉ quên tên của <Tên_lệnh> -t Hiển thị lại tên đầy đủ của <Tên_lệnh> đã ghi nhớ 17.9 readonly [-apf] <Danh_Sách_Tên_Biến>] Cài các tên trong danh sách đặt tính chỉ đọc được. Cách thức này có thể dùng để định nghiã các hằng. Các tên trong danh sách có thể phân cách bởi kí tự space. Lệnh trả về 0 trừ khi một tên biến là không hợp lệ hay trong trường hợp dùng tham số -f mà tên hàm không tồn tại Thí dụ: a=1 b=2 readonly a b Các tham số thông dụng: -f Khai báo biến hằng là một hàm -a Khai báo biến hằng là một mảng -p hiển thị các biến hằng đã khai báo dùng lệnh readonly Không có tham số : Khai báo tên biến là hằng. Nội dung của nó không thay đổi được 17.10 test <Biểu_Thức> Đánh giá <Biểu_Thức> . Lệnh này hoàn toàn tương đương với biểu thức [ <Biểu_Thức> ] thường dùng trong các câu lệnh phân nhánh và vòng lặp, các phép toán (Xem lại bài 3). Các Biểu thức trong BASH có thể kết hợp nhau qua các phép toán để tạo nên biểu thức mới. Danh sách dưới đây giảm đần thứ tự ưu tiên của các phép toán: 1. 2. 3. 4. ! <Biểu_Thức> : Trả về true nếu <Biểu_Thức> có giá trị false ( <Biểu_Thức > ) : Trả về giá trị của <Biểu_Thức> <Biểu_Thức1> -a <Biểu_Thức2>: Trả về true nếu cả hai <Biểu_Thức1 > và <Biểu_Thức2> đều có giá trị true <Biểu_Thức1> -o <Biểu_Thức2> : Trả về true nếu hoặc <Biểu_Thức1> là true hoặc <Biểu_Thức1> là true
Thí dụ: lệnh sau đây sẽ kiểm tra nếu tập tin ./myfile không tồn tại thì sẽ thi hành lệnh echo "Error: ./myfile not found" và ngưng chương trình trả về giá trị 1 test -e /myfile. || (echo "Error: ./myfile not found"; exit 1) Thí dụ2: dùng tương đương với [ ] 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]
câu lệnh phân nhánh hay trong biểu thức có && || và ! Thí dụ: Lệnh sau đây khi đặt vào trong một văn lệnh sẽ làm mất hiệu lực của tổ hợp phím bấm <Ctrl>+<c> để ngừng chương trình: trap '' 2 # Ignore Control-C key stroke http://vietsciences. do let "cnt +=1" echo "loop counter: $cnt" if [ $cnt -gt 9 ]. <Danh_Sách_Tín_Hiệu> có thể cung cấp bằng các tên ngắn. không thể ngăn chận tín hiệu này được Ngưng bàn phím Đọc trong nền từ tty Viết trong nền lên tty Tín hiệu <Ctrl>+<z> Gọi từ hệ thống không đúng Tín hiệu thường dùng để gỡ lỗi.co. tên đầy đủ.d 17.kết thúc mặc định Lỗi chồng xếp (stack fault) Trạng thái tiến trình con thay đổi Tiếp tục Stop. informatique.. Các cú pháp: trap "" <Danh_Sách_Tín_Hiệu> : Bỏ qua các tín hiẹu trong danh dách trap "<KHỐI_LỆNH>" <Danh_Sách_Tín_Hiệu> : Thi hành <KHỐI_LỆNH> nếu tín hiệu bị tìm thấy trap <Danh_Sách_Tín_Hiệu>: Trả lại giá trị ban đầu cho các tín hiệu trong <Danh_Sách_Tín_Hiệu> trap : <Danh_Sách_Tín_Hiệu> : bỏ qua tín hiệu và chuyển nó vào các tiến trình con Lưu ý: dấu ngoặc kép có thể thay thế bằng dấu sắc ' trong việc đặt <KHỐI_LỆNH> vào kiểu string Các Tín hiệu Quan trọng Tên ngắn/Tên đủ của Tín hiệu 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ị bằng số 0 1 2 3 4 7 8 9 10 11 12 13 15 16 17 18 19 20 21 22 24 31 Ý nghiã Dùng để bắt các tín hiệu thoát khỏi script logout. tín hiệu này không được thực thi nếu các lệnh trả về giá trị khác 0 đó nằm bên trong vòng lặp. Tín hiệu người dùng tự định nghiã 1 Vi phạm phân đọan (segmentation violation) Tín hiệu người dùng tự định nghiã 2 Ống dẫn truyền bị gãy Kết thúc (terminate) . Ngược lại false trả về trạng thái thoát thất bại cũng không có hành động gì khác. Đa số các tín hiệu bị bẫy (trap) sẽ không còn hiệu lực (tức là bị ngăn chận) như thông thường đối với các chương trình dùng lệnh này mà chỉ có <KHỐI_LỆNH. Võ Quang Nhân.d/boot sẽ trả về giá trị /etc/init. ngừng gọi (hang up) Ngắt (interrupt) chương trình (bằng <Ctrl>+<c>) Thoát khỏi lệnh đang thi hành (bằng <Ctrl>+<\> Chỉ thị không hợp lệ (illegal instruction) Lỗi BUS Ngoại lệ Điểm chấm động (Floating point exception) Hủy bỏ (kill). Lệnh này có nhiều ứng dụng như là sử dụng trap nể "cấm" hay ngăn ngưà các thao tác hay tác nhân bên ngoài (do người dùng hay chưong trình khác) có ý định làm ngưng trệ các xử lí tối quan trọng đang xãy ra trong lúc vận hành.13 true và flase: Lệnh true trả về trạng thái thoát thành công và không làm gì khác cả.04. tin hoc.11 basename < Tên_Đường_Dẫn> Trả về tên cuối cùng trong một đường dẫn với nhiều thư mục Thí dụ: Lệnh basename /etc/init.> đưọc thi hành. hay bằng các giá trị số của tín hiệu ngăn cách nhau bởi một khoảng trống (space character).2012 14:59:47] . Tên ngắn là tên đầy đủ nhưng bỏ đi tiền tố SIG.htm[17.>" <Danh_Sách_Tín_Hiệu> Khối lệnh sẽ đuợc thực thi khi văn lệnh nhận được các tín hiệu (signal) ghi trong lệnh trap. khoa hoc.fr/thuctap_khoahoc/tinhoc/vanlenh05. Ngoài ra người ta hay dùng trap trong quá trình tìm sửa lỗi.. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux . -p Nếu tham số này có mặt trình bao sẽ hiển thị các lệnh trap tương ứng với các tín hiệu -l Yêu cầu trình bao hiển thị danh sách các tên đầy đủ của tín hiệu và giá trị tương ứng của chúng.Vietsciences . 17.12 dirname <Tên_Đường_Dẫn> Trả về phần tên của <Tên_Đường_Dẫn> đã loại trừ giá trị cuối cùng Thí dụ: Lệnh dirname /etc/init. <khối_Lệnh> thi hành sau mỗi lệnh được thực thi ngoại trừ các dòng chú thích Khối lệnh được thi hành mỗi khi một mệnh lệnh trong văn lệnh trả về giá trị khác 0. then echo "out of range" break fi done 17.14 trap [-lp] "<KHỐI_LỆNH. khoahoc.d/boot sẽ trả về giá trị boot 17.free. không thể ngăn chận hay bỏ qua tín hiệu này được. Thường được dùng trong các vòng lặp Thí dụ: cnt=0 while true . science. Tuy nhiên.
17 enable [-n] [-p] [-a] < Tên> Dùng để hoạt hoá (enable) hay ngăn trở (diable) các lệnh có sẵn của BASH.04. exit' 0 trap :2 .co.Vietsciences . lệnh umask sẽ có giá trị hiệu lực kể từ khi nó được định nghiã cho dến khi có lệnh umask mới hay kết thúc văn lệnh Thí dụ: Thí dụ sau sẽ tạo ra tập tin mylog. Các tham số bao gồm: -n dùng để ngăn trở lệnh sãn có của BASH có tên là <Tên> -p Hiển thi danh mục các lệnh sẵn có của BASH đang được hoạt hoá http://vietsciences. Võ Quang Nhân.) Các tham số: -S Nếu không có số cơ chế thì lệnh sẽ hiển thị các giá trị cài đặt hiện tại dạng kí tự -p Yêu cầu hiển thị lệnh umask hiện đang có hiệu lực. Các giá trị <số_cơ_chế> bằng số trong lệnh umask chính là giá trị bù của giá trị quyền truy cập trong cơ số bát phân.. thì lệnh này sẽ không được thực thi (vì có mức ưu tiên thấp hơn) . 17. Bình thường thì BASH sẽ thực thi lệnh sẵn có của nó và nếu có lệnh khác cùng tên.fr/thuctap_khoahoc/tinhoc/vanlenh05. nhưng mệnh lệnh sau sẽ hiển thị dòng chữ "Control-C was pressed!" mỗi khi nó bẩy được tín hiệu số 2 trap 'echo "Control-C was pressed!"' 2 # Message when Control-C pressed.txt có giá trị quyền truy cập là 755 (tức là giá trị bù của nó khi ra lệnh umask là 022) #!/bin/bash umask 022 tail -n 10 myfile > mylog.htm[17../child & sleep 1000 #!/bin/bash #child echo child started.. Ngoài ra. trap 2 command5 command6 . Tương tự như vậy. mà không được gọi bằng tên đầy đủ. Thí dụ2: Đoạn mã sau đây sẽ chỉ cách để ngăn chận việc bấm tổ hợp <Ctrl>+<c> trong một giai đoạn cần thiết nào đó và sau đó trả lại trạng thái bình thường cho chương trình trap '' 2 command1 command2 command3 . Sau khi một lệnh umask được thực thi. do sleep 1 echo -n ".. Trường hợp này thường được dùng khi trong văn lệnh có định nghiã hàm trùng tên với một lệnh nào đó của BASH hay ở bên ngoài. khoahoc./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 ]. now disabled. informatique. science. test2 sẽ tự kết thúc sau 10 giây. Nếu ra lệnh umask không có tham số đi kèm thì giá trị <số_cơ_chế> được hiển thị 17.2012 14:59:47] . exit' INT sleep 1000 17. Nội dung của tập tin test #!/bin/bash #file name: test ..16 command <Lệnh> <Tham_Số_Lệnh> Thực thi <Lệnh> <Tham_Số_Lệnh> bỏ qua các hàm có cùng tên. tin hoc. thì tất cả các tập tin tạo ra trong khi thi hành văn lệnh (chẳng hạn qua các lệnh chuyển hướng) đều sẽ phải có giá trị truy cập theo đúng giới hạn của umask.free. Lệnh này trả về giá trị 127 nếu <Lệnh> không tìm thấy hay nếu có lỗi xãy ra. # Control-C. Việc ngăn trở của một lệnh BASH sẽ cho phép một lệnh nào khác có cùng tên được thực thi mà không cần phải ghi rõ tên đầy đủ của lệnh đó (nếu nó được lưu trong thư mục có tên trong $PATH). Chỉ có những lệnh sẵn có hay các lệnh tìm thấy được trong $PATH là có thể được thi hành.. do sleep 1 " let "i += 1" echo -n "+" done echo "I exit myseft now" Thí dụ4: Truyền tín hiệu 2 (tức là tổ hợp phím bấm <Ctrl>+<c>) từ parent sang cho child xử lí #!/bin/bash #parent echo parent running trap 'echo parent exiting. " let "i +=1" done echo -e "\nAttempt to kill the child process and release signal 16 by 'kill' command:" kill -16 $pid Nội dung tập 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 ]. với giá trị này thì các tập tin được tạo ra trong văn lệnh sẽ có phép truy cập là 600 (tức là chỉ cho người tạo ra nó hay root có quyền viết/đọc tập tin. khoa hoc. pid is $$ trap 'echo child got signal 2. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux .txt Lưu ý: giá trị umask thông dụng khác là 177. # Control-C re-enabled Thí dụ3: chương trình test sau dây sẽ gọi chưong trình test2 như là một tiến trình con và sau đó 5 giây tiến trình mẹ (test) dự định hủy tiến trình con này bằng lệnh kill với tín hiệu 16 nhưng trong test2 đã có bẫy để ngăn không cho nó phép ngưng chạy bằng tín hiệu 16 này (dùng trong các trường hợp chạy chương trình con trong thời điểm nghiêm trọng không thể ngưng) .15 umask [-p] [-S] [<số_cơ_chế>] Nếu như lệnh chmod cho phép thay đổi hay xác định quyền truy cập của các tập tin thì lệnh umask ngược lại xác định giới hạn truy cập của một tập tin.
echo -n "Enter another value: " read # No variable supplied for 'read'. science. -u <fd> Ngỏ nhập lấy từ bộ mô tả tập tin <fd> Các thí dụ sau đây trích ra từ Advanced Bash-Scripting Guide # A single 'read' statement can set multiple variables. alias. được hoán chuyển theo đúng ý nghiã và đưa ra stdout Các đặc tả định dạng mà mỗi đặc tả sẽ được nhập vào từ một đối số tương ứng theo thứ tự.Vietsciences .free. tin hoc. informatique. Tất cả các biến tham số khác sẽ bị bỏ qua khi dùng cách này. khoa hoc. Các tham số quan trọng nêu được cung ứng khi dùng lệnh này là: -a <Tên_Mảng> :Các từ đọc được sẽ được gán lên các phần tử của biến kiểu có kiểu mảng <Tên_Mảng> bắt đầu từ chỉ số 0..5" $PI "Constant = \t%d\n" $DecimalConstant # Inserts tab (\t). then press <ENTER>.. -d <Kí_tự_giới_hạn> :Dùng < Kí_tự_giới_hạn> để kết thúc cho dòng nhập vào thay vì dùng kí tự đầu dòng. Write a decimal point there. var="$REPLY" echo "\"var\" = "$var"" echo "Enter a string terminated by a \\." echo "Then. ==> 1234. 17. Kí tự thoát. Nếu dùng tham số -s thì lệnh này sẽ hiển thị cách dùng của các lệnh nào có tên tương thích với <Dạng_thức> và lệnh trả về 0 trừ khi không có lệnh sẵn có nào thoả mãn <TÊN> hay <Dạng_thức> 17. Các tham số sau có ý nghiã: http://vietsciences.. <Định_Dạng> là một string bao gồm 3 loại đối tượng: Các chuỗi kí tự thông thường..htm[17. sẽ được chép thẳng ra stdout Các dãy kí tự thoát theo chuẩn ANSI C. Ngược lại.21 type [-afptP] [<Danh_Sách_Tên>] BASH chỉ ra việc sử dụng của mỗi tên trong <Danh_Sách_Tên > là thuộc loại nào trong các loại function.. therefore.2f" $PI "Pi to 5 decimal places and round off = %1. tất cả phần còn lại của dòng sẽ được gán hết lên biến cuối cùng nếu không đủ số biến trong <Danh_Sách_Biến> . %q HIển thị đối số tương tứng trong dạng mà nó có thể được dùng như là ngỏ vào của hệ vỏ Thí dụ: PI=3. dấu nghiên về \. Đặc biệt khi dùng nó thì cặp kí tự "dấu nghiên về-dấu đầu dòng" sẽ không còn giá trị như là sự nối tiếp của dòng văn bản nữa. và từ (word) đầu tiên sẽ được gán lên biến đầu tiên. và các lệnh có sẵn Trả về 0 nếu tên bất kì trong danh sách được tìm thấy. builtin. # first line \ # second line echo "var1 = $var1" echo 1234567890 > File exec 3<> File read -n 4 <&3 echo -n . Lệnh sẽ trả về 0 trừ khi gặp kí tự EOF . có thể dùng để xóa các ý nghiã đặc biệt của kí tự liền ngay sau nó và dùng để đọc dòng nối tiếp nếu đi đôi với dấu đầu dòng.. Các kí tự trong $IFS sẽ được dùng làm kí tự giới hạn. #+ Input to 'read' assigned to default variable. Close fd 3. Ngoài %% sẽ cho hiển thị dấu % %b Hiển thị string với việc chuyển dịch đối số tương ứng. Tham số này không có hiệu lực nếu lệnh read không nhập dữ liệu từ đầu cuối hay từ một ống dẫn truyền. when reading $var1. 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. hay bộ mô tả tập tin không hợp lệ khi dùng tham số -u. Tất cả các phần tử sãn có của mảng sẽ bị xoá. Các tham số có thể dùng bao gồm: -p -P -a -r : Trả về tên của tập tin trong ổ mà sẽ được thực thi :Buộc tìm trong $PATH cho mỗi tên trong <danh sách> : Trả về tất cả các nơi mà chứa tập tin khả thi có cùng tên tập tin.22 ulimit [-acdflmnpstuvSH]limit] Cho phép điều chỉnh các tài nguyên dành cho các tiến trình khởi động bởi trình bao. nếu số biến trong <Danh_Sách_Biến> nhiều hơn số từ có trong dòng đang xử lí thì các biến đi sau sẽ đưọc gán gía trị null. Võ Quang Nhân. and again press <ENTER>. Read only 4 characters.04. enter a second string. NÓ bao gồm cả hàm và alias : Không tìm tên hàm. Lệnh này hiển thị dòng văn bản được định dạng theo sự sắp xắp của người lập trình. "%b %s \n" $Msg1 $Msg2 17.67890 17.fr/thuctap_khoahoc/tinhoc/vanlenh05. Nếu <Danh_Sách_Biến> không được cung ứng thì read sẽ gán toàn bộ giá trị của dòng đọc được cho biến REPLY.. read bị hết thời hạn đợi khi đọc.2012 14:59:47] . Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux . -s : Chế độ lặng lẽ (silent mode) Nếu ngỏ vào là một đầu cuối thì các kí tự sẽ không được hiển thị lập lại -t <Thời_hạn> cung ứng thời gian tối đa và trả về lỗi nếu toàn bộ dòng nhập không đọc được trong thời hạn <Thời_hạn> giây. trả về khác không ngược lại 17. file. >&3 exec 3>&cat File exit 0 # # # # # # Write string to "File". the other variable(s) will remain unset (null). -n <n> : lệnh read sẽ ngừng đọc sau khi đọc được n kí tự thay vì đợi đến hết dòng nhập vào -r :tham số này sẽ hủy bỏ vai trò kí tự thoát của \ và dấu nghiên về nay chỉ đóng vai trò bộ phận của dòng nhập vào. hay keyword." read var1 # The "\" suppresses the newline. $REPLY.20 read [-rs] [-a <Tên_Mảng>] [-d <Kí_tự_giới_hạn>] [-n <n>] [-t <Thời_hạn>] [-u <fd>] [< Danh_Sách_Biến>] Đọc một dòng từ ngỏ vào chuẩn hay từ bộ mô tả tập tin df nếu dùng tham số -u.1415926 Dec=31373 Msg1="\tHello" Msg2="world" printf printf printf printf "PI with 2 decimal = %1. và nếu đối số có kí tự thoát theo chuẩn ANSI sang đúng ý nghiã của nó %s Hiển thị đối số tương ứng. từ thứ hai đuợc gán cho biến thứ hai . 19 printf <Định_Dạng> [<Các Đối_Số>] Đây là lệnh mô phỏng theo lệnh printf trong C. -a HIển thị danh mục các lệnh sẵn có của BASH với thông báo đính kèm lệnh nào được hoạt hoá và lệnh nào đang bị ngăn trở Khi gọi lệnh mà không cung cấp bất kì <Tên> hay tham số nào thì tương đuơng với việc dùng tham số -p Lệnh trả về 0 trừ khi <Tên> không phải là lệnh sẵn có hay có lỗi khi gọi enable. Open "File" and assign fd 3 to it. khoahoc.18 help [<TÊN>] [-s <Dạng_thức>] HIển thị các thông tin hỗ trợ về cách dùng của các lệnh sẵn có <TÊN>.co.
should be echo "value of x is $x" # Should change to echo -e "he said: \"it is echo "he said: "it is OK!"..... 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. -S :Thay đổi và báo cáo giới hạn mềm liên hệ đến một tài nguyên. và unlimited -H :Thay đổi và báo cáo giới hạn cứng liên hệ đến một tài nguyên -a :Báo cáo tất cả giới hạn hiện có -c :Độ lớn tối đa của các tập tin cốt lõi được tạo ra -d :Độ lớn tối đa của phân đoạn (segment) dữ liệu của một tiến trình -f :Độ lớn tối đa của một tập tin tạo được bởi trình bao..1.htm[17. else . Đó là các kiến thức thuộc về lí thuyết. else if .... fi hay là viết sai thành if .1 Lỗi chính tả: Đây là dạng lỗi thông thường và cũng dể chữa nhất.. việc viết mã cho một chương trình nghiêm túc thường chỉ chiếm tối đa một phần ba tổng thời gian từ khi tạo ra mà nguòn đến khi thực sự dùng nó. khoa hoc.. use: x = 1 instead 18. trong một số trường hợp một tên viết sai chính tả nhưng vẩn hợp lệ thì việc truy lỗi sẽ khó hơn nhiều. các kí tự thoát của nội dung một biến string Thí dụ: echo number 8 > $1 # should be quoted. else . soft. Chúng ta đã xem xét qua phần nội dung chính các hỗ trợ của văn lệnh BASH.... Một trong những nguyên do là có thể người gõ phím tạo lồi gõ hay do thói quen..4 Dùng cùng tên đã có sẵn từ trước. Trong thực tế... Ngoài ra.1.. Tuy nhiên.2 Lỗi văn phong: Lỗi văn phong là tất cả các dạng lỗi liên quan đến nội dung của các biến.04..3 Lỗi thiếu. do not capitalized! WHILE [ $x = 1 ]. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux . Thí dụ thay vì if . else .fr/thuctap_khoahoc/tinhoc/vanlenh05. Thí dụ : if [ "$1"="a" ]..1 Một số dạng lỗi cơ bản: Trong các phiên bản chuẩn hiện tại của BASH không cung cấp bất kì một phưong tiện đạc biệt nào để truy sửa lỗi (debug) .2012 14:59:47] . Để thay cho phần tổng kết lý thuyết. e. but is is really not OK. Một khi việc này xãy ra. Thí dụ mã VB sẽ không chiếu cố nhiều đến việc chưà khoảng trống là bao nhiêu trong biểu thức logic.fi ." OK!\". khoahoc. science.free. các biến môi trường và các lệnh chuẩn của BASH vì như vậy sẽ buộc trình dịch hoặc bắt lỗi hoặc sử dụng tên có thứ tự ưu tiên cao hơn để gọi trước (trừ khi dùng các lệnh đặc thù xử lí loại này). thường thì trình dịch sẽ có thể không phát hiện được lỗi loại này.1. tin hoc.Vietsciences . Ứng xử của chương trình sẽ còn tuỳ thuộc vào cách thiết lập mã và các giá trị của sự trùng lặp tên này ảnh hưởng như thế nào đến dữ liệu xử lí cũng như đến môi trường xử lí. elif . thừa hay dùng sai từ khoá: Các lỗi dạng này có thể xãy ra trong các câu lệnh phân nhánh. -l :Độ lớn tối đa có thể được khoá (lock) vào trong bộ nhớ -n :Độ lớn tối đa số tập tin có thể mở được -p :Độ lớn của bộ đệm kiểu ống dẫn. đơn vị dùng là một khối 512 bit -s :Độ lớn tối đa của chồng xếp -t :Độ lớn tối đa của thời gian xử lí trong CPU tính bằng giây -u :Số tối đa các tiến trình mà có thể cung ứng cho một người dùng -v :Độ lớn tối đa của bộ nhớa ảo có thể cung cấp cho một tiến trình Đơn vị sử dụng cho các báo cáo liên quan đến tập tin là 1024 byte Lệnh trả về 0 trừ khi có tham số không hợp lệ hay lỗi xãy ra khi cài đặt giới hạn mới. elif .. Thói quen này hình thành trong việc sử dụng các ngôn ngữ khác.. if 18. Võ Quang Nhân. fi thì viết thành if .. Việc việt sai thường sẽ bị trình dịch bắt lỗi ngay lập tức và thông bao lỗi thường ở dạng "syntax error" hay "command not found" hay "unexpect end of file"." 18. DONE #missing one space character between = sign #all BASH commands are in lowercase.. Một số cách thực để tiến hành quá trình này đều do người lập trình tự tạo nên hay dùng phần mềm hỗ trợ như phần bashdb Các dạng lỗi chung trong văn lệnh BASH thường bao gồm: 18. Nên tránh tối đa dùng lại các tên của các hàm. Việc đặt tên biến trùng với các từ khoá sẽ chắc chắn bị trình dịch phát hiện và báo lỗi..1. Việc gán hay dùng sai kiểu trên 1 loại biến đã định nghiã kiểu cũng thuộc loại này nhưng hay thấy nhất là việc sử dụng sai hay thiếu các dấu ngoặc... echo "number 8 > $1" myvar=$1 in mycodefile..g. chúng ta hãy tìm hiểu thêm vài chia sẽ trong quá trình truy sửa lỗi (debugging) 18 Quá trình Truy sửa lỗi trong BASH 18.co.. trong chừng mực nào đó phải nhớ rõ các biến đã được xuất thành biến toàn cục cũng như các loại http://vietsciences. các giá trị có thể là hard.. hay mã Pascal không để ý đến việc viết hoa hay viết thường. but it is really not OK. $x = 1 # Wrong! To assign. informatique. then DO ..
và như thế gây khó khăn cho việc kiểm nghiệm nếu không muốn mất thì giờ. Đối với các chương trình cở trung bình (vài trăm dòng lệnh trở lên) và lớn (từ vài ngàn dòng lệnh) thì cách tốt nhất là phải có các sơ đồ khối để phân chia chức năng và kiểm tra hoạt động của từng khối. kiểu hộp trắng. Tuỳ theo mức phức tạp. http://vietsciences. Cuối cùng. sed. kiểm dữ liệu ngẫu nhiên. thiết kế. chúng có thể không hoàn toàn có cùng ý nghiã cho mỗi lệnh. Vấn đề còn lại là tìm ra căn nguyên (root cause) của lỗi. /usr/bin. Nhưng một khi các tên đó được dùng làm tham số cho lệnh rm thì lệnh rm sẽ không thể biết được đó các thành phần ngăn cách nhau bở kí tự khoảbng trống là của 1 tên duy nhất và do đó nó sẽ tìm để xoá các thành phần này thay vì tên đúng của tập tin. các lệnh đó sẽ phát hiện ra những lỗi thô thiển như là sai cú pháp thiếu hay thừa các tham số. các đơn vị nhỏ nhất có thể là các lưu đồ logic. Trong nhiều trường hợp. Có thể kiểm thêm giá trị của $PATH để tìn ra các tên lệnh khác trong hệ thống Các tên lệnh sẵn có và các từ khoá trong BASH có thể dể dàng tìm thấy các taì liệu tham chiếu BASH Các biến môi trường có thể được hiển thị hầu hết qua lệnh env Các lệnh như hash và command có thể ảnh hưởng hay thay đổi đến thứ tự ưu tiên chuẩn của các mà BASH gọi một lệnh có trùng tên 18. Việc phải làm đầu tiên khi có một vấn đề với chương trình là: vấn đề đó phải lập lại được bởi người truy sửa. Vì Nhiều hơn thế. Để điều chỉnh có thể thư dùng sed thay vì gr ls | sed -n '/ /s/ /\\ /gp' | xargs -i rm {} 18. khoahoc. Thông thường. esac done Lệnh mycmd trên đòi hỏi tham số a phải có giá trị đi kèm. Một khi vấn đề đã được tái lập (dupplicate) và xác định là do chương trình tạo ra thì quá trình truy lỗi bắt đầu. khoa hoc.htm[17. các khối này có thể bao gồm nhiều sơ đồ khối con nhỏ hơn nhằm lo liệu các phần riềng lẽ của khối lớn.. Do đó. cần phải bàn bạc lại với ngưòi (chủ thể) đã nêu vấn đề. Thay vì vậy. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux . hay các cách thức xử lí của chương trình. biến đã khai là biến địa phương thì không nên lạm dụng sai chức năng sẽ có thể gây hậu quả khôn lường. /usr/sbin. Viết 1 chương trình cở trung bình và cở lớn thường tốn thời gian để kiến trúc và truy sữa lỗi hơn thời gian xây dựng mã nguồn rất nhiều. từ đó tìm đến dòng hay khối mã có lỗi. b) Paramb=1 echo "Paramb flag is $Paramb" .1. Đối với các lệnh hỗ trợ biểu thức chính quy mở rộng (như grep.fr/thuctap_khoahoc/tinhoc/vanlenh05.) thì người dùng nên đọc lại các siêu kí tự mà lệnh hỗ trợ.6 Viết sai cấu trúc logic của các mệnh đề: Việc viết sai logic của các mệnh đề hay trình bày sai nội dung của một mệnh đề sẽ gây ra các lỗi mà trình dịch không thể tìm ra. science. and its value is $Parama_Value" . Các lỗi này thường là do người lập trình không kiểm soát kĩ các mệnh đề logic hay dùng mệnh đề logic với quá nhiều phép toán logic nối nhau. Trong trường hợp này. vấn đề không xãy ra đối với chương trình mà là đối với việc hiểu.. cách sử dụng đúng. Người ta có thể làm một cách sai sót như sau: ls | grep ' ' | xargs -i rm {} Lý do của sự sai sót này là: Trong việc hiển thị các tên tập tin có kí tự khoảng trống thì trình dịch hiển thị các tên này rất bình thường. Cách tốt nhất để tránh lỗi loại này là đừng bao giờ dùng một mệnh đề có nhiều hơn hai phép toán logic. hay việc vận hành hợp lệ của chương trình ./mycmd -a -b #Parama flag is 1.2 Vài phương cách để truy sửa lỗi Việc truy sửa lỗi thường cần nhiều thời gian và công sức hơn là khi phát triển mã. Việc thông báo lỗi sẽ hiển thị thông qua ngỏ ra chuẩn (thường là stderr) hay trả về các giá trị khác 0. nếu người lập trình "quên" không cung ứng thì hậu qủa sẽ có thể sai Chẳng hạn. Trong trường hợp người lập trình dựng lệnh dạng script dựa trên lệnh getops thì việc gọi nó càng phải cẩn thận hơn..7 Thiết lập sai dòng điều khiển Trinh dịch không có khả năng phát hiện lỗi kiểu này.Các loại thử nghiệm này đòi hỏi người lập trình phải được trang bị hiểu biết về công nghệ phần mềm.. Có nhiều kĩ thuật khác nhau như là: Kiểm nghiệm kiểu hộp đen. so sánh lại với kiến trúc hay thiết kế của chương trình để tìm ra các khắc phục. số tổ hợp logic của bảng chân trị sẽ lên đến 8 hay hơn các trường hợp khả dĩ. . /sbin. người ta có thể dùng lưu đồ (flow chart) để kiểm tra các thuật toán.. Một dạng hiếm thấy hơn là hiểu sai về cách trình bày của mệnh đề Thí dụ để xoá tất cả các tập tin trong thư mục hiện hoạt mà nội dung tên của có có kí tự khoảng trống (space). Do đó. awk. Võ Quang Nhân..1.1. . Ngoài ra..2012 14:59:47] .. tin hoc. . cần lưu ý có trường hợp phải dùng các tham số đặc biệt để mở hay đó một chức năng nào đó của lệnh (thí dụ muốn hỗ trợ biểu thức chính quy mở rộng trong grep thì phải dùng tham số -E).. and its value is -b Để khắc phục nhược điểm này thì người lập trình có thể thêm vào mycmd một vài câu lệnh kiểm nghiệm tham số nhằm phát hiện sớm hơn ngay từ bên trong mycmd mỗi khi tham số -a thiếu giá trị 18. 18. cẩn thận trong lúc kiến trúc.co. vấn đề được mô tả càng rõ ràng chính xác và chi tiết bao nhiêu thì việc truy sửa sẽ đỡ mất thì giờ bấy nhiêu.. informatique.5 Dùng sai/lầm lẫn cú pháp lệnh: Mỗi lệnh trong Linux đều có các điều kiện về tham số và cú pháp riêng. Việc đặt tên biến tránh không bị "đụng hàng" thì khá dể dàng mà ngưòi lập trình có thể có các kĩ năng riêng để làm chuyện này. xây dựng mã.. Khi gọi. Ghi chú: Các lệnh chuẩn thường chứa trong các thư mục tên bin hay sbin như là /bin. và có biện pháp kiểm soát hay phản biện rõ ràng. Thí dụ sau đây sẽ cho thấy điều đó #!/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. kiểm tra điều kiện biên. *) echo "Usage: `basename $0`: [-a value] [-b]\n" exit 2 . Việc kiểm tra và thử nghiệm hiệu quả của một chương trình phụ thuộc vào khả năng của người (nhóm hay nhiều nhóm) tham gia.Vietsciences .free. việc xử lí toàn vẹn các dạng dữ liệu. Người truy sửa lúc này đã xác định được điều kiện và trạng thái để chương trình bị lỗi. người ta có thể chia mụch tiêu thành nhiều phân nhánh nhỏ mỗi phân nhánh xử lý 1 hay hai trường hợp Logic là tốt nhất. người viết sẽ càng thành công và ít tốn thì giờ nếu càng có kinh nghiệm. Cách tốt nhất đối với các chương trình nhỏ.04.. Việc này thuộc về cách thức kiến trúc một chương trình của người viết mã. tham số qúa hạn mức (out of range). dự định gọi lệnh mycmd với hai tham số -a và -b nhưng vì thiếu giá trị cho tham số -a nên mycmd đã hiểu "lầm" rằng "-b" là giá trị của tham số -a và tham số -b có giá trị null #.
2012 14:59:47] .2.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.. printf hay bằng đổi hướng ngỏ ra chuẩn Một trong những phương các rất hữu hiệu để truy sửa lỗi là dùng lệnh echo..2. 18. khoahoc. Ngoài ra các thông báo trả về qua stderr cùng cho biết về tình trạng sử dụng lệnh khi mắc lỗi.3: Gửi thông tin về dữ liệu hiện tại ra ngoài bằng lệnh echo. then echo "$1" >&2 # ^^^ to stderr fi } DEBUG=on Whatever=whatnot debecho $Whatever # whatnot #turn $DEBUG on. như vậy mõi khi khối mã bị thiếu từ khoá sẽ dể dàng kiểm tra lại chỗ nào thiếu. hay đổi hướng ngỏ ra chuẩn lên một tập tin log để kiểm nghiệm lại trạng thái hay giá trị của dữ liệu và biến (bằng mắt hay bằng các đọc lại thông tin trong tập tin log sau đó. done. Rocky Bernstein... Người lập trình có thể lợi dụng việc trình bày "chừa khoảng trống đầu dòng" để kiểm tra lại các khung mã. Võ Quang Nhân.4: Dùng các công cụ sẵn có trong BASH như $?. lệnh printf. khoa hoc. trong tài liệu Advanced Bash-Scripting Guide đã cung ứng một cách thức tinh tế cho phép người dùng cách thức để tạo ra một chế độ truy sửa lỗi.) sẽ khiến cho trình dịch tìm đến hết tập tin và thông báo dạng "unexpected end of file".2.) Việc dùng đổi hướng ngỏ ra lên tập tin có thể tiện lợi khi lượng thông tin quá nhiều hay việc xử lý quá nhanh hay vì lí do nào đó không tiện theo dõi trực tiếp diễn biến xử lý dữ liệu qua màn hình. theree will ehoes DEBUG= Whatever=notwhat debecho $Whatever # (Will not echo. tee Trong BASH có một số lệnh và biến có thể đưọc dùng trong công việc truy sửa lỗi đó là $?.. Chẳng hạn như sự thiếu hay sai trong việc đóng và mở các dấu ngặc cho kiểu string. ### debecho () { if [ ! -z "$DEBUG" ]. trong lệnh case) trong việc đóng các mệnh lệnh phân nhánh và vòng lặp (như là fi. by Stefano Falsetto ### ### Will echo passed parameters only if DEBUG is set to a value.04. Như vậy. tin hoc.2 : Trình bày mã theo "khung mã": Đây là phương cách hữu hiệu để thấy được các câu lệnh lồng nhau.. trap. it will not display information even the function debecho is present 18.2.1 Dựa vào thông báo của trình dịch hay của lệnh dùng: Thông báo của trình dịch là phương tiện căn bản để phân tích lỗi. then echo "change name error" else echo "change name suceed!" if tee là lệnh dùng để hiển thị nội dung của ngỏ ra chuẩn đồng thời chép các hiển thị này vào một tập tin.Vietsciences . Có nhiều trường hợp lồi cú pháp sẽ không báo cáo đúng số thứ tự dòng lệnh bị lỗi. Thiếu các từ khoá hay kí tự (như là dấu . trap. esac . Các khối mã nằm càng sâu bên trong các lệnh lồng nhau thì khoảng trống đầu dòng của nó càng lớn. science. Với cách này người ta có thể "trích ly" các thông báo ra màn hình chuẩn (hay ngược lại vào trong một tập tin) để dùng trong truy lỗi sau này Thí dụ: Để đọc lại PCI ID của các thiết bị lưu trữ đồng thời chép thông tin đó vào tập tin là mylog thì có thể dùng lệnh lspci -n | grep class 01 | tee mylog http://vietsciences. với cách trình bày này người truy lỗi có thể thấy được dể dàng các phân cấp của các lệnh lồng nhau tạo điều kiện cho việc truy sửa lỗi dể hơn nhiều Thí dụ: 18. nếu đọc lại giá trị này thì người lập trình có thể biết được là các mệnh lệnh có bị lỗi khi thi hành hay không. và tee $? Như đã biết sẽ chứa nội dung trả về của mệnh lệnh cuối cùng được thi hành. anywhere there is debecho function.) $DEBUG is off. Các phần sau đây sẽ không đề cập đến quá trình truy sửa mà chỉ chú trọng đến chi tiết các kĩ năng truy sửa lỗi khi viết văn lệnh BASH 18. Thí dụ: mv myfile1 myfile2 if [ ! $? = 0 ]. Hầu hết các lỗi cú pháp đều bị tìm thấy qua trình dịch. informatique. Các thông tin này nên được lắp đặt trên mỗi khối mã con hay ngay cả trên từng dòng lệnh (nếu cần) ở khu vực nghi ngờ lỗi bắt đầu xuất hiện.co. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux .htm[17. Các lệnh echo hiển thị các thông tin trong quá trình truy sửa chỉ hiển thị khi biến $DEBUG có giá trị on ### debecho (debug-echo).
. việc làm này sẽ tiện lợi nếu muốn đặc biệt theo dõi trạng thái nội dung của một biến nào đó qua từng dòng thi hành lệnh.. Thí dụ: Có một loại mẫu đơn form... Biến này sẽ được thay giá trị vào tùy theo biến myName được gọi trong văn lệnh fillform và viết ra thành tập tin $myName. if [ Điều kiện 2 ]. Thay vì viết dạng if [ Điều kiện1 ]. Lệnh này có thể được download từ trang http://bashdb. fi .. nhiều khi dữ liệu có lỗi được đưa tới sẽ lọt vào đúng ngay tình huống phân nhánh mà người lập trình đã bỏ qua không xử lý.2. 18.txt sẽ được "điền tên" thay thế cho từ khoá NAME... Đôi khi lỗi không thuộc về người lập trình viết mã mà là lỗi sai sót của trình dịch hay của các lệnh hệ thống đã được dùng để thực thi trong văn lệnh. then .. 18.sourceforge.2012 14:59:47] .txt 18. VAR=value trap 'echo "the value of # rest of the script #!/bin/bash ... ./$myName.04. việc xử lí trực tiếp thông qua các ống dẫn truyền có khi bất khả thi hay không đủ chức năng thì người lập trình có thể nghĩ tới việc xuất các thông tin vào trong một tập tin và xử lí tập tin đó như là một ngỏ nhập của các mệnh lệnh tiếp theo đôi khi rất hiệu quả. As your subscription to the X magazine will be expired.. Ngoài ra. fi Thì điều chỉnh thành dòng chẻ đưọc xử lí "đủ" nhằm giúp cho việc truy sửa lỗi được thuận tiện hơn if [ Điều kiện1 ]. informatique.txt VAR is $VAR"' DEBUG Mã nêu trên sẽ không hoạt động được vì dấu kí tự ' sẽ hạn chế tên biến $myName được chuyển đổi thành nội dung đúng. Thí dụ sau đây dùng mã giả. Cách hay nhất là dùng một cách viết khác (hay các lệnh khác) để cho máy thực thi cùng một thao tác có chức năng tương đương hay tương tự. Cách lập trình có tính cách "tự vệ" tốt là việc "bao thầu" hết các dòng chẻ nhánh mặc dù người ta không mong muốn phân nhánh đó sẽ xãy ra. Thí dụ: Đọan mã sau đây cho thấy cách hiển thị giá trị của các biến trước khi thoát khỏi chương trình: #!/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 thấy cách hiển thị giá trị của một biến tên là VAR trong mỗi dòng mà văn lệnh thi hành.txt Content of form..txt > . esle Xử lí lỗi bất ngờ hay lỗi nội bộ vi phạm điều kiện 2 (unexpectable error or internal error) fi . Xử lí lỗi nội bộ hay vi phạm điều kiện 1 else fi 18.fr/thuctap_khoahoc/tinhoc/vanlenh05.txt > . Để khắc phục có thể thay đổi cách viết thành sed "s/NAME/$myName/g" form. then . science../$myName.. then ..7 Dùng hỗ trợ khác: Các hỗ trợ này có thể được tung ra dạng sản phẩm bán ngoài thị trường hay tự do ở dạng giấy phép GNU..2.. Trong trường hợp này việc truy sử lỗi sẽ trở nên khó khăn hơn vì không có dòng xử lí liên quan đến trạng thái lỗi hiện tại và do đó chương trình có thể sẽ có những ứng xử bất ngờ. Người phát triển mã có thể thử dùng phương pháp loại suy bằng cách chèn các dấu ghi chú ở đầu các dòng lệnh để ngưng không cho những dòng đó được thi hành. Có thể kết hợp cách này với các lệnh echo để việc truy sửa lỗi hữu hiệu hơn.6 Dùng cách viết "đủ" cho các loại lệnh chẻ nhánh dòng điều khiển Trong các phân nhánh thường người lập trình chỉ chú ý đến dòng điều khiển mà mình quan tâm và bỏ qua không xử lí các phân nhánh còn lại..co. chẳng hạn.2.6: Thay đổi cung cách viết mã Việc tái cấu trúc lại cách viết mã cũng có thể dùng trong truy sửa lỗi nhưng việc làm này sẽ trả giá cao về thời gian. Mặc dù trường hợp như vậy hiếm khi xãy ra nhưng có khi vẩn không tránh được. Như đã đề cập trên lệnh trap có thể dùng để "bắt" các tín hiệu trong lúc truy sửa lỗi. if [ Điều kiện 2 ].... tin hoc.... khoahoc.Vietsciences .. then . Truy nhiên trong thực tế. http://vietsciences. Người lập trình có thể "thử" viết văn lệnh fillform như sau #!/bin/bash if [ "$1" = "" ]...free.then echo "missing device name" exit 1 else myName="$1" fi sed 's/NAME/$myName/g' form.. khoa hoc. Võ Quang Nhân. có một đề án hỗ trợ việc truy sửã lỗi là bashdb.htm[17. người ta có thể truy ra dòng lồi bằng cách "ghi chú hoá" phân nữa số dòng mã nếu lồi không xãy ra trong số dòng không bị ghi chú thì dòng lỗi sẽ nằm trong phần mã đã bị ghi chú và cứ thế tiếp tục theo cách phân chia nhị phân cuối cùng dòng lỗi sẽ bị phát hiện.2. Đôi khi sự hạn chế của lệnh sẽ gây ra bế tắc. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux ..txt dear NAME.net/. . Hiện tại.5: Ngắt các dòng xử lí bằng việc dùng dấu ghi chú # Trong nhiều trường hợp việc phát hiện ra dòng lệnh bị lỗi gặp khó khăn.
# ===================================================================== # # ----------------------------------------------------------------------# ################################################################# # The following is the original script written by Vernia Damiano..sh $PROCID& let "PROCID++" else echo "Limit reached. # Unfortunately. #+ one of the concurrent threads disappeared! # Not sure if this is collisions from trap signals or something else. then echo "Usage: `basename $0` number_of_processes [passed params]" exit $E_BADARGS fi NUMPROC=$1 shift # Number of concurrent process http://vietsciences. 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 ] . khoahoc.sh # Running multiple processes on an SMP box. Nếu người đọc có mong muốn xin hãy đọc thêm các tài liệu riêng của các hỗ trợ đó. # I ran it with limit = 500 and after the first few hundred iterations. Võ Quang Nhân. Thí dụ của Rocky Bernstein sau đây trích từ hồ sơ mở “Advanced Bash-Scripting Guide" # parent.co. #+ both of which must be present in the current working directory. 19. Tuy nhiên.Vietsciences . there's a brief moment while executing the #+ trap handler but before the next trap is set. .free. # This script is called by parent. # Author: Tedman Eng # This is the first of two scripts.htm[17. tin hoc. . then . science..2012 14:59:47] . # 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.fr/thuctap_khoahoc/tinhoc/vanlenh05. if [ $# -eq 0 ] # Check for at least one argument passed to script. Việc trình bày cách xử dụng thêm các công cụ bên ngoài sẽ vượt khỏi yêu cầu nội dung của loạt bài này." wait exit fi } while [ "$NUMPROC" -gt 0 ].sh # Running multiple processes on an SMP box.04. let "NUMPROC--" done while true do trap "start_thread" SIGRTMIN done exit 0 # ======== Second script follows ======== #!/bin/bash # child./child. BASH vẩn có khả năng để cho người lập trình viết trong kiểu kiến trúc này. INDICE=8 TEMPO=5 E_BADARGS=65 # Total number of process to start # Maximum sleep time per process # No arg(s) passed to script. Lập trình đa luồng (multi threading) trong BASH: Trong BASH người ta ít khi dùng nó cho mụch đích lập trình đa luồng thay vào đó là các ngôn ngữ mạnh hơn (như C/C++). khoa hoc. During this time. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux . it doesn't work properly. in the future. # No doubt someone may spot the bug and will be writing #+ .sh. it may #+ be possible to miss a trap signal. # Once the trap is received. do start_thread. informatique. # All other parameters are passed through to the processes started. thus miss spawning a child process. ################################################################# #!/bin/ bash # Must call script with at least one integer parameter #+ (number of concurrent processes).
do parti. with specified options. let "NUMPROC--" done wait trap .2012 14:59:47] . -vv: Tương tự -v nhưng cung cấp thêm những thông tin có thể hữu dụng -vvv: Tương tự -vv nhưng hiển thị. So I thought [I'd] keep running a specified number of processes and start a new one each time . So I wrote [this] bash script that can do the job. .htm[17.ids Bảng lớp các thiết bị PCI Bảng số ID của lớp các thiết bị PCI Mã (hex) 0x000000 0x000100 0x010000 0x010100 Lớp thiết bị các thiết bị PCI cũ (không tương thích với VGA) các thiết bị PCI cũ (tương thích với VGA) Bộ điều khiển SCSI bus Bộ điều khiển kho lưu trữ Ultra ATA và /proc/bus/pci http://vietsciences. Lệnh này là không thể thiếu được cho những người phát triển các phần mềm mức độ thấp có liên quan đến BUS hay các thiết bị cùng như là các chương trình chẩn khám (diagnostics). . tin hoc. using a SMP machine.. Các tham số quan trọng bao gồm: -v : thông tin được giải mã và hiển thị chi tiết thông tin này về tất cả các thiết bị.co. The "wait" instruction does not help. Ngoài ra. Võ Quang Nhân. since it waits for a given process or *all* process started in background. one of these terminates. cầu (bridge). then avvia $INDICE "${PARAMETRI[@]}" & let "INDICE--" else trap : SIGRTMIN fi } trap parti SIGRTMIN while [ "$NUMPROC" -gt 0 ].mọi thứ thông tin tìm được kể cả những thông tin có vẻ không hay ho -n : Hiển thị tên nhà sản xuất (vendor) và mã số PCI của thiết bị thay vì sử dụng bảng danh mục để chuyển thành ngôn ngữ dể hiểu -x :Hiển thị các thông tin nguyên dạng (dump) trong thập lục phân của các bộ phận tiêu chuẩn của không gian cấu hình PCI -xxx : Hiển thị các thông tin nguyên dạng (dump) trong thập lục phân của toàn bộ không gian cấu hình PCI. science. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux .SIGRTMIN exit $? : <<SCRIPT_AUTHOR_COMMENTS I had the need to run a program. -i <Tập_tin> : dùng các PCI ID thông tin trong < Tập_tin> thay vì trong /use/share/hwdata/pci. thiét bị và các liên kết giữa chúng d [<Hãng>]:[<Thiết_bị>] Chỉ Hiển thị các ID của <Thiết_bị> thuộc vè <Hãng> . using the " trap" instruction. --Vernia Damiano SCRIPT_AUTHOR_COMMENTS A17 lệnh lspci Lệnh lspci là một tiện ích (utility) dùng để hiển thị các thông tin về tất cả các PCI BUS của máy tính cũng như là tất cả các thiết bị phần cứng nối với chúng.0 và PCI Express -b : Hiển thị tất cả IRQ và các địa chỉ như là được thấy từ các bo trên PCI BUS thay vì như là được thấy bởi hạt nhân -t : Trình bày dạng sơ đồ phân nhánh bao gồm mọi BUS. 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 ] .ids -m : Hiển thị các thông tin nguyên dạng (dump) trong dạng để xử lí bằng các văn lệnh Lưu ý: Các thông tin được lspci chuyển dịch thành ngôn ngữ hiểu được đưuợc dựa trên tập tin /usr/share/hwdata/pci. khoa hoc.Vietsciences .fr/thuctap_khoahoc/tinhoc/vanlenh05. khoahoc.04.free. Các tham số có thể được dùng để xuất ra các thông tin có thể cần dùng cho các chương trình khác gọi nó.. on a number of different files. Trong một số thiệt bị đặc việt lệnh này có thể dây treo máy -xxxx : Hiển thị các thông tin nguyên dạng (dump) trong thập lục phân của không gian cấu hình PCI mở rộng (4096 byte) trên các BUS PCI-X 2. informatique. nó còn được dùng để phát hiện các thiết bị phần cứng và để tạo các chương trình tải bộ điều vận tự động trong các phương tiện khởi động được (bootalbe media) Thí dụ: lspci Trong chế độ mặc định thì lệnh này sẽ hiển thị tóm lược danh sách các thiết bị.
science.. informatique.04. 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ộ điều khiển IDE bus master (UDMA33?) Bộ điều khiển IDE bus master (ATA66?) Bộ điều khiển IDE bus master (UDMA33.. Võ Quang Nhân. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux . tin hoc.X Bộ điều khiển IEEE1284 Thiết bị mục tiêu IEEE1284 Bộ điều khiển liên tục đa cổng (multi port serial) modem tổng quát modem modem tương thích với hayes (16450 compatible serial) modem tương thích với hayes (16550 compatible serial) modem tương thích với hayes (16650 compatible serial) modem tương thích với hayes (16750 compatible serial) PCI modem 8259 PIC tổng quát ISA PIC EISA PIC Bộ điều khiển ngắt I/O APIC Bộ điều khiển ngắt I/O APIC Bộ điều khiển 8237 DMA tổng quát Bộ điều khiển ISA DMA Bộ điều khiển EISA DMA Bộ định thời hệ thống 8254 tổng quát Bộ định thời hệ thống ISA Bộ định thời hệ thống EISA Bộ điều khiển RTC tổng quát Bộ điều khiển ISA RTC http://vietsciences. ALi M1533 only) Bộ điều khiển FDD (viết tắt từ Floppy Disk Device: thiết bị đọc ổ mềm) Bộ điều khiển IPI bus Bộ điều khiển kho lưu trữ Ultra ATA (RAID) Bộ điều khiển kho lưu trữ Ultra ATA (RAID) Bộ điều hợp ethernet Bộ điều khiển token ring Bộ điều khiển FDDI Bộ điều khiển ATM Bộ điều khiển ISDN Bộ điều khiển mạng kiểu khác Bộ điều khiển tương thích với VGA Bộ điều khiển tương thích với 8514 Bộ điều khiển XGA Bộ điều khiển 3D Bộ điều khiển hiển thị kiểu khác Thiết bị video Thiết bị audio Thiết bị điện htoại máy tính Thiết bị đa phưong tiện khác Bộ điều khiển RAM Bộ điều khiển flash ROM Bộ điều khiển bộ nhớ khác Cầu (bridge) CPU tới PCI Cầu PCI sang ISA Cầu PCI sang EISA Cầu micro channel Cầu PCI sang AGP Cầu PCI sang PCI (hỗ trợ giải mã hiệu chỉnh (subtractive decode)) Cầu PCI sang PCMCIA Cầu Nu Bus Bộ điều khiển Cardbus PCMCIA Cầu RACEWay (cơ chế transparent) Cầu RACEWay (cơ chế endpoint) Bộ điều khiển quản lý năng lượng Bộ điều khiển liên tục tương thích với XT tổng quát Bộ điều khiển liên tục tương thích với 16450 Bộ điều khiển liên tục tương thích với 16550 Bộ điều khiển liên tục tương thích với 16650 Bộ điều khiển liên tục tương thích với 16750 Bộ điều khiển liên tục tương thích với 16850 Bộ điều khiển liên tục tương thích với 16950 Bộ điều khiển cổng song song Bộ điều khiển cổng song song hai chiều Bộ điều khiển cổng song song thoả mãn chuẩn CP 1. khoahoc.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.htm[17.Vietsciences .2012 14:59:47] . khoa hoc.co.
0 System peripheral: Compaq Computer Corporation Advanced System Management Controller 0000:00:03. 0000:01:02. Hoạt động của lệnh make gắn chặt và phụ thuộc vào một tập tin đặc biệt. 0000:00:02.0 Class 0100: 9005:00c0 (rev 01) 0000:00:0f.3 (rev 10) 0000:01:1e.0 SCSI storage controller: Adaptec AHA-3960D / AIC-7899A U160/m (rev 01) 0000:00:0f.0 Host bridge: ServerWorks CIOB30 (rev 03) .0 SCSI storage controller: Adaptec AHA-3960D / AIC-7899A U160/m (rev 01) .fr/thuctap_khoahoc/tinhoc/vanlenh05.1 IDE interface: ServerWorks CSB5 IDE Controller (rev 93) 0000:00:0f.LINK(IEEE 1394) ACCESS.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..2 0000:00:0f. Tập tin này chứa các chỉ thị và các mô tả cho make hoạt động. 0000:00:02. informatique. Lệnh này rất hữu dụng đối với việc kiến trúc. Thao tác tác động của lệnh make nhằm cập nhật hoá một hay nhiều đối tượng được gọi là kiến tạo Vì khối lượng thông tin rất lớn. A19 Tìm hiểu về tập tin kiến tạo (makefile) và lệnh make make là một lệnh đặc biệt của Linux/UNIX thường được dùng để hỗ trợ việc chuyển dịch cập nhật hóa phần mềm từ mã nguồn (mà thường là C/C++) ra một chương trình hay phần mềm ứng dụng.1 Lệnh make lspci -n 0000:00:00. science....0 . phần này chỉ trình bày những kiến thực thực tế nhất thường được dùng để tạo các tập tin kiến tạo A19.0 Class 0600: 1166:0011 (rev 22) . 0000:01:02.htm[17.0 Class 0100: 9005:00c0 (rev 01) .0 PCI Hot-plug controller: Compaq Computer Corporation PCI Hotplug Controller (rev 14) 0000:0d:01. 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ộ điều khiển PCI cắm nóng tổng quát Thiết bị ngoại vi (peripheral) hệ thống khác Bộ điều khiển bàn phím thiết bị số hoá (viết) Bộ điều khiển chuột Bộ điều khiển máy quét (scanner) Bộ điều khiển cổng chơi Bộ điều khiển cổng chơi kiểu cũ (legacy) Thiết bị nhập khác Thiết bị bệ gắn (docking station) tổng quát Thiết bị bệ gắn khác 386 486 Pentium Alpha chip PowerPC MIPS Bộ đồng xử lý (Co-processor) Bộ điều khiển chủ IEEE1394 (firewire) Bộ điều khiển chủ OHCI i.Vietsciences ...0 Class 0200: 8086:1229 (rev 08) 0000:00:05...04. Võ Quang Nhân. khoahoc. tin hoc...0 Ethernet controller: Intel Corporation 82557/8/9 [Ethernet Pro 100] (rev 08) 0000:00:05.0 VGA compatible controller: ATI Technologies Inc Rage XL (rev 27) 0000:00:04.1 0000:00:0f. khoa hoc.. phân phối.2 USB Controller: ServerWorks OSB4/CSB5 OHCI USB Controller (rev 05) 0000:00:0f.0 ISA bridge: ServerWorks CSB5 South Bridge (rev 93) 0000:00:0f.3 Host bridge: ServerWorks CSB5 LPC bridge 0000:00:10.2012 14:59:47] . và tổ chức dịch các tập tin mã nguồn cho phù hợp. http://vietsciences.0 Host bridge: ServerWorks CMIC-HE (rev 22) .0 0000:00:0f.co..3 0000:00:10..free..0 Class 0880: 0e11:a0f0 0000:00:03. Nó được gọi là tập tin kiến tạo (makefile).0 Class 0804: 0e11:a0f7 (rev 14) 0000:0d:01.0 Class 0300: 1002:4752 (rev 27) 0000:00:04. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux .bus SSA Bộ điều khiển chủ mở PCI sang USB Bộ điều khiển chủ mở PCI sang USB Bộ điều khiển chủ USB khác Thiết bị USB (không phải là bộ điều khiển chủ ) Kênh quang (fibre channel) Bộ điều khiển quản lý năng lượng Bộ điều khiển tương thích với IrDA Bộ điều khiển IR tiêu tán Bộ điều khiển RF controller Bộ điều khiển không dây khác Bộ điều khiển I/O thông minh Bộ điều khiển liên lạc vệ tinh TV Bộ điều khiển liên lạc vệ tinh audio Bộ điều khiển liên lạc vệ tinh voice Bộ điều khiển liên lạc vệ tinh dữ liệu Bộ điều khiển mã/ giải mã máy tính hay mạng Bộ điều khiển mã/giải mã giải trí Bộ điều khiển mã/giải mã khác Bộ điều khiển DSP module DIPO Bộ điều khiển DSP khác Lớp không xác định Thí dụ: Bảng trên có thể gúp tìm hiẻu về PCI -ID của 1 máy cụ thể lspci 0000:00:00.0 Network controller: Compaq Computer Corporation Compaq Netelligent 10 T PCI UTP TLAN 2.
-p: Hiển thị thêm các luật lệ và các biến khi thực thi -q : (q là viết tắt của question) không thực thi chỉ kiểm tra xem tất cả đều đã cập nhật hay không trả về giá trị 0 nếu mọi thứ đều đã cập nhật. Tuy nhiên trong thực tế các makefile sẽ không có các con số dòng này 1 2 3 #This is the remarked line #file name : Myporgram #Name: ABC http://vietsciences.free.2012 14:59:47] .2. Các định hướng (directive) : Là các lệnh yều cầu make thực thi một thao tác đặc biệt trong khi make đọc tập tin kiến tạo.Vietsciences . Các lệnh thi hành: Đây là một bộ phận của một đích. Nó cũng liệt kê các tập tin mà các đích phụ thuộc vào.c Khi đứng trong thư mục có chứa Makefile này và gõ lệnh make thì các thao tác sau đây sẽ tự động thực thi: $ make echo 'char *builddate="' `date` '"' >>file2.co.2 Các thành tố của một tập tin kiến tạo Một tập tin kiến tạo có thể bao gồm các thành tố sau đây: Các quy định (rule) hay còn gọi là các hiển quy (explicit rule) : cho phép khi nào và cách nào để tạo ra hay tái tạo lại một hay nhiều tập tin. Đồng thời xóa các mặc định về phần đuôi của các quy định về phần đuôi -s: Không hiển thị các dòng lệnh -t: Chỉ đánh dấu các tập tin như đã cập nhật nhưng không thực sự kiến tạo chúng (viết tắt từ chữ "touch") --warn-underfined-variables Hiển thị cảnh báo (warning) nếu macro được sử dụng mà không được định nghiã trước -C <Thư_Mục> chuyển sang <Thư_Mục> trước khi bắt đầu các vận hành của make -I <Thư_Mục> Bao gồm thêm <Thư_Mục> trong danh sách các thư mục chứa các tập tin bao gồm (included file) Giá trị trả về của lệnh make: make chỉ trả về một trong 3 giá trị 0 : Lệnh hoàn tất không lỗi 1: Giá trị này xãy ra nếu dùng tham số '-q' và make tìm thấy một số đích chưa được cập nhật 2 Nếu make tìm thấy lồi trong khi thi hành và sẽ hiển thị thông báo lỗi A 19. science...76 nó được "trông coi" bởi Paul D. Nếu không trả lời khác 0 -r: Hủy bỏ hiệu lực của các quy định ngầm. Sau đó. Đa số các trường hợp thì tập tin kiến tạo sẽ chỉ dẫn cho lệnh make làm thế nào để dịch và liên kết một chương trình.o file2. Theo văn bản hướng dẫn của GNU. khoahoc. Mỗi dòng lệnh này phải được bắt đầu bằng một kí tự nhảy bước (tab). informatique. sau đó là các lệnh. make là một tiện ích có khả năng tự xác định xem những phần nào của một chương trình cần được dịch (hay dịch lại) và từ đó đưa ra các mệnh lệnh để chuyển dịch chúng. và thứ tư theo thứ tự là lệnh make tự gọi trình biên dịch cc để dịch các tập tin file1.o file2.make sẽ bỏ qua Dòng thứ nhì là lệnh chèn biến con trỏ *builddate với giá trị ban đầu là thông tin xuất ra từ lệnh date vào dòng cuối của tập tin file2.c cc -c -o file1.o -o program Dòng đầu là dòng bị chú -. Các tập tin này gọi là các tập tin đích (hay ngắn gọn là đích ).c: echo 'char *builddate="' `date` '".c và file2.htm[17. Smith. khoa hoc.2 Tập tin kiến tạo: A19. nhưng vẩn tiếp tục làm việc với các đối tượng khác không liên quan (tới đối tượng bị hỏng) (k viết tắt từ chữ "keep going") -n hay --dryrun : Hiển thị các lệnh nhưng không thi hành dùng trong thử nghiệm (n có nghiã là "no operation") -o <Tập_Tin> : không tái tạo <Tập_Tin> ngay cả khi nó cũ hơn các tập tin mà nó phụ thuộc vào. Hệ vỏ sẽ có toàn quyền để thực thi các lệnh đó.c . Nếu không có tham số đặc biệt.fr/thuctap_khoahoc/tinhoc/vanlenh05. Ngoài ra. phiên bản GNU make được phát triển bởi Richard Stallman và Roland McGrath. Tên của tập tin kiến tạo này trong chế độ mặc định phải là Makefile Cú pháp: make [<tham_số>] [<Đối_Tượng>] [<Định_Nghiã_macro>] Các tham số cho sẵn quan trọng: -d : hiển thị chi tiết các thông tin truy sửa lỗi -f <Tập_Tin> : dùng < Tập_Tin> làm tập tin kiến tạo thay vì mặc định -i: Bỏ qua các lỗi trả về (chữ i là viết tắt của "ignore") và cố gắng tiếp tục thi hành lệnh make nếu có thể -k: Bỏ đối tược hiện tại nếu qúa trình cập nhật thất bại.o file1. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux . Các thao tác bao gồm: Đọc một tập tin kiến tạo khác Quyết định (dựa vào giá trị của các biến) xem khi nào bỏ qua hay khi nào dùng đến một bộ phận của tập tin kiến tạo Xác định biến trực tiếp từ một chuỗi kí tự có nhiều dòng Bộ phận quan trọng nhất của các định hướng là các điều kiện (conditional) : Cung cấp sự phân nhánh cho dòng điều khiển cho lệnh make từ các tập tin kiến tạo. Các quy định ngầm (implicit rule) : Cho phép khi nào và cách nào để tái tạo một lớp các tập tin dựa trên tên của chúng. kể từ phiên bản 3. các tập tin đó gọi là các tiền đề. trong nó cũng có thể có các lệnh đùng để tạo ra hay cập nhật các đích. tin hoc. các dòng dược đánh số.' >file2.04. Nó cũng hướng dẫn cho make làm cách nào để chạy các lệnh bổ trợ (như là các thao tác để xoác một số tập tin thưà sau khi dịch xong chẳng hạn). Nó mô tả cách thức để một đích có thể phụ phụ vào một tập tin khi mà tên của tập tin này tương tự với đích (chẳng hạn chỉ khác nhau phần tên mở rộng) cũng như là cung cấp các lệnh để tạo ra hay cập nhật các đích này.o file2. Võ Quang Nhân. Đa số trường hợp make được dùng cho C/C++ nhưng nó không bị giới hạn bởi ngôn ngữ lập trình mà còn có thể hỗ trợ bất kì thao tác nào trong đó có các tập tin của thao tác này cần được cập nhật tự động khi có sự thay đổi từ các đối tượng xác định trước. Các định nghiã biến: là các dòng để khai báo biến Các dòng bị chú: Các dòng hay chuỗi kí tự bắt đầu bằng dấu # là dòng bi chú. Thi dụ: tập tin Makefile sau đây sẽ cho phép dịch thành một chương trình đơn giản với tên tập tin thực thi là program: #content of file Makefile program: file1.2.c cc -c -o file2. thì lệnh make sẽ tìm và đọc tập tin kiến tạo ngay tại thư mục hiện hoạt.c cc file1. Dòng thứ ba. Các lệnh này được make xem như là lệnh hệ thống và sẽ gửi ra hệ vỏ để thi hành.c rồi liên kết chúng với nhau thành tập tin khả thi program (trong dòng cuối) Lưu ý: trong thí dụ trên bắt buộc lệnh echo phải được chừa lề bằng một kí tự <tab> duy nhất A19.o file2.1 Khái niệm Lệnh make cần và hoàn toàn phụ thuộc vào các thao tác được dẫn ra trong tập tin kiến tạo của nó. Thí dụ: để tiện theo dõi thí dụ này.
obj RM = /bin/rm -f # Configuration: INCLUDES= -I.3.8. Các tên nằm sau dấu hai chấm là các tập tin mà các đối tượng đó phụ thuộc vào (phải có để trình dịch hay lệnh make có thể hoạt động đúng) Các dòng tiếp theo là dòng lệnh sẽ được gửi ra hệ vỏ để thực thi. Ngoài các tham số cho sẵn.c # rule for "file2. =. số và dấu gạch dưới (underscore) đồng thời tránh dùng chữ viết hoa (các biến viết hoa thường được dùng trong các quy định ngầm -.o".. chuồi này gọi là giá trị của biến. file2. chúng ta chỉ tóm tắt ngắn gọn những yếu tố thiết yếu để có thể bắt đầu viết một tập tin kiến tạo.o". 20.14.obj io. Quy định về tên biến: Tên biến có thể là chuỗi kí từ bất kì miễn là không chứa các kí tự :. 18.c file1. Nghiã là giá trị của biến có thể được trung chuyển thông qua các tên biến gán bởi dấu =. Tên của một biến có thể xuất hiện ở mọi nơi mọi thành phần của một makefile và sẽ được thay bằng giá trị của nó khi thực thi. clean : Xóa tất cả các tập tin mà thường chúng được làm ra từ việc thi hành lệnh make install : Chép các tập tin khả thi vào trong các thư mục đúng chỗ của nó (nơi mà người dùng thường tìm tới các lệnh) đồng thời chép các tập phụ trợ vào các thư mục mà mà các chương trình tạo được ra bởi make sẽ tìm tới chúng. hay là không thể bắt đầu hay kết thúc bằng các kí tự khoảng trắng (whitespace). Tóm lại cú pháp gọi lênh make là: make [<Tham_số>] [<Các_Đích>] Thí dụ Giả sử một makefile tên là "myMakefile" có hỗ trợ hai dích là clean và all.c file1.6. 13.2.h $(CC) $(CFLAGS) -c main.c # rule for "file1.3 Thực thi một lệnh make: Việc thực thi lệnh make sẽ tùy theo các cài đặt có trong tập tin kiến tạo. khoahoc./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.co.o: main.fr/thuctap_khoahoc/tinhoc/vanlenh05.24. Tài liệu đặc tả về lệnh make có khuyên rằng nên đạt tên biến chỉ dùng các kí tự chữ.h $(CC) $(CFLAGS) -c file2.h Với cách gán giá trị này thì tên biến có thể được khai triển hồi quy.1 Biến. là các dòng khai báo biến và/hay định nghiã giá trị của chúng Các dòng bắt đầu bằng dấu # là dòng bị chú make sẽ bỏ qua A19. giá trị biến và các hàm hỗ trợ Biến hay con gọi là macro trong lệnh make được hiểu như là một tên thay thế cho một chuỗi kí tự. Thi dụ: one = $(two) http://vietsciences.19..h file2.o: file1.1 Gán gía trị cho biến: = Thí dụ: SOURCE = main. khoa hoc. 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.org/software/make/manual/make. Thì nó có thể được gọi bằng cách make -f myMakefile clean all A19.2. 41-42.nếu dùng trùng tên có thể tạo ra các hiệu ứng cuỡng trị (override) lên các biến của quy định ngầm) Để biểu thị giá trị của biến X thì có thể viết là ${X} hay $(X) A19. vì khối lượng thông tin khổng lồ. cách đơn giản nhất là thử nhập lệnh make không cần tham số. và 25 là các định hướng điều kiện (conditional directive) Các dòng 5. Các dòng 17.htm[17. main. science. Phần đào sâu thêm sẽ đòi hỏi các bạn đọc xem thêm tài liệu tham khảo chính của GNU về make tại trang WEB hhttp://www. Võ Quang Nhân..Nội dung của biến có thể là bất kì có thể tên cuả một tập tin hay nhiều tập tin hay có thể chỉ là một phần của các tham số .1.2012 14:59:47] .html A19.c # rule for cleaning re-compilable files: "make clean" clean: $(RM) $(PROG) $(OBJS) Trong thí dụ trên thì: các cặp dòng 33-34.c main.04.. các tập tin kiến tạo có thể cung ứng nhiều đối số khác nhau tùy theo đích và các đích nhằm tạo ra dđ^'i số cho lệnh make này gọi là đích giả (phony target) (hay ngắn gọn là đích nếu không sợ bị nhầm lẫn). Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux .h $(CC) $(CFLAGS) -c file1.11.gnu.23.3 Viết một tập tin kiến tạo Phần này sẽ hướng dẫn sơ lược cách tạo ra một tập tin kiến tạo.3.o: file2.Vietsciences .2.free. file1.h file1. những đối số chuẩn hay được dùng là: (xem thêm đích giả ) all : tạo ra tất cả các đích ở mức cao nhất mà tập tin kiến tiến có thể làm được.. Tuy nhiên.c file1. Tuy nhiên.. 21 . #. informatique. check hay test : Tiến hành các thử nghiệm (như là kiểm tra các điều kiện vận hành) lên chương trình mà makefile sẽ tạo ra..c file2.o". 37-38. và 45-46 là các quy định mà Dòng đầu khai báo tên của các đối tượng nằm trong quy định. tin hoc.2. Các đích giả này sẽ được định nghiã từ bên trong các tập tin kiến tạo (xem thêm phần đích ) Dù sao.
htm[17.%<Từ_thay_thế>.o giá trị của OBJS sẽ là main. ${<Tên_biến>:<phần_muốn_bỏ>=<phần_thay_vào>} hay $(<Tên_biến>:<phần_muốn_bỏ>=<phần_thay_vào>) Các khai báo này sẽ cho phép dựng biến mới với nội dung tương tự như các biến đã có mà chỉ đổi phần tiếp vỹ ngữ.o. Điều này khác tiện lợi cho việc khai báo biến mới với nội dung chỉ khác phần mở rộng tên các tập tin Thí dụ: file1 := a.từ trong lệnh make là một chuỗi kí tự trong dòng văn bản con được ngăn cách với từ khác bởi các kí tự trắng -.c. Đó là : kí tự % sẽ cho phép ứng hợp với mọi loại kí tự theo sau có độ dài từ 1 kí tự trở lên (cho đến kết thúc từ đang được cứu xét) (gần tương tự như siêu kí tự * trong BASH nhưng siêu kí tự * không bị gới hạn trong biên giới của 1 từ).h mydat. dấu kí tự trắng và các dấu ngoặc sẽ không được có mặt trong nội dung dòng văn bản cũng như nội dung các tham số của hàm.dat mydat.2.h -o file1 $(filter-out <Các_dạng thức>.2 Các hàm và phép toán hỗ trợ thay đổi nội dụng biến: A19. Cú Pháp: $(patsubst <Dạng_thức>. Lưu ý: Các dấu phẩy.$(file1)) # file2 is now `a. dạng thức ở đây chỉ giới hạn trong một từ (word) -.c bằng cách viết objs= $(source:.c=.o file1. Các gán đơn giản này sẽ có mặt úng dụng riêng trình bày ở phần sau.s file1: $(sources) cc $(filter %..o và hàm này cho ra giá trị x.h.c thành từ đó nhưng kết thúc là .co.c.2 Các hàm giúp truy cập giá trị của biến: make hỗ trợ một số hàm nhằm thay đổi các giá trị của dòng văn bản.c def. Thí dụ: có biến source= main.$(<Tên_Biến>)).2012 14:59:47] .c file1.3.o b.c c.<Dòng_văn_bản>) Thí dụ: $(subst a.2.<Từ_thay_thế>.<Từ_thay_thế>. hàm này sẽ chỉ trả về phần còn lại của dòng văn bản sau khi đã loại bỏ các từ nào tương hợp với các dạng thức $(sort <Dòng_văn_bản>) Xếp thứ tự theo lối từ điển và xoá các từ trùng lặp trong <Dòng_văn_bản> Thí du: $(sort file1 file2 main file1) http://vietsciences.%.$(comma).fr/thuctap_khoahoc/tinhoc/vanlenh05.o Cách gán giá trị này sẽ không cho phép khai triển hồi quy.04.<Dòng_văn_bản>) ngược lại với hàm filter.c OBJS += file2.<Dòng_văn_bản> Lưu ý: Khác với các dạng thúc trong BASH. khoa hoc. Hoàn toàn tương đương với cách viết objs= $(patsubst %c. đây là ứng dụng dạng viết ngắn của hàm patsubstr (xem phần sau) A19. hay nội dung của biến.1.2.free.c) sẽ thay các từ kết thúc bởi .3.c def.o c. $(source)) $(strip string) Hàm này sẽ xoá tất cả các kí tự trống giữa các từ trong string và thay bằng một kí tự trống duy nhất nằm giữa các từ đó.c file2.c file2.<phần_thay_vào>.1 Phép toán += Sẽ cho phép nối thêm vào nội dụng sẵn có của biến một giá trị trống (space) và giá trị mới gán vào Thí dụ: OBJS = main. science.o file1.3.o file2 := $(file1:. $(findstring <Giá_trị>. Ở đây các dạng thức được viết ngăn cách nhau bằng một kí tự trống Thí du: Trong một tập tin kiến tạo có ba dòng source := file1.o=.b.c Bị chú: Thực ra. Cú Pháp: $(subst <phần_đục_bỏ>.a b c) sẽ trả về giá trị a.o file1.o A19.Vietsciences . Thí dụ: define two-lines echo file1 echo $(file2) endef Khi thực thi (gửi ra hệ vỏ) thì sẽ tương đương với hai lệnh thi hành liền nhau (tức là echo file1.b c) sẽ trả về giá trị '' (chuỗi kí tự trống) $(filter <Các_dạng_thức>. %o.make chỉ hỗ trợ một siêu ki tự. two = $(three) three = "ABC" Khi đó.c thì có thể nhận về tên các tập tin đối tượng .c'. $(<Tên_biến>:<Tiếp_vỹ_ngữ>=<Từ_thay_thế>) sẽ tương đương với $(patsubst %<Tiếp_vỹ_ngữ>. giá trị của biến three sẽ được chuyển dịch sang cho biến one tức là nó sẽ có giá trị là ABC := Thí dụ: OBJS = main. <Dòng_văn_bản>) xoá tất cả các từ không tương hợp với < Các_dạng_thức> và chỉ trả về phần còn lại tương hợp với <Các_dạng_thức> trong dòng văn bản.$(<Tên_biến>)).x.c) sẽ cho ra biến file2 với nội dung là a. Võ Quang Nhân.2.o.2.the hat on the cat) sẽ đổi dòng the hat on the cat thành dòng the hCCt on the cCCt patsubst sẽ tìm và thay thế các từ thoả mãn một dạng thức bằng từ mới trong dòng văn bản cho sẵn. Thường được dùng để gán các chuỗi mệnh lệnh vào giá trị của một biến. Thí dụ $(findstring a.c file2.<Dòng_văn_bản>) : Tìm < Giá_trị> trong <Dòng_văn_bản> .c %. Thí dụ: $(patsubst %. Dùng định hướng define <Các_dòng_kí_tự> endef Cách này cho phép gán nội dung của nhiều dòng chữ <Các_dòng_kí_tự> lên một biến. tin hoc. trong khi $(findstring a.c file2.$(source)) -o file1 dòng lệnh thứ ba sẽ có giá trị là cc file1. empty:= space:= $(empty) $(empty) file1:= a b c file2:= $(subst $(space). Các dạng viết tắt của hàm patsubst bao gồm $(<Tên_biến>:<Dạng_thức>=<Từ_thay_thế>) sẽ tương đương với $(patsubstr <Dạng_thức>.2. Nói cách khác gán giá trị kiểu này là chỉ cho phép b>khai triển đơn giản. khoahoc.2.c. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux . informatique. echo ${file2} ) Lưu ý: khi dùng cách này để định nghiã thì các dấu kí tự đặc biệt như là kí tự $ các dấu ngoặc và tên các biến đều trở thành thành phần của giá trị biến được định nghiã bởi định hướng define.CC. Các hàm hỗ trợ quan trọng bao gồm: subst hàm này cho phép thay thế một bộ phận của dòng kí tự bởi bộ phận thay thế. Để vượt qua chướng ngại này thì có thể viết gián tiếp Thí dụ: comma:= .o file2.o file2.o).c b..
CPPFLAGS : Biến thêm vào để dùng với chương trình tiền xử lý C và các chương trình dùng tới nó (như là trình dịch C và Fortran). <Các_tên >) Thêm <Tiếp_đầu_ngữ> vào trong <Các_tên> Thí du: $(addprefix /usr/src/.3 Các hàm thông dụng khác có tác động lên biến bao gồm: $(if condition.2. CXXFLAGS : Biến thêm vào để dùng với trình dịch C++ . Trong trường hợp này. Thí dụ: $(notdir src/file1.c mydat.c test) sẽ trả về giá trị file1. COFLAGS : Biến thêm vào để dùng với trình RCS co program.. hàm trả về các tên nhưng cắt bỏ phần tên thư mục chứa giá trị cuối của từ..co.2. và $(wildcard d/*).3 Cưỡng trị (override) và kháng cưỡng trị của biến khi gọi lệnh make Giả sử có biến X đã được gán giá trị trong tập kiến tạo là Makefile.text) : khai triển đối số list.<Các_tên>) : Thêm <Tiếp_vỹ_ngữ> vào <Các_tên> Thí dụ: $(addsuffix ..$(wildcard $(dir)/*)) Sẽ cho kết quả nội dung của biến file lần lượt là $(wildcard a/*).2. FFLAGS Biến thêm vào để dùng với trình dịch Fortran.b) kết quả là file1 = b a $(shell <Lệnh> Hàm này sẽ tiến hành thực thi <Lệnh> thông qua hệ vỏ và hiển thị ngỏ ra sau khi thư thi sẽ được trả về Thí du: contents := $(shell cat file1) A19. Make chỉ hỗ trợ một số tham biến được phép cưỡng trị hầu hết là để dùng với các tham số của các lệnh trình dịch (hường thấy nhất là biến CFLAGS ). Thí dụ1: dirs := a b c d files := $(foreach dir. LDFLAGS Biến thêm vào để dùng với trình dịch mà nó hỗ trợ gọi bộ liên kết (linker) `ld'. $(LINK_HEADERS). $(wildcard b/*).04. tham số X sẽ được cài đặt giá trị ban đầu mới (<giá_trị>) thay vì giá trị khởi động sẵn có trong Makefile. PFLAGS Biến thêm vào để dùng với trình dịch Pascal. Mệnh đề for trên sẽ tương đương với việc gán files := $(wildcard a/* b/* c/* d/*) Thí dụ2: LINK_HEDERS := $(for header.htm[17.. ở một số dòng cụ thể nào đó của Makefile.. Sau đó nó sê tiến hành khai triển giá trị của biến <Tên_biến>.c file2. Thí dụ trong một Makefile ta đã định nghiã CFLAGS = -g để dùng trong lệnh cc -c $(CFLAGS) file1.a. tin hoc. LINTFLAGS Biến thêm vào để dùng với trình lint. $2.c /home/myname/file2. . Biến X trong thao tác này được gọi là bị cưỡng trị.3.c) cho kết quả là tất cả các tên có phần mở rộng là . $(wildcard <Dạng_thức>) Dùng để gán giá trị cho biến các tên tập tin nhưng dùng kí tự phỏng định Thí dụ: OBJS= $(wildcard *. vào thành giá trị của các biến tham số mặc định $1. $(suffix <Các_tên>) Chỉ trả về các tiếp vỹ ngữ của <Các_tên> mà bắt đầu bằng dấu chấm (tương ứng với phần tên mở rộng của các tập tin) Thí dụ: $(suffix file1.c . LFLAGS Biến thêm vào để dùng với trình Lex.c. $(wildcard c/*).c mydata. sau đó lần lượt gán lên var các giá trị của mỗi từ có trong list theo thứ tự và thực thi text.<Tham_Số2>.c test .file1 file2) trả về file1.3. nếu <Tên_biến> có nội dung chứa đựng các giá trị biến $1.dat) trả về . hàm này trả về tất cả ngoại trừ phần tên mở rộng (tức là phần cuối của tên bắt đầu từ dấu chấm cuối cùng) Thí dụ: $(basename home/myname/file1.c test) trả về file1.$(dirs).dat) trả về home/myname/file1 mydat.2.c.c /home/myName/file2. . Nay người dùng muốn thay đổi giá trị mặc định này của X mà không muốn điều chỉnh nội dung tập tin kiến tạo thì thay vì gọi make <Các_Tham_Số> có thể dùng cách gọi dạng make X='<giá_trị>' <Các_Tham_Số> để thay đổi nó.fr/thuctap_khoahoc/tinhoc/vanlenh05. sẽ trả về giá trị file2 file1 main $(dir <Các_Tên>) : tương tự lệnh dirname trong BASH. Nếu condition có giá trị false (tức đó là một string độ dài bằng 0) thì phần else-part(nếu có) sẽ được khai triển. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux .c ..2. Lưu ý: hàm basename này có nội dung trả về hoàn toàn khác với hàm basename trong BASH. $(addprefix <Tiếp_đầu_ngữ> . $(addsuffix <Tiếp_vỹ_ngữ>. YFLAGS Biến thêm vào để dùng với trình Yacc. Sau đây là danh sách các biến (mặc định) quan trọng có thể bị cưỡng quyền: ASFLAGS : Biến thêm vào để dùng với hợp ngữ (assembler) (khi gọi với tập tin ..then-part[. người ta không cho phép lệnh make áp dụng thao tác cưỡng trị lên những dòng mà có biến có giá trị đặc biệt đó thì có thể dùng thao tác kháng lại tính cưỡng trị thông qua định hướng cưỡng trị (overide directive) theo cú pháp: http://vietsciences.. -I$(src)/include) $(foreach var. Võ Quang Nhân.dat $(basename <Các_tên>) Ngược với hàm suffix.2012 14:59:47] . include/asm/$(header)) $(call <Tên_biến>.c file2.<Tham_Số1>.. $2 .Vietsciences .list.file1 file2) cho kết quả /usrsrc/file1 /usrsrc/file2. GFLAGS Biến thêm vào để dùng với trình SCCS . make sẽ tạm thời gán các giá trị <Tham_Số1>.S). thì nó sẽ làm ảnh hưởng tới nội dung tương ứng của <Tên_biến> Thí dụ: reverse = $(2) $(1) file1 = $(call reverse.s hay . Thí dụ: INCLUDE_FLG += -Iinclude $(if ($BUILDSRC. Do đó. RFLAGS Biến thêm vào để dùng với trình dịch Fortran lên các chương trình Ratfor. ngược lại phần then-part sẽ được khai triển.) : Khi thực thi (expand) hàm này..c /home/myname/file2. science. hàm trả về tên phần thư mục chứa tên cuối cùng.c file2. khoahoc. Thí dụ: $(dir /home/myname/file1. informatique. . Nhưng trong một số trường hợp người dùng có thể đổi giá trị tham số này thành -g -O bằng cách gọi lệnh make dạng: make CFLAGS='-g -O' hay là make CFLAG:='-g -O' Nếu chỉ muốn dùng phép gán đơn giản Gần như ngược lại trong nhiều trường hợp rất đặc biệt. <Tham_Số2>.else-part]) : make sẽ đánh giá condition bằng cách cắt bỏ các kí tự trống ở trước và sau condition rồi sau đó khai triển (expand) tham số này (thường là tên biến). CFLAGS : Biến thêm vào để dùng với trình dịch C.free.c A19.c $(notdir <Các_tên>) Tương tự như lệnh basename trong BASH. -Iinclude2. khoa hoc.
informatique. nếu không tồn tại tập tin với tên clean. Các lệnh ngăn cách nhau bởi dấu chấm phẩy (. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux . PC Trình dịch cho chương trình Pascal mặc định là pc ASFLAGS Tham số cho hợp ngữ (khi gọi lên các tập tin.2012 14:59:47] .o *. CXX Trình dịch cho chương trình C++ mặc định là g++.r Qua mệnh lệnh dạng: $(FC) -c $(FFLAGS) $(RFLAGS) Dịch các chương trình hợp ngữ và tiền xử lý : Tuỳ theo sự có mặt của tên mở rộng.. CC Trình dịch cho chương trình C mặc định là cc. <Tên>.o) A19. A19.F Qua mệnh lệnh dạng: $(FC) -c $(FFLAGS) $(CPPFLAGS) . Cú pháp chung của một quy định là: < Các_Đích>: <Các_Tiền_Đề> <Khối_Lệnh> Trong đó: <Các_Đích> (targets) trường hợp tổng quát là tên của các tập tin ngăn cách nhau bởi kí tự trống. Thi dụ1: clean: rm *.fr/thuctap_khoahoc/tinhoc/vanlenh05.3.cpp hay <Tên>.o $(LOADLIBES) $(LDLIBS) Xem thêm chi tiết hỗ trợ trong các tài liệu tra cứu của make (liệt kê trong phần tài liệu tham khảo) Trong đó có các biến mà make đã định nghiã sẵn.2.o myprog. Khối lệnh là phương thức để tái tạo các đích đã quá hạn và đây là các lệnh mà hệ vỏ sẽ thi hành.o mà để đạt điều này phải dùng hàm hỗ trợ cho nội dung biến tức là phải khai báo thành OBJS = $(wildcard *.c qua mệnh lệnh dạng: $(CC) -c $(CPPFLAGS) $(CFLAGS)' Dịch các chương trình C++ : <Tên>. Khi cần người viết makefile có thể định nghiã lại. khoa hoc. các chương trình mà người lập trình muốn có.o kbd.free. PFLAGS Tham số cho trình dịch Pascal.f Qua mệnh lệnh dạng: $(FC) -c $(FFLAGS) .o command.2.o sẽ không được hiểu là các tập tin có phần nối dài là .o utils. Tuy http://vietsciences.o sẽ được tự động làm ra: .o sẽ được tự động làm ra từ <Tên>.3.C qua mệnh lệnh dạng: $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) Dịch các chương trình Pascal : <Tên>.o A19.3 Đích giả : Đich giả là đích mà thực sự tên của nó không phải là tên của tập tin. Như tên gọi các quy định sẽ quy định cách thức cũng như sự phụ thuộc và cách tạo ra các đích tức là các tập tin.o \ insert. Một số biến bao gồm AS Trình dịch cho các tập tin hợp ngữ mặc định là as.htm[17.3. Mọi lệnh cần thiết để tạo nên một tiền đề sẽ phải được thực thi hoàn toàn trước khi bắt đầu thi hành các lệnh để tạo ra một tập tin đích tương ứng <Khối_Lệnh> luôn luôn bắt đầu với một kí tự TAB (kí tự nhây bước). <Tên>. tin hoc.o display.o kbd.o nên make sẽ tự động tìm trong các quy định ngầm của nó mà áp dụng (Trường hợp này dưạ trên mệnh lệnh là cc nên make sẽ tự tìm file1. RFLAGS Tham số cho trình dịch Fortran cho các chương trình Ratfor.2.o display.o) Các dòng quá dài có thể cắt ra thành nhiều dòng con ngắn hơn bằng cách chèn dấu nghiêng về \ chỗ bị cắt ở cuối mỗi dòng con đó Mỗi quy định sẽ cung cấp cho make hai thông tin: Khi nào các đích đã bị quá hạn (out-of-date) và làm thế nào để cập nhật chúng khi cần. Các quy định đó sẽ được make tìm kiếm và áp dụng tự động một khi make tìm thấy một tên tập tin trong makefile (như là tên của một đích hay tên của một tiền đề) mà lại không có một quy định nào để chỉ ra cách tạo nên tập tin đó..o search. Tất cả các lệnh để kiến tạo Thí dụ: edit : main.s hay .2 Các quy định ngầm thông dụng: Dịch các chương trình C : <Tên>. FFLAGS Tham số cho trình dịch Fortran.04.cc.3 Quy định: Đây là thành phần quan trọng nhất của một Makefie. Thí dụ: Một makefiel có nội dung: CFLAGS = -c -O LDFLAGS = -g myprog: myprog. CPPFLAGS Tham số cho bộ tiền xử lí C (C preprocessor) và các chương trình nào dùng nó (trình dịch C và Fortran). LDFLAGS Tham số cho trình dịch khi nó gọi bộ liên kết (linker) ld.p qua mệnh lệnh dạng: $(PC) -c $(PFLAGS) Dịch các chương trình Fortran và Raftor : Tuỳ theo sự có mặt của tên mở rộng. Tuy nhiên.o bằng cách chạy linker (bộ liên kết) qua trình dịch C bằng mệnh lệnh $(CC) $(LDFLAGS) <Tên>.o $(CFLAGS) $(LDFLAGS) Vì trong tập tin có đề cập tới file1.o cc -o edit main. Đích giả tạo ra nhằm chỉ để thực thi những thao tác riêng biệt mà người viết makefile tạo ra.2.o sẽ được tự động làm ra từ <Tên>.1: Quy định ngầm: Để tiện lợi và giảm công sức cho việc viết mã.) sẽ được gởi ra trình bao để thi hành Lưu ý: Bắt đầu của dòng <Khối_Lệnh> phải là một kí tự nhảy bước (<TAB>) và chỉ một mà thôi Danh sách tên các tập tin trong <Các_Đích> và trong <Các_Tiền_Đề> đều có thể dùng kí tự phỏng định để miêu tả cùng một lúc nhiều tập tin vào trong danh sách.2.2. FC Trình dịch cho chương trình Fortran và Ratfor mặc định là `f77'. science. cpp qua mệnh lệnh dạng $(CPP) $(CPPFLAGS) Liên kết (link) một tập tin đối tượng: <Tên> được tự động từ <Tên>. <Tên>.o files.o search.s từ trình dịch as qua mệnh lệnh dạng $(AS) $(ASFLAGS) . thì lệnh rm của quy định clean sẽ thi hành mỗi lần nhập make clean.co.Vietsciences .o command. Trường hợp đặc biệt <Các_Đích> không phải là tên tập tin sẽ là các đích giả (phony target) <Các_Tiền_Đề> là tên của các tập tin mà các tập tin đích phụ thuộc vào.S từ các bộ tiền xử lý C. override <Tên_biến> = <Giá_trị> Việc thiết kế định hướng override là nhằm cho người viết makefile có thể điều chỉnh các đối số mà người dùng gửi vào. CXXFLAGS Tham số cho trình dịch C++.o sẽ được tự động làm ra từ <Tên>.o files. CFLAGS Tham số cho trình dịch C.o nhưng lại không chỉ ra làm thế nào để có file1.c và dịch ra thành file1.o utils.o \ insert.o sẽ được tự động làm ra: . CPP Chương trình để chạy bộ tiền xử lý C với các kết quả cho ra ngỏ ra chuẩn mặc định là $(CC) -E .o file1. A19.3. điều này không đúng khi dùng trong định nghiã biến (Thí dụ: định nghiã OBJS = *.tmp Trong trường hợp này. khoahoc. Một đích được xem là quá hạn khi nó cũ hơn bất kì một trong các tập tin tiền đề hoặc khi nó không có mặt. một số lớn các quy định được cung cấp sẵn. Võ Quang Nhân.S).o cc -o myprogram file1.
Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux .fr/thuctap_khoahoc/tinhoc/vanlenh05.3. Đồng thời.EXPORT_ALL_VARIABLES . (xem thêm taì liệu tra cứu của GNU) A19.. . . sự hỗ trợ việc chạy song song các quy định của make cũng không xãy ra (vì tất cả gom chung lại trong một quy định) nên ảnh hưỏng đến hiệu năng của việc thực thi make.free.o utils. Thí dụ3: all : prog1 prog2 prog3 . khoa hoc.2. . Phần gốc này hữu dụng để tạo ra các tên của những tệp liên hệ. Thí dụ người lập trình có bộ mã nguồn C là A. Biến này sẽ bao gồm tên các thư mục có chứa các tập tin tiền đề mà chúng không có mặt trong thư mục hiện hoạt. Rồi sau cùng. có thể dùng đích giả đặc biệt cung cấp sẵn bởi make là .INTERMEDIATE.2 Biến tự động (Automatic Variable) Việc tạo ra các biến tự dộng nhằm thoả mản nhu cầu tự động hoá các thao tác và giảm thiểu mã cần viết cho makefile.o sort.o utils.htm ) 1 CC=g++ 2 CFLAGS=-c -Wall 3 LDFLAGS= 4 SOURCES=main. Mỗi tiền đề đến lượt nó lại là một đích có lệnh thực thi riêng. tin hoc.o. informatique. make còn cung cấp các tên đích có chức năng khác ít phổ biến như .PRECIOUS.c.cpp hello. science.. (Đây là tên bao gồm cả tên thư mục chứa của các tệp tiền lệ) $^ : Tên của tất cả các tệp tiền lệ và là danh sách được viết ngăn cách các tên với nhau bởi các kí tự trắng. Ngoài ra. http://vietsciences.o thì $(@D) là dir .PHONY: subdirs $(SUBDIRS) subdirs: $(SUBDIRS) $(SUBDIRS): & $(MAKE) -C $@ dir1: dir3 Theo cách viết này thì dir1 sẽ không thể được chạy cho đến khi dir3 được hoàn tất Lưu ý: Đích giả có thể "phụ thuộc" vào nhiều tiền đề.PHONY SUBDIRS = dir1 dir2 dir3 .PHONY. Một khi tên một tập tin dù là đích hay là tiền đề mà không có mặt trong thư mục hiện hoạt thì make sẽ tìm kiếm nó thông qua biến VPATH.. \ done Cách viết trên có điểm yếu là nếu xãy ra một lỗi bất kì trong quá trình thi hành các makefile con trong vòng lặp thì make (mẹ) vẩn tiếp tục chạy mà không dừng lại ở vị trí lỗi.Vietsciences . Việc thường thấy trong quá trình dịch là tạo ra các tệp đối tượng tương ứng A. . Trong một quy định dạng thức tĩnh.o. Trong trường hợp quy định là quy định dạng thức có nhiều đích thì $@ sẽ là tên của đích nào làm nguyên nhân cho sự thực thi mệnh lệnh của quy định $< : Có nội dung là tên của tập tin tiền lệ đầu tiên.2. Tương tự như biến PATH trong BASH. có thể liên kết nó thành chương trình thực dụng. Nếu giá trị của $@ là dir/file1. $* : Phần gốc (stem) mà một quy định ngầm tương thích.o *.2012 14:59:47] .SECONDARY. Nếu sử dụng các biến này bên ngoài các câu lệnh thì chúng chỉ có giá trị rỗng.IGNORE.o cc -o prog1 prog1.o cc -o prog3 prog3. C. Danh sách các biến tự động phổ biến bao gồm $@ : Có nội dung là tên tập tin đích của quy định tương ứng.3..o. Nếu đích có lệnh thực thi của nó nằm trong một quy định ngầm. Nhưng cũng có thể gọi make prog2 chỉ để tạo prog2 mà thôi. Nếu đích là dir/a.4..4 Các biến thông dụng A19. nhiên. B. $(@F) : Phần tên ngắn của tên của một đích. C.%. .o cc -o prog2 prog2.o utils. nó có ý nghiã khi mà nó lặp lại tên của các thư viện trong một thứ tự riêng nào đó. Tuy nhiên. Với tên này thì quy định sẽ được thực thi bất kể tập tin clean có tồn tại hay không: Thí dụ2: Thay vì dùng tên clean hãy dùng ..o utils. Để tránh trường hợp này.opussoftware.o prog2 : prog2.cpp factorial.. Điều này hữu dụng chủ yếu trong các lệnh liên kết. Các biến này sẽ giúp tự động hoán đổi tên (trong trường hợp này là việc thay đổi các tên mở rộng cuả các tập tin) Lưu ý: Các biến tự động chỉ có giá trị và hữu hiệu nội trong các câu lệnh.htm[17.c B.PHONY: clean clean: rm *. do \ $(MAKE) -C $$dir. phần gốc là bộ phân của tên tập tin mà nó tương thích với % trong đích đạng thức.b và dạng thức đích là a.tmp Một ứng dụng khác của đích giả được trình bay trong các thí dụ sau: Thí dụ3: thực thi các tập tin kiến tạo trong các thư mục con thông qua một quy định bằng cách viết: SUBDIRS = dir1 dir2 dir3 subdirs: for dir in $(SUBDIRS). . nó s bỏ đi những tên nào trùng lặp $+ : Tương tự như $^.o sort. Khi mà $@ không có dấu nghiên tới thì $(@D) là dấu chấm .co.o prog3 : prog3. Cách viết khắc phục hai yếu điểm này là tận dụng đích giả ..c. nếu như tồn tại một tập tin với tên clean thì do tập tin này không bị ảnh hưởng bởi các tiền đề (không có ìệt kê tên của các tập tin tiền đề của quy định clean) nên lệnh gọi bởi quy định này (rm) sẽ không được thực thi vì make cho rằng không có gì mới để cập nhật.. đồng thời nó cũng có thể là tên các thư mục chứa các tập tin đích của các quy định.PHONY làm tên đích . khoahoc. VPATH nối tên các thư mục bởi các dấu : Thí dụ: VPATH = /src:.o với cách viết này thì người dùng có thể gọi để tạo những đích khác nhau chẳng hạn như make all để tạo ra prog1 prog2 và prog3 .com/tutorial/TutMakefile.2.PHONY : all prog1 : prog1. thì biến này sẽ là tập tin tiền lệ đầu tiên được thêm vào bởi quy định ngầm $? : Tên của tất cả các tệp tiền lệ nào mới hơn tập tin đích và là danh sách được viết ngăn cách các tên với nhau bởi các kí tự trắng.3.b thì phần gốc là dir/file1. nhưng ở đây các tên trùng lặp được lặp lại theo đúng thứ tự mà chúng được liệt kê ttrong makefile. Võ Quang Nhân.file1./include Xin xem thêm các biến khác như của make trong các tài liệu tra cứu chính thức của GNU về make AA19.cpp ...c Lưu ý: $(@F) tương đương với $(notdir $@) Thí dụ:( trích từ http://www.4. $(@D) : Phần tên của một thư mục của một đích mà đã bị xoá đi phần bắt đầu từ kí tự nghiên tới (slash) Thí dụ nếu giá trị của $@ là dir/file1.04.1 VPATH: biến VPATH là một biến toàn cục của make dùng để chỉ ra danh sách các thư mục mà make sẽ tìm kiếm.c thì $(@F) có giá trị là file1.
2.fr/thuctap_khoahoc/tinhoc/vanlenh05..5.2.cpp=.5.04. Định hướng này dùng để tổ chức một chương trình lớn bao gồm nhiều chương trình nhỏ trong nhiều thư mục và mỗi chương trình nhỏ này có các makefile riêng (thí dụ như trường hợp makefile của mã nguồn nhạt nhân) Cú pháp: include <Tên_các_tập_tin> A19. và 25 mô tả các định hướng (dạng lệnh if) Thí dụ: ifeq ($(CC).o cho mọi tập tin có tên mở rộng là .5 override : Việc thiết kế định hướng override là nhằm cho người viết makefile có thể điều chỉnh các đối số mà người dùng gửi vào. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux . 5 6 7 8 9 10 11 12 13 OBJECTS=$(SOURCES:.5.c $@ endef Khi cần dùng trong một quy định sẽ gọi chẳng hạn như : file1.h cc -c $(CFLAGS) $< -o $@ (dòng lệnh này tương đương với cc -c $(CFLAGS) file1.cpp. khoa hoc.4 define : Dùng để định nghiã các dòng lệnh mà chúng đại diện bởi một tên biến và biến này được định nghiã riêng biệt.cpp và .2. Trong thí dụ của phần A19.2. science.19.2.5.tab.5. Đặc biệt biến MAKFLAGS luôn luôn được xuất dùng chung cho các tập tin kiến tạo con. informatique.5 Các định hướng thông dụng của make A19.3. Cú pháp: export <Tên_Biến> export <Tên_Biến> = <Giá_trị> export <Tên_Biến> := <Giá_trị> Đặc biệt nếu chỉ viết: export không có < Tên_Biến> đi kèm có nghiã là yêu cầu make xuất tất cả các biến hiện có trong tập tin kiến tạo hiện tại. Có thể áp dụng trong trường hợp ngăn người dùng gửi/gán các giá trị không mong muốn lên các biến khi gọi lệnh make.c defs.htm[17. ngoại trừ các tên biến đã được ngăn chận bởi lệnh unexport A19.2012 14:59:47] . khoahoc. tin hoc.2.3) Với định hướng này thì tùy theo cách gán giá trị ta có các cú pháp sau: override <Tên_biến> = <Giá_trị> override <Tên_biến> := <Giá_trị> override <Tên_biến> += <Giá_trị> A19.2. Khi gặp lệnh này make sẽ thêm vào tên và giá trị của các biến được xuất ra vào trong môi trường của tập tin kiến tạo con. Cú Pháp: unexport <Tên_Biến> A19.2 export : Dùng để xuất các biến vào trong các tập tin kiến tạo con.3.o lệnh thực thi là (dòng 13): $(CC) $(CFLAGS) $< -o $@ (biên dịch từ .3..h hack.6 Các định hướng điều kiện (conditional) : Là định hướng khiến cho một phần của tập tin makefile được thực thi hay bỏ qua tùy theo giá trị của các biến.free.3. Cú pháp: define <Tên> <Các_dòng_lệnh > endef Thí dụ: Định nghiã một khối lệnh hay được sử dụng: define run-yacc yacc $(firstword $^) mv y.c -o file1.Vietsciences .3..y $(run-yacc) A19.2.2.gcc) libs=$(libs_for_gcc) else libs=$(normal_libs) endif Cú pháp: <Định_Hướng_Điều_Kiện> <Các_dòng_mã nguồn_nếu_đúng> endif <Định_Hướng_Điều_Kiện> <Các_dòng_mã nguồn_nếu_đúng> else <Các_dòng_mã nguồn_nếu_sai> endif <Định_Hướng_Điều_Kiện1> <Các_dòng_mã nguồn_nếu_đúng1> else <Định_Hướng_Điều_Kiện2> <Các_dòng_mã nguồn_nếu_đúng2> else <Các_dòng_mã nguồn_nếu_sai> http://vietsciences.co.3.5./headers file1.cpp) Thí dụ2: VPATH = /src:.3.23.o: $(CC) $(CFLAGS) $< -o $@ Dòng 10 tương đương với: $(CC) $(LDFLAGS) $(OBJECTS) -o $(EXECUTABLE) Dòng 12: quy định áp dụng cho các tệp có cùng tên mở rộng .24.cpp sang .3 unexport: là định nhướng để ngăn không cho một tên biến được xuất ra cho các tập tin kiến tạo con. (Xem thêm phần A19.2 thì các dòng 17.o : file1.2.1 include : định hướng này có tác dụng lệnh cho make ngưng đọc tập tin kiến tạo hiện tại và chuyển sang đọc các tập tin kiến tạo khác trước khi tiếp tục các dòng kế tiếp. Võ Quang Nhân.o) EXECUTABLE=hello all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $@ .3.o ) A19.c : file1.
2012 14:59:47] .< String2> ) ) Nếu < String1> <String2> ifneq <String1> <String2> . tập tin đích ở đây là hiện hữu nhưng nội dung của nó không cần được quan tâm và thường là tập tin có độ dài bằng 0.5 Lưu ý về tập tin tiền đề: Trong các makefile. Mục đích của tập tin này là để lưu giữ thời điểm cuối cùng mà nó được truy cập để dùng trong mụch đích kiểm tra sự phụ thuộc hay sự cập nhật hoá.4. Tên các tập đích này có thể dùng kí tự phỏng định. all) Sử dụng để dịch một hạt nhân cho Linux: Đối với một mã nguồn hạt nhân mới có thể dùng cách sau đây để cấu hình và cài đặt lên máy theo thứ tự:.c sử dụng def. Do đó trong tập tin kiến tạo sẽ viết thành main.h thông qua lệnh #include).2 Quy định với đích là tập tin trống: Đây lcũng là một cách trình bày khác tương tự với đích giả dùng để thực thi một số lệnh cài sẵn khi được yêu cầu.c cat $? touch update A19. tiền đề này không đổi (tên) cho mọi đích. ) ) bằng A19. Do đó. Để tránh tình trạng khó khăn này.c thông qua dòng lệnh A19.c -o file1. (Mỗi tên cho một dạng thức) Mỗi dạng thức thường chỉ chứa một kí tự %.h thay đổi. Phương tiện này tổng quát hơn là các quy định nhiều đích thông thường vì nó không đòi hỏi các đích phải có cùng tiền đề.PHONY A19.h.2.2.dat viết vào trong tập tin longprint khi gọi make longprint. các trình dịch C thường hỗ trợ tham só -M. clean.c và câu lệnh sẽ tương đương với $(CC) -c $(CFLAGS) file1.04.4 Các quy định đặc biệt: Là các quy định mà thành phần của nó có thể không có mặt hoặc có nhiều hơn 1 thành phần của cùng loại. modules_install.o file2.2. phần tương hợp này được gọi là gốc (stem).2. Khác với đích thông thường hay đích giả.c $(CC) -c $(CFLAGS) $< -o $@ Đối với đích thứ nhất file1. Thêm vào đó. Các tên tiền đề cho từng đích được tạo (tìm) ra bằng cách thay thế gốc lên kí tự % trong mỗi dạng thức tiền đề. A19. Võ Quang Nhân.Vietsciences .4 Quy định dạng thức (pattern rule) : Để mở rộng nội hàm hay thu gọn cách viết cho tên (tập tin) đích và tên tiền đề của quy định người ta đặt thêm một siêu kí tự là % .o Tương tự. (thí dụ main.. % sẽ bị thay bởi file1 trong dạng thức %. Bao gồm A19.o từ tập tin cùng tên <Tên>.o: def. A19.: http://vietsciences. Kí tự nàu tương thích với dãy kí tự bất kì khác trống (hãy so sánh với siêu kí tư * và. Mỗi đích sẽ tương hợp với <Dạng_thức_đích> để trích ly ra một phần của tên đích.o.$@) mytext.4. Chẳng hạn như lệnh: cc -M main. Dòng lệnh của quy định này bao gồm lệnh touch (để cài lại dấu thời gian (time stamp) ) Thí dụ: Lệnh sau đây dùng để hiển thị tập tin mã nguồn nào có sự thay đổi (cập nhật) mỗi khi gọi lệnh make update update: file1. khoahoc. shortprint : mytext. modules.o : def. khoa hoc.free.2. Thí dụ: Quy định sau đây sẽ cho phép trích các dòng có chứa chữ long của tập tin mytext.o: %. Nếu <String1> không bằng <String2> ifdef <Tên_Biến> Nếu <Tên_Biến> đã được dịnh nghiã ifndef <Tên_Biến> Nếu <Tên_Biến> chưa được định nghiã Lưu ý: <String2> ở đây nếu không có mặt sẽ xem như là so sánh với chỗi kí tự trống (Thí dụ ifdef ($file2.co. Như một bài tập hãy tìm tất cả các đích giả của tập tin này (HD: Dùng lệnh grep để trích ly ra các dòng PHONY từ Makefile) Từ đó biết được các đối số nào có thể dùng được để gọi từ make (các đối số thông dụng là mrproper.h Quy định này nhằm cập nhật lại main. cho đích file2.o.2..h mà không cần người viết makefile pải viết quy định đó ra.dat có chứa chữ short vào trong tập tin shortprint khi nhập lệnh make shortprint longprint.htm[17.5 Quy định dạng thức tĩnh (static patern rule) : Cách viết này đưọc tạo ra nhằm đặc biệt xử lý trường hợp nhiều đích và cấu trúc các tên tiền đề cho mỗi đích dựa vào tên của đích tương ứng.o all: $(objects) $(objects): %.o. <Dạng_thức_đích> và <Các_dạng_thức_tiền_đề> chỉ ra cách thức để xác định tiền đề cho mỗi đích. Điều này sẽ giảm thiểu các khó khăn về tập tiền đề. science. dep.4.2. nếu kí tự % có mặt trong tiền đề thì nó phải tương ứng với kí tự % (nếu có trong đích) Thí dụ khi viết %o : %c $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ Thì quy định trên sẽ chỉ ra cách tạo tập tin <tên>. Các tên tiền đề chỉ phải tương tự nhau (mà không cần trùng lặp) Cú pháp: < Các_đích> : <Dạng_thức_đích> : < Các_dạng_thức_tiền_đề> <Dòng_lệnh> Trong đó. touch * FORCE: Ở đây FORCE thuộc vào trường hợp này và do đó khi gọi make clean thì dòng lệnh rm -f *.o mỗi lần def. Hơn thế nữa. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux .dat > $@ A19. và tương ứng trích các dòng của mytext. + trong dạng thức của lệnh grep). Khi < Dạng_thức_đích> tương hợp với một đích.4.o.fr/thuctap_khoahoc/tinhoc/vanlenh05. Thí dụ: clean: FORCE rm -f *.4. có thể vận dụng các biến tự động và các hàm để tạo thêm sự linh hoạt.o thì gốc là file1 tương ứng với kí tự % trong %.c sẽ tạo thành : main.c file2.dat grep -$(subst print. thì % có thể ứng với bộ phận nào đó của tên đích này. <Các_đích> là danh sách các đích mà quy định sẽ áp dụng lên.3 Các Thí dụ: Thí dụ1 Một trong những tập tin kiến tạo phức tạp nhất là tập tin Makefile của hạt nhân Linux. Quy định viết cách này tưong đương với đích giả . Thí dụ: objects = file1. touch * sễ được thực thi mà không cần kiểm tra lại sự cập nhật của các tập tin liên đới. Trong các chưong trình lớn các quy định như vậy sẽ đòi hỏi sự cẩn thận khi thêm hay bớt các câu lệnh #include. Gốc sẽ được thay vào trong mỗi tên <Các_dạng_thức_tiền_đề> để tạo ra các tên tiền đề. nhiều quy định khi các tập tin đối tượng (obj) phụ thuộc vào một số tập header.3 Quy định đa đích : Cách viết này tương đương với viết nhiều quy định và những quy định này có chung tiền đề và câu lệnh. endif Trong đó <Định_Hướng_Điều_Kiệ> thuôc về một trong các dạng ifeq <String1> <String2> (hay còn viết dạng ifeq(<String1> ..1 Quy định thiếu lệnh và tiền đề : Nếu một quy định A chỉ có tên mà không có mặt của dòng lệnh và các tiền đề thì make sẽ tiến hành thực thi các quy định chứa quy định A như là tiền đề một cách vô điều kiện. Trường hợp một dạng thức tiền đề không chứa kí tự % thì khi đó. tin hoc. informatique.
Như đây là thí dụ minh họa) Nội dụng main.c: #include <stdio. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux .free.cpp: #include <iostream.h> #include "functions.org/tutorials/make/ của Hector Urtubia Chương trình tính 5! bao gồm tổng cộng 4 tập tin mã nguồn (well! hơi nhiều cho 1 chương trình bé như thế.c *.htm[17.o core *~ tar: tar cf code. } Và nội dung Makefile: CC=g++ CFLAGS=-c -Wall LDFLAGS= SOURCES=main.html của Karen Reid năm 2002.o ${OBJS} ${LIBS} .Vietsciences . khoa hoc.cs.c c.h" void print_hello(){ cout << "Hello World!".cpp. tin hoc. int factorial(int n). } else return 1.h" int main(){ print_hello(). return 0. cout << endl.h: void print_hello(). In this case $@ = psort prog1: prog1.c HDRS = abc. Nội dung factorial.h" int factorial(int n){ if(n!=1){ return(n * factorial(n-1))..o c. cout << "The factorial of 5 is " << factorial(5) << endl.o: ${CC} ${CFLAGS} ${INCLUDES} -c $< depend: makedepend ${SRCS} clean: rm *.c prog1. make make make make make make mrpoper : để xoá sạch và điều chỉnh lại các giá trị cấu hình mặc định menuconfig : để tái cấu hình (thêm bớt chức năng cho hạt nhân) dep : tạo các mối liên hệ tương thuộc (nhiều hạt nhân nay đã bỏ qua không dùng đích này) bzImgaes (hay đôi khi là make compressed) đẻ tạo một tập tin ảnh của hạt nhân modules: để tạo ra toàn bộ các tệp thư viện và các bộ điều vận cần thiết cho hạt nhân modules_install: để cài đặt lên các thư mục hạt nhân vưà được tạo ra vào đúng chỗ của nó Sau đó có thể chép tập tin bzImage vào trong thư mục khởi động (thường là /boot) và dùng lệnh mkinitrd để tạo ra ổ RAM khởi động (initial RAM disk) và cuối cùng tạo ra một trình đơn con trong tập tin cấu hình của bộ tâi khởi động (boot loader) thường là LiLo hay Grub.c prog2. } Nội dung hello.co.edu/~reid/csc209/02f/examples/make/make.. void c(). informatique. } Nội dung function. Nội dung a.h all: prog1 prog2 # The variable $@ has the value of the target.h> #include "functions.o: $(CC) $(CFLAGS) $< -o $@ Thí dụ3: Makefile kết cấu với hai chương trình và ba tập nguồn. Võ Quang Nhân. void b(). Thí dụ2: Như một sự khởi đầu thí dụ sau đây trích từ trang http://mrbook.cpp factorial.cpp=.c.o ${OBJS} ${CC} ${CFLAGS} ${INCLUDES} -o $@ prog1.2012 14:59:47] .h testfile1 print: more Makefile $(HDRS) $(SRCS) Nội dung abc.cpp #include "functions. Thí dụ có điều chỉnh vài chi tiết so với thí dụ nguyên thủy có thể được điều chỉnh để xử lý nhiều chưong trình trong Linux Nội dung của Makefile CFLAGS = -g -Wall CC = gcc LIBS = -lm INCLUDES = OBJS = a.o) EXECUTABLE=hello all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $@ .fr/thuctap_khoahoc/tinhoc/vanlenh05. khoahoc.o SRCS = a.c b.cpp #include <iostream.o b.04. Thí dụ này lấy từ http://www.o ${OBJS} ${LIBS} prog2: prog2.tar Makefile *.o ${OBJS} ${CC} ${CFLAGS} -o $@ prog2.h> void a() { http://vietsciences.cpp OBJECTS=$(SOURCES:. science.toronto.cpp hello.h: void a().
h> void a() { printf("function b\n").c: #include <stdio. c().Kết luận --Các Tham chiếu © http://vietsciences. c().2012 14:59:47] .h> #include <stdlib. printf("function a\n"). science.org và http://vietsciences2.free.co. b(). informatique. exit(0). b().Vietsciences .fr . a(). tin hoc.h> #include <stdlib. exit(0).c: #include <stdio.04.fr Làng Đậu http://vietsciences.free.fr/thuctap_khoahoc/tinhoc/vanlenh05.c #include <stdio.h> void a() { printf("function c\n").h> #include "abc. } Nội dung prog1.h> #include "abc. } Nội dung c. } Nội dung prog2.. a(). } Nội dung b. Võ Quang Nhân. khoa hoc.h" int main() { printf("Program 2 \n").h" int main() { printf("Program 1 \n").. http://vietsciences. khoahoc. } Bài kì tới: awk. Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux . rpm -.htm[17.free.c #include <stdio.
This action might not be possible to undo. Are you sure you want to continue?
We've moved you to where you read on your other device.
Get the full title to continue reading from where you left off, or restart the preview.

WARC-Identified-Payload-Type: application/xhtml+xml

X-Served-By: cache, cache-iad2645-IAD

Set-Cookie: stg=994; Domain=.scribd.com; Path=/; Expires=Fri, 21-May-27 08:10:21 GMT

X-Page-Type: docview

X-Cache: MISS

Via: 1.1 varnish

Accept-Ranges: bytes

Cache-Control: no-cache

Vary: Accept-Encoding, User-Agent