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  Võ Quang Nhân   17/10/2006

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, đăng lại, hay in lại nhằm mục đích mua bán hay trục lợi mà không có sự cho phép 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ụchđích giáo dục xin liên lạc về vo_quang_nhan@yahoo.com

Bài 2:

4 Biến, tham số, và quy tắt đặt tên biến: 

Đối với BASH không có sự phân biệt nào giữa một biến và một tham số.  Việc phân biệt này hoàn toàn tùy thuộc vào người lập trình tự quy ước lấy. Do đó, khi nói về biến tức là nói về tham số.

Như các ngôn ngữ lập trình khác, biến và tham số là một phận rất quan trọng của ngôn ngữ BASH. Trong Linux/UNIX có hai loại: biến địa phương (local variable) và biến môi trường (environment variable). 

4.1 Các biến môi trường:  là biến truy cập được cho tất cả các tiến trình con tạo ra từ hệ vỏ ở thời điểm mà chúng đưọc định nghiã.   Nhiều biến môi trường được tạo ra ngay trong các văn lệnh khởi động và được cài để trở thành biến toàn cục (global varibable).  Để thông báo một biến là biến môi trường thì phải dùng lệnh có cú pháp là một trong các dạng:

export <TÊN_BIẾN>
export <TÊN_BIẾN>=<Giá_trị_gán_cho_TÊN_BIẾN>
declare -x <TÊN_BIẾN>
declare -x <TÊN_BIẾN>=<Giá_trị_gán_cho_TÊN_BIẾN>

Một khi đã khai báo như trên thì tất cả các tiến trình con (child process) đều có thể truy cập tới biến này.

4.2 Các biến địa phương:

Các biến không phải là biến môi trường đều là biến địa phương. Các biến địa phương chỉ có giá trị và có hiệu lực trong văn lệnh hay trình bao mà nó được khai báo lần đầu và được trình bao công nhận ngay sau khi chúng được khai báo. Khác với C/C++ các biến trong một chương trình BASH không có tính cục bộ (nghiã là cho dù 1 biến được khai báo bên trong 1 hàm hay trong một vòng lặp thì chúng đều có hiệu lực sử dụng trong toàn văn lệnh kể từ khi chúng được khai báo và có thể tiếp tục sử dụng mặc dù chúng được truy cập bên ngoài hàm hay vòng lặp đã khai báo tạo ra chúng.  Khác với các biến môi trường có tính toàn cục, các biến địa phương sẽ không có hiệu lực cho các tiến trình con (chẳng hạn như là khi gọi các văn lệnh con) và hết hiệu lực ngay khi văn lệnh đó kết thúc  (Ngoại trừ có khai báo  đặc biệt như là khai báo bao hàm một tập tin qua lệnh . <Tên_Tập _Tin>  hay khai báo biến toàn cục qua lệnh export)

4.3 Quy tắc chung khi đặt tên biến:

Tên biến trong BASH có thể là bất kì nhưng cần chú ý một số giới hạn sau:

  • Tên biến chỉ có thể bắt đầu chữ cái trong bảng kí tự Anh ngữ (từ A-Z hay từ a-z) hay kí tự gạch dưới '_'

  • Các kí tự bên trong tên của một biến có thể là các chữ cái trong bảng kí tự Anh ngữ, các chữ số, hay là kí tự gạch dưới '_'. Mọi kí tự khác với quy định này sẽ xem như là một đánh dấu kết thúc của tên một biến.

Lưu ý: Như  C/C++, tên biến trong BASH có tính nhạy cảm (sensitive) với chữ viết hoa và chữ viết thường (nghiã là biến có tên myVar sẽ hoàn toàn khác với biến tên là myvar). Ngoài ra, BASH là ngôn ngữ có kiểu yếu, tức là người lập trình không cần (hay không nhất thiết) phải khai báo kiểu của một biến. Cũng không có sự khác nhau đặc biệt gì để phân biệt một biến và một tham số trong sử dụng

4.4 Khai báo: Có hai cách thức chính để khai báo một biến

4.4.1 Khai báo dơn giản và gán giá trị ban đầu (nếu muốn):

Thí dụ:

myInt=23
myReal=1.2
myString="Hello BASH world"
myNullValue=

Lưu ý:

  • Trong thí dụ trên khi gán giá trị ban đầu cho biến thì không được để khoảng trống (space) ở giữa toán tử dấu bằng (=) với hai vế
  • Nếu liền sau toán tử dấu bằng (=) mà không có giá trị nào thì BASH sẽ mặc định và gán cho nó giá trị null (tứ là một kiểu string độ dài bằng 0)
  • Người lập trình hoàn toàn có quyền không khai báo trước mà chỉ sử dụng tên biến, ngay lập tức trình thông dịch tìm thấy tên hợp lệ trong một biểu thức thì sẽ mặc định đó là tên biến.

4.4.2 Khai báo biến có kiểu hay có điều kiện:

Từ khoá declare hay typeset có thể được dùng để chỉ định kiểu cho một biến. Nó cho phép giới hạn các đặc tính của một biến. Các khai báo có kiểu hoàn toàn không thay đổi nếu thay "declare" bởi "typeset"

Lưu ý: Tất cả các biến đã được dùng lệnh declare hay typeset ngoại trừ là biến hằng, đều có thể hủy bỏ hiệu lực của của chúng bằng lệnh unset <TÊN_BIẾN>. Khi đó, các giá trị cài đặt lên các biến đã hủy hiệu lực sẽ là null.

4.4.2.1 khai báo biến có kiểu mảng (array) có cú pháp:   typeset -a <TÊN_BIẾN>  hay typeset -a <TÊN_BIẾN>=(<GIÁ_TRỊ1>,<GIÁ_TRỊ2>,<GIÁ_TRỊ3>,...)

Thí dụ:

#declare myArray as an array and assign the initial values for that array
declare -a myArray=("apple" "banana" "chili" "mango")
myArray[4]="lime"
#traversal to all of the elements of myArray
echo ${myArray[*]}
#get only one element
echo ${myArray[2]}

Đoạn văn lệnh trên sẽ trả về các dòng:
# apple banana chili mango lime
# chili

4.4.2.2 Khai báo tên hàm:  cú pháp là  declare -f <TÊN_HÀM>.  Nếu chỉ dùng dạng declare -f không có tên tham số  thì hệ thống sẽ xem đây là lệnh dể liệt kê tất cả các hàm đã được định nghiã)

Thí dụ:

typeset -f myFunc
#implelement myFunc
myFunc ()
{
        echo "inside myFunc"
}
#listing all code of all functions
declare -f
#invoke myFunc
myFunc

4.4.2.3 Khai báo biến có kiểu nguyên (integer):  declare -i <TÊN_BIẾN> hay declare -i <TÊN_BIẾN>=<GIÁ_TRỊ>

4.4.2.4 Khai báo biến là một hằng:  typeset -r <TÊN_BIẾN>  hay  typeset -r <TÊN_BIẾN>=<GIÁ_TRỊ_HẰNG>  (r là chữ viết tắt từ "read-only" nghiã là "chỉ được đọc")

4.4.2.5 Khai báo biến là biến môi trường:   declare -x <TÊN_BIẾN> hay declare -x <TÊN_BIẾN>=<GIÁ_TRỊ>

Lưu ý: Ngoài ra, lệnh "declare" hay "typeset" còn hỗ trợ một chức năng nữa là typeset -F.  Khi gọi lệnh này thì chỉ có tên của các hàm sẽ được kiệt kê.

4.4.2.6 Thí dụ:

#!/bin/bash

func1 ()
{
    echo "This is funct1."
}

func2 ()
{
    echo "This is funct2."
}

echo "Declare -f without argument:" declare -f # Lists the function above.
echo "Line declare -f with argument:"
typeset -f func1
declare -i var # var1 is an integer.
var=123
echo "var declared as $var"
var=var+1
# Integer declaration and no need for using of 'let' command. "
echo "var is increased by 1: $var"
echo "Attempting to change var to floating point value, 23.4."
var=23.4
# Error message and no change happened.
echo "var is still $var"
declare -r pi=3.1416
# set pi as constant and assign a value.
echo "pi declared as $pi"
# Attempt to change read-only variable.
pi=3.141592
# Generates error message, and exit from script.
echo "pi is still $pi" # This line will not execute.
exit 0

4.5 Giá trị (hay nội dung) của một biến: 

$<TÊN_BIẾN> là biểu thức giá trị của biến <TÊN_BIẾN>.  Thực chất đây chỉ là cách viết gọn của dạng chính tắc là ${<TÊN_BIẾN>} nếu như không có sự nhầm lẫn. 

Lưu ý: Trong mọi trường hợp tổng quát để trình dịch không bị hiểu sai thì dạng chính tắc biểu thị giá trị của 1 biến ( tức là viết dưới dạng ${<TÊN_BIẾN>} ) nên được sử dụng

Thí dụ1:
myInt=33
echo "the value of myInt is $myInt"

Thí dụ2:
#file: confusing
#!/bin/bash
T="file_"
T1="message_"
T2="to_you_"
echo "$T1$T2  cannot be ${T}1 ${T}2"   # display as 'message_to_you_ cannot be file_1file_2'

5 Biểu thức giá trị mặc định:

Trong nhiều trường hợp gía trị của một biến có thể chưa được xác lập hay tên chưa được định nghiã thì người ta có thể trả về một giá trị mặc định.  Sau đây là các biểu thức trả về giá trị mặc định mà BASH hỗ trợ:

5.1 ${<TÊN_BIẾN>:-<Giá_Trị_Mặc_Định>}   Nếu biến <TÊN_BIẾN> đã hết hiệu lực (bằng lệnh unset  hay chưa được khai báo ) hay có giá trị null thì giá trị <Giá_Trị_Mặc_Định> được trả về. Ngoài trường hợp này ra,  giá trị của <TÊN_BIẾN>  sẽ được trả về. Giữ nguyên hiện trạng của biến <TÊN_BIẾN> trong mọi trường hợp.

5.2  ${<TÊN_BIẾN>-<Giá_Trị_Mặc_Định>} Nếu biến <TÊN_BIẾN>  chưa được khai báo thì  giá trị <Giá_Trị_Mặc_Định> được trả về. Ngoài trường hợp này ra,  giá trị của <TÊN_BIẾN> sẽ được trả về. Giữ nguyên hiện trạng của <TÊN_BIẾN> trong mọi trường hợp.

5.3 ${<TÊN_BIẾN>:=<Giá_Trị_Mặc_Định>} Nếu biến <TÊN_BIẾN> đã hết hiệu lực (bằng lệnh unset  hay chưa được khai báo ) hay có giá trị null thì <Giá_Trị_Mặc_Định> được trả về đồng thời biến <TÊN_BIẾN> cũng được định nghiã (nếu nó chưa được khai báo) và được gán giá trị <Giá_Trị_Mặc_Định>.

5.4 ${<TÊN_BIẾN>=<Giá_Trị_Mặc_Định>} Nếu biến <TÊN_BIẾN>  chưa được khai báo thì giá trị <Giá_Trị_Mặc_Định> được trả về, đồng thời  biến <TÊN_BIẾN> cũng được định nghiã và được gán giá trị <Giá_Trị_Mặc_Định>.  Ngoài trường hợp này ra, giá trị <TÊN_BIẾN> được trả về và giữ nguyên hiện trạng của <TÊN_BIẾN>

5.5 ${<TÊN_BIẾN>:+<Giá_Trị_Mặc_Định>} Nếu biến <TÊN_BIẾN> đã khai báo và khác null thì giá trị <Giá_Trị_Mặc_Định> được trả về. Ngoài trường hợp này ra, giá trị null được trả về. Giữ nguyên hiện trạng của <TÊN_BIẾN> trong mọi trường hợp.

5.6 ${<TÊN_BIẾN>+<Giá_Trị_Mặc_Định>}  Nếu biến <TÊN_BIẾN> đã khai báo thì giá trị <Giá_Trị_Mặc_Định> được trả về. Ngoài trường hợp này ra,  giá trị của null được trả về. Giữ nguyên hiện trạng của <TÊN_BIẾN> trong mọi trường hợp.

5.7 ${<TÊN_BIẾN>:?<Giá_Trị_Mặc_Định>} Nếu biến <TÊN_BIẾN> đã khai báo và khác null thì giá trị biến <TÊN_BIẾN> được trả về. Ngoài trường hợp này ra,  giá trị của <Giá_Trị_Mặc_Định>  được gửi đến stderr báo lỗi và kết thúc chương trình

5.8 ${<TÊN_BIẾN>?<Giá_Trị_Mặc_Định>} Nếu biến <TÊN_BIẾN> chưa khai báo thì  giá trị của <Giá_Trị_Mặc_Định>  được gửi đến stderr báo lỗi và kết thúc chương trình. Ngoài trường hợp này ra, giá trị <TÊN_BIẾN> được trả về và giữ nguyên hiện trạng của <TÊN_BIẾN>

5.9 Thí dụ:

#!/bin/bash

echo "Default_string is `whoami`"
echo -e "Default Expression Test (DXT) \${variable-Default_string}"
echo "Not delare variable- DXT return: ${me-`whoami`}"
echo "Current value of the variable= $me"
me1=
echo "Variable contains null value- DXT return: ${me1-`whoami`}"
echo "
Current value of the variable= $me1"
me2=yep
echo "Not null variable- DXT return: ${me2-`whoami`}"
echo "Current value of the variable= $me2"
echo "---------------"
echo -e "Default Expression Test (DXT) \${variable:-Default_string}"
echo "Not delare variable- DXT return: ${mee:-`whoami`}"
echo "Current value of the variable= $mee"
mee1=
echo "Variable contains null value- DXT return: ${mee1:-`whoami`}"
echo "Current value of the variable= $mee1"
mee2=yep
echo "Not null variable- DXT return: ${mee2:-`whoami`}"
echo "Current value of the variable= $mee2"

exit

6 Truy cập có điều chỉnh giá trị của một biến:

Một biến trong Linux nếu không bị giới hạn bởi các điều kiện ràng buộc khi khai báo thì nội dung mặc định của nó được hiểu là một chuỗi kí tự.  Dãy kí tự này có độ dài bằng không nếu biến không được gán giá trị khác null nào.

BASH hỗ trợ nhiều phép toán để lấy về một cách có định dạng của giá trị chứa trong một biến: Ở đây một dạng thức được hiểu là biểu thức trong đó có chứa các kí tự phỏng định

Phần thí dụ 6.9 sẽ minh họa rõ ràng cho cách dùng.

6.1 ${<TÊN_BIẾN>#<Dạng_Thức>} Trả về giá trị của biến <TÊN_BIẾN> sau khi đã cắt bỏ phần ngắn nhất tương hợp với <Dạng_Thức> tính từ phần đầu của biến <TÊN_BIẾN> (nếu có thể)

6.2 ${<TÊN_BIẾN>##<Dạng_Thức>} Trả về giá trị của biến <TÊN_BIẾN> sau khi đã cắt bỏ phần dài nhất tương hợp với <Dạng_Thức> tính từ phần đầu  của biến <TÊN_BIẾN> (nếu có thể)

6.3 ${<TÊN_BIẾN>%<Dạng_Thức>} Trả về giá trị của biến <TÊN_BIẾN> sau khi đã cắt bỏ phần ngắn nhất tương hợp với <Dạng_Thức> tính từ phần cuối của biến <TÊN_BIẾN> (nếu có thể)

6.4 ${<TÊN_BIẾN>%%<Dạng_Thức>} Trả về giá trị của biến <TÊN_BIẾN> sau khi đã cắt bỏ phần dài nhất tương hợp với <Dạng_Thức> tính từ phần cuối của biến <TÊN_BIẾN> (nếu có thể)

6.5 ${<TÊN_BIẾN>:<Vị_Trí>} Trả về dãy kí tự con mà <TÊN_BIẾN> chứa, dãy kí tự này bắt đầu từ vị trí thứ <Vị_Trí> cho đến hết phần còn lại nội dung của <TÊN_BIẾN>

6.6 ${<TÊN_BIẾN>:<Vị_Trí>:<Độ_Dài>} Trả về chuỗi kí tự con mà <TÊN_BIẾN> chứa, chuỗi kí tự này bắt đầu từ vị trí thứ <Vị_Trí>  và chỉ chứa đến <Độ_Dài> kí tự lấy từ nội dung của   <TÊN_BIẾN>

6.7 ${<TÊN_BIẾN>/<Dạng_Thức>/<Chuỗi_Kí_tự_Thay_Thế>} Tìm trong nội dung của <TÊN_BIẾN>  chuỗi kí  tự đầu tiên nào tương hợp với <Dạng_Thức> và thay thế chuỗi đó bằng chuỗi kí tự  <Chuỗi_Kí_tự_Thay_Thế>.  Nếu  <Chuỗi_Kí_tự_Thay_Thế> không có mặt trong biểu thức thì chuỗi con tìm thấy sẽ bị xóa (thay vì thay thế.)

6.8 ${<TÊN_BIẾN>//<Dạng_Thức>/<Chuỗi_Kí_tự_Thay_Thế>} Tìm trong nội dung của <TÊN_BIẾN>  tất cả các chuỗi kí  tự nào tương hợp với <Dạng_Thức> và thay thế chúng bằng chuỗi kí tự  <Chuỗi_Kí_tự_Thay_Thế>.  Nếu  <Chuỗi_Kí_tự_Thay_Thế> không có mặt trong biểu thức thì những chuỗi con tìm thấy sẽ bị xóa (thay vì thay thế.)

6.9 Thí dụ

Thí dụ1:
#Using wild card characters to strip off:
$str=abcd-123-efg
echo "${str#*-*}"     #result: 123-efg
echo "${str##*-??}"   #result: gh
echo "${str%%?-*}     #result: abc
echo "${str%*-*}      #result: abcd-123

Thí dụ2:
#change all filenames which have extension as ".text"
#to the filenames which have extension as ".txt"
for myfile in *.text        #see loop command session later
do
    mv $myfile ${myfile%text}txt
done

Thí dụ3:
#get substrings of str and its length
str="abcdefgh"
str1=${#str} #string length of str should be 9
str2=${str:2} #substring cdefgh
str3=${str:4:2} #substring ef
 

Thí dụ4:
#!/bin/bash
# matching.sh

# Pattern matching  using the # ## % %% parameter substitution operators.

var1=abcd12345abc6789
pattern1=a*c  # * (wild card) matches everything between a - c.

echo
echo "Number of characters in ${var1} = ${#var1}"
echo

echo "pattern1 = $pattern1"   # a*c  (everything between 'a' and 'c')
echo "--------------"
echo '${var1#$pattern1}  =' "${var1#$pattern1}"    #         d12345abc6789
# Shortest possible match, strips out first 3 characters  abcd12345abc6789

echo '${var1##$pattern1} =' "${var1##$pattern1}"   #                  6789     
# Longest possible match, strips out first 12 characters  abcd12345abc6789

echo; echo; echo

pattern2=b*9            # everything between 'b' and '9'
echo "var1 = $var1"     # Still  abcd12345abc6789
echo
echo "pattern2 = $pattern2"
echo "--------------"
echo '${var1%pattern2}  =' "${var1%$pattern2}"     #     abcd12345a
# Shortest possible match, strips out last 6 characters  abcd12345abc6789

echo '${var1%%pattern2} =' "${var1%%$pattern2}"    #     a
# Longest possible match, strips out last 12 characters  abcd12345abc6789

# Remember, # and ## work from the left end (beginning) of string,
#           % and %% work from the right end.

echo

exit 0

7 Truy cập các đặc tính khác của biến:

Một số lệnh khác liên quan đến sử dụng tên biến tương đối có ích là

7.1  ${#<TÊN_BIẾN>} Trả về giá trị độ dài của dãy kí tự mà biến <TÊN_BIẾN> chứa

7.2 ${!<Tiền_Tố>*}  Trả về tên của tất cả các biến nào bắt đầu bằng <Tiền_Tố> Nếu có nhiều hơn một biến với cùng tiền tố thì chúng được hiển thị theo thứ tự trong bảng kí tự ASCII và ngăn cách nhau bởi kí tự trống
Lưu ý:  Cách viết trên bắt buộc phải có dấu * đứng ngay sau <Tiền_Tố> và dấu này không thể thiếu hay thay thế bằng dấu ?.  Trong trường hợp viết biểu thức trên dưới dạng không có dấu * (tức là
${!<Tiền_Tố>} ) thì BASH sẽ hiểu đây là cách dùng biến tham chiếu gián tiếp sẽ được đề cập trong bài tới ) 

7.3 Thí dụ:

my_var="value1"
my_oldvar="value2"
my_Exvar="value3"
myvar="VALUE"
echo "{!my_*}"   # the above command return: my_Exvar my_oldvar my_var
echo "Content of \$myvar is: $myvar, and its length: ${#myvar}" 
            #the above command return: "Content of $myvar is: VALUE, and its length: 5" 

8 Biểu thị nội dung string:

Trong BASH nội dụng của mô-t biếtn nếu không được định nghiã chuyên biệt thì sẽ được hiểu là chuỗi kí tự tức là kiểu string.  Đó đó, ngoài các cách thức truy cập nêu trong mục 5, 6. và 7, BASH còn hỗ trợ các phương thức khác nhau để biểu thị nội dung của một string:

8.1 Chuỗi kí tự với ngoặc kép "<string>"

Gần giống như C/C++ các chuỗi kí tự có thể được đặt trong ngoặc kép và có thể được "mở rộng" thông qua cách dùng các kí tự  thoát (escape character) 

Thí dụ:
myName="Nguyen Van Hai"
mySentence="My name is:  $myName"
myParagraph="Hello! \n\t$mySentence\n"
# display a varibale iside a string
echo "value of  \$mysentence is : $mySentence"
#display a paragraph without enabling escape character feature
echo "$myParagraph"
#OK! correct it by using option -e
echo -e  "$myParagraph"

8.2 Chuỗi kí tự với dấu sắc  '<string>' :

Khác với dấu ngoặc kép các string lưu giữ dạng này sẽ không "mở rộng" các kí tự thoát trong mọi dạng

Thí du:  
myName="Nguyen Van Hai"
# see how it is assigned
myVar1='the value of  \$myName is:  $myName'
myVar2="the value of  \$myName is:  $myName"
# see !
echo $myVar1
echo $myVar2
#however
echo "$myVar1"
echo "$myVar2"
#and the last test
mySign='\$'
echo "mySign is: $mySign"

8.3 Chuỗi kí tự với dấu huyền  `<Mệnh_Lệnh>`  hay  $(<Mệnh_Lệnh>)

BASH dùng cách này để cho phép gán nội dung hiển thị của một mệnh lệnh vào thành nội dung của một biến hay một biểu thức:

Thí dụ1:  Hai đọan mã sau đây tương đương dùng để xoá mọi tập tin thông thường (không phải là thư mục) trong thư mục hiện hoạt

for myFile in $(ls .); do
    rm -f $myFile
done
myDirContent=`ls .`
echo "The content of current directory now:"
echo "$myDirContent"

for myFile in `$ls .`; do
    rm -f $myFile
done
myDirContent="$(ls .)"
echo "The content of current directory now:"
echo "$myDirContent"

Thí dụ2
myDir="./test"
echo "content of ./test is: `ls $myDir`"
 

8.4 Sử dụng kí tự thoát: 

Kí tự thoát có thể dùng trong biểu thị nội dung của một string theo cả hai cách nêu trong 8.1 và 8.2 (xem thêm thí dụ trong 8.2).  Sau đây là danh mục các kí tự thoát:

8.4.1 Kí tự thoát ANSI-C :

\a Phát tiếng kêu "beep" hay nhấp nháy (Nếu Hệ điều hành hỗ trợ)

\b Kí tự bước lùi (backspace)

\f Kí tự "form feed"

\n Kí tự đầu dòng (newline)

\r Kí tự xuống hàng (carriage return)

\t Kí tự nhảy bước ngang (horizontal tab)

\v Kí tự nhảy bước dọc (vertical tab)

\\ Dấu xẹt ngược (backslash )

Thí dụ:
echo -e "the directory C:\\Windows\\Command"
#display string: 'the directory C:\Windows\Command'

\' Dấu trích dẫn đơn (single quote)

\nnn Giá trị bát phân nnn được hiểu theo bảng đối chiếu ASCII

Thí dụ: echo -e "\042" #display " sign

\xHH Giá trị thập lục phân HH (Có thể viết 1 hay 2 số thập lục H)

\cx Kí tự "control-x"

\" Dấu "

\$ Dấu $ 

Thí dụ:    echo -e "I said: \"I love you!\", Mom.  Can you give me \$10.00 ?"

8.4.2 Kí tự thoát hiển thị màu dùng cho lệnh echo  

Trong chế độ màn hình đầu cuối (console screen và không phải là xterm hay các ngỏ ra từ X window) thì các hiển thị từ lệnh echo có thể dùng các màu cho nền và cho chữ.  Để làm việc này, người ta cần gọi thêm tham số -e (cho chế độ dùng kí tự thoát) và dùng cú pháp dạng  echo -e $"\\033[<Loại>;<Mã_Màu>m<Chuỗi_Hiển_Thị>"; Trong đó, <Loại> <Mã_Màu> được mô tả trong bảng sau

Lưu ý:  Màn hình sẽ không hiển thị đúng hay sẽ không hiển thị màu khi dùng các lệnh này trong xterm hay trong Xwindows

<Loại>  Ý nghiã
0  Chế độ mặc định thông thường
1  Tô đậm; chế độ sáng
5  Nhấp nháy
6  Nhấp nháy nhanh
7  Chế độ đảo ngược  (màu nền  -> màu mặt chữ và nguợc lại)

 

 Color Code  Meaning
30  Chữ đen
31  Chữ đỏ
32  Chữ lục
33  Chữ vàng
34  Chữ xanh dương
35  Chữ tím
36  Chữ xanh da trời (cyan)
37  chữ trắng
40  Nền đen
41  Nền đỏ
42  Nền lục
43  Nền vàng
44  Nền xanh dương
45  Nền tím
46  Nền xanh da trời
47  Nền màu xám

Thí dụ1: echo -e $"\\033[1;32mThe Green Text"

Thí dụ2: echo -en $"\\033[5;31mFatal Error. Enter code to exit "
     read A    


A6: Tập tin thiết bị

A6.1 Khái niệm và vai trò của các tập tin thiết bị:

Như đã biết, Linux/UNIX truy cập đến các thiết bị phần cứng thông qua các bộ điều vận và các tập tin thiết bị.  Mỗi thực thể phần cứng sẽ liên lạc trực tiếp và được truy cập bởi hệ điều hành (các thao tác xuất nhập) thông qua các tập tin thiết bị đại diện cho phần cứng đó. Tập tin thiết bị là một loại tập tin đặc biệt còn có tên gọi là nút thiết bị (node device).  Mỗi nút thiết bị sẽ được đặc trưng bởi số nút hay số thiết bị (node number/ device number) của nó.  Số nút này gồm hai phần:  Trọng số (Major number) và Khinh số (Minor number). Trọng số được hạt nhân dùng để xác định bộ điều vận của thiết bị và khinh số sẽ giúp hạt nhân truy cập đến chính xác thực thể thiết bị nào (vì một bộ điều vận có thể điều khiển vận hành cùng lúc nhiều thiết bị -- hay nhiều thiết bị con của cùng một thiết bị).  Tập tin thiết bị thường có tên viết tắt để gợi nhớ loại thiết bị nào và thường do sự quy định của bộ điều vận  (nhưng không nhất thiết phải sử dụng tên đó). Thí dụ: các nút thiết bị có tên bắt đầu bởi tiền tố fd sẽ đại diện cho các ổ mềm (floppy disk), tiền tố hd đại diên cho các ổ cứng (hard drive), sd đại diện cho các ổ SCSI (SCSI drvie), ... Để biết được Số thiết bị của một thiết b thì có thể dùng lệnh ls -l (xem hình).  Mỗi một thực thể thiết bị thường có thể được gắn kết với hệ điều hành (hay là hệ thống tập tin) thông qua lệnh mount sau khi bộ điều vận tương ứng đã được tải; đồng thời cũng có thể tháo dỡ sự gắn kết của thiết bị này ra khỏi hệ thống tập tin bằng lệnh umount (hay lệnh fuser).  Một tập tin thiết bị không nhất thiết phải gắn kết với bất kì một thiết bị nào (mà thường chỉ được gắn kết khi có lệnh từ hạt nhân thông qua bộ điều vận).  Thông thường, tất cả các nút thiết bị được tạo ra sẵn trong thư mục /dev và các thư mục con của nó. Trong trường hợp không đủ nút thiết bị để gắn kết với các thực thể thiết bị phần cứng thì có thể tạo thêm các nút thiết bị mới bằng lệnh
mknode
<Tên_Tập_Tin> <Loại> <Trọng_số> <Khinh_số>
(trong đó <Loại> có thể là  c cho thiết bị kiểu kí tự b cho thiết bị kiểu khối)
(hay lệnh MAKEDEV <Tên_thiết_bị_chuẩn>)

Các tập tin thiết bị cũng có thể xóa bỏ bằng lệnh
rm hay lệnh unlink


Hình1 Hiển thị Số nút qua lệnh ls -l

Tóm lại, vai trò chính của các tập tin thiết bị là:

  • Là điểm nút để kết nối liên lạc giữa hạt nhân và thiết bị phần cứng. Mỗi thiết bị muốn hoạt động phải được gắn kết (mount) với các nút thiết bị và được điều vận bởi bộ điều vận
  • Hệ điều hành truy cập và xuất hay nhập (I/O) thông tin thông qua các nút thiết bị
  • Các nút thiết bị cho phép hệ điều hành nhận biết từng loại thiết bị bộ điều vận và thực thể của thiết bị thông qua các số thiết bị
  • Mỗi thiết bị phần cứng thường sẽ có số thiết bị tương ứng (Tuy nhiên, không có gì giới hạn cho phép một thiết bị phần cứng tùy theo cấu trúc có thể nối kết được với nhiều tập tin thiết bị. Thí dụ: Trên một ổ cứng SCSI được phân chia làm hai ổ lôgic. Bản thân ổ cứng đó có thể được đại diện bởi tập tin thiết bị /dev/sda và mỗi phân hoạch (partition) của nó lại là một thiết bị con và do đó lại đưọc gán cho các nút thiết bị riêng là /dev/sda1 /dev/sda2 tương ứng)

Thí dụ:
#To see the content of a CD-ROM which has been inserted into CDROM drive which named as /dev/hda:
mount /dev/hda /mnt/cdrom/
ls /mnt/cdrom/
#Similar to a flopy disk has been inserted into the flopy drive /dev/fd0:
mount /dev/fd0 /mnt/flopy/
ls /mnt/flopy/
# to see all devices already mounted:
mount

A6.2 Nội dung của  /dev
/dev là thư mục chính chứa các tập tin thiết bị cũng như các socket.  Một số tập tin trong /dev thay vì là tập tin thiết bị thì nó có thể thay thế bằng các tập tin liên kết mềm.  Bảng thí dụ sau đây cho thấy vài nội dung chính của /dev

mềm: brw-rw---- 1 root floppy 2, 0 Aug 2 2004 fd0
IDE (cdrom hay ổ cứng): brw------- 1 root disk 3, 0 Aug 2 2004 hda
SCSI: brw-rw---- 1 root disk 8, 0 Aug 2 2004 sda
Modem - com1: crw------- 1 root root 5, 64 Dec 07 15:30 cua0
Modem - com1: crw------- 1 root root 4, 64 Mar 15 06:02 ttyS0
Liên kết thường thấy: lrwxrwxrwx 1 root root 3 Nov 11 12:05 cdrom -> hda
Liên kết thường thấy: lrwxrwxrwx 1 root root 5 Nov 11 12:05 mouse -> psaux
Liên kết thường thấy: lrwxrwxrwx 1 root root 10 Mar 10 15:59 /dev/fax -> /dev/ttyS2
Liên kết thường thấy: lrwxrwxrwx 1 root root 10 Mar 13 16:29 /dev/modem -> /dev/ttyS2
Thiết bị Loop : brw-rw---- 1 root disk 7, 0 Aug 2 2004 loop0
Thiết bị máy in: crw-rw---- 1 root daemon 6, 0 Aug 2 2004 lp0
Thiết bị SCIS tổng quát: crw------- 1 root sys 21, 0 Aug 2 2004 sga

 

 

 

 

 

 

 

 

Sau đây là một số tên tập tin thiết bị thường thấy:


/dev/tty*       Các đầu cuối, các cổng liên tục (serial port), và giả thiết bị (pseudo devices - dùng trong telnet).
/dev/fd*        Ổ mềm
/dev/mt*        Băng từ
/dev/mouse    mouse
/dev/cdrom   CD ROM
/dev/sd*       Ổ SCSI hay ổ USB
/dev/hd*       Ổ IDE (ổ cứng hay IDE CDROM)


Tùy theo hệ điều hành một số tập tin thiết bị có tên theo cú pháp quy định rõ ràng thí dụ như

  • SunOS 4.x - /dev/{r}sdAP
  • SunOS 5.x - /dev/{r}dsk/cCtAd0sS
  • HPUX 10.X - /dev/{r}dsk/cCtAd0{sS}
  • Digital Unix - /dev/{r}rzNP
  • Linux - /dev/sdLK
Trong đó 
      A = địa chỉ SCSI
   C = Số (thứ tự) bộ điều khiển SCSI
   K = Số thứ tự của partition dạng DOS 
   L =  Tên ổ (drive letter) từ  "a" tới "h" 
   N = 8 * số bộ điều khiển # + địa chỉ SCSI 
   P = Patition kiểu BSD: (a,b,c,d,e,f,g), 
   S = Lát chia (slice) kiểu System V (0,1,2,3,4,5,6).

Lưu ý: Để kiểm xem các phân hoạch của các ổ dữ liệu đã được gắn kết vào hệ thống tập tin trên Linux qua /dev có thể dùng lệnh df.

A6.3 Thiết bị xuất/nhập chuẩn (stdin, stdout, stderr)

Trong linux thì các thiết bị xuất nhập chuẩn như :

  • Bộ mô tả tập tin stdin chính là nút thiết bị /dev/fd/0
  • Bộ mô tả tập tin stdout chính là nút thiết bị /dev/fd/1
  • Bộ mô tả tập tin stderr chính là nút thiết bị /dev/fd/2

Lưu ý: khi lập trình C/C++ người ta có thể truy cập đến các thiết bị xuất nhập này (thí dụ dùng lệnh fd = open("/dev/fd/0", O_RDWR); nhưng dẫu sao bạn sẽ không thể viết lên thiết bị này vì nó là stdin tức là ngỏ nhập chuẩn)

A6.4 /dev/null

Đây là thiết bị NULL. Các thông báo từ các mệnh lệnh ra ngỏ stdout hay stderr nếu được đổi hướng vào NULL thì chúng sẽ không hiển thị nữa (mà thay vào đó chúng bị gạt bỏ).  Diều này tiện dùng trong các câu lệnh mà người gọi lệnh không cần thiết phải nhận về các thông báo cùng như khôngmuốn hiển thị chúng ra

Thí du:
cp -f file1 file2 1>/dev/null 2>/dev/null 
# this command will be processed but will not display if it is succeed or failed

6.5 /dev/zero:

Thiết bị đặc biệt này có nội dung chỉ chứa bit 0. Nó được ứng dụng trong trường hợp tạo ra một ổ nhớ RAM hay một thiết bị hồi chuyển (loop back)

Thí dụ1: tạo một ổ nhớ trong RAM
# how to create a  RAMDISK:
MNT=/mnt/ramdisk
MNT2=/mnt/ramfs
CNT=1000                 # 1MB RAM disk
BLCK=1024                # 1K (1024 byte) block size
DEV=/dev/ram0            #  ram device

if [ ! -d $MNT ] && [ ! -d $MNT2 ] ; then
    mkdir -p $MNT $MNT2
fi
dd </dev/zero >$DEV count=$CNT bs=$BLCK #read from /dev/zero and output to $DEV
mkfs.ext2 $DEV               # format an ext2 filesystem on it.
mount $DEV $MNT     # Mount RAM DISK to /mnt/ramdisk.
chmod 777  $MNT            
ls $MNT
# Above is, however, a long way to create a RAMDISK you may just do this command:
mount -t ramfs none $MNT2

Thí dụ2: tạo một ổ nhớ dạng hồi chuyển
# How to create a 1MB loopback device in FAT format
MNT=/mnt/loopback
CNT=2048                 # 1MB FAT volume
BLCK=512                 # 0.5K
IMG=./FATVOL             # FAT16 loop back device
if [ ! -d $MNT ]; then
    mkdir -p $MNT
fi
dd if=/dev/zero of=$IMG count=$CNT bs=$BLCK #read from /dev/zero and output to file FATVOL
mkfs.vfat $IMG           # format an ext2 filesystem on it.
mount -o loop $IMG $MNT          # Mount  to /mnt/loopback
chmod 777  $MNT            
echo "my 1st file" > $MNT/myfile.txt
ls $MNT

Lưu ý: Trong các thực nghiệm trên sau khi làm xong người dùng nên dùng lệnh umount để trả lại các ổ lưu trữ đạ tạo ra.

A6.5 /dev/loop<n>:

Đây là các tập tin thiết bị đặc biệt thường được dùng để truy cập nội dung của các tập tin ảnh (image file) của các ổ nhớ khác. Một hệ điều hành thường sẽ cung cấp từ 7 cho đến 32 nút thiết bị hồi chuyển như vậy bắt đầu từ /dev/loop0, /dev/loop1, .... (xem lại thí dụ )

Thí dụ1:  Truy cập 1 ổ initrd là ổ khởi động RAM  thường tìm thấy trong /boot
cp /boot/initrd ./initrd.gz   #the original image is often compressed
gzip -d ./initrd.gz           # It should extract initrd.gz into initrd
mkdir -p /mnt/initrd
mount -o loop ./initrd /mnt/initrd
#see how the /dev/loop<n> device plays
mount
#Now access it
ls /mnt/initrd
#end of the fun
umount /mnt/linitrd

Thí dụ2:  Truy cập một tập tin myCDROM.iso (tập tin *.iso là tập tin ảnh của các CDROM)
mkdir -p /mnt/cdrom
mount -o loop myCDROM.iso /mnt/cdrom
ls /mnt/cdrom

Lưu ý: trong thí dụ2 trên; có nhiều hệ điều hành Linux mới (dùng với X window) sẽ tự động mặc định gắn kết thư mục /mnt/cdrom với ổ CDROM mỗi khi thực sự có một diã trong ổ. Để tránh sự trùng lặp khi gắn kết này, có thể tạo ra một thư mục bất kìthay vì thư mục /mnt/cdrom

Một bài viết khá thú vị có thể giúp bạn có thêm vài cách hữu hiệu để truy cập lên các phân hoạch của ổ diã có thể tìm thấy ở  http://edseek.com/~jasonb/articles/linux_loopback.html

A6.6 Các thiết bị cần biết khác:

6.6.1 /dev/mem, /dev/kmem, /dev/port: 

/dev/mem là tập tin thiết bị  kiểu kí tự.  Nội dung của nó cũng chính là nội dung của bộ nhớ máy tính.  Các địa chỉ byte trong /dev/mmem được chuyển dịch như là địa chỉ thực của bộ nhớ (RAM), Người "root" có thể đọc tất cả nội dung bộ nhớ nếu biết được vị trí của thông tin đó ở đâu trong /dev/mem. Có thể thử đọc nội dung của /dev/mem bằng lệnh cat

Tương tự /dev/kmem hoàn toàn giống /dev/mem nhưng ở đây nó là hình ảnh bộ nhớ ảo của máy tính  

/dev/port cũng là một loại thiết bị kiểu kí tự nhưng ở đây chứa các thông tin I/O

6.6.2 /dev/hd<x><n>, /dev/sd<x><n>:  Cả hai loại này lần lượt theo thứ tự là các thiết bị lưu trữ kiểu IDE và SCSI Trong công thức tổng quát này thì <x> là các chữ trong bảng chữ cái Anh ngữ bắt đầu từ a và <n> (nếu có) sẽ là  số phân hoạch của thiết bị.

A7 Hệ thống tập tin Proc

proc (viết tắt của chữ process) là một hệ thống tập tin hay đúng hơn là một hệ thống tập tin giả (pseudo-filesystem) và được cập nhật theo thời gian thực (real time).  Đây là thư mục chứa lượng rất lớn thông tin rất có giá trị liên quan đến các tiến trình đang chạy, cũng như là các một phần thông tin về các thiết bị phần cứng đã được nối vào máy tính (nhiều thông tin về các thiết bị này đã được các hạt nhân phiên bản mới cho thông tin vào thư mục /sys). Một hệ thống tập tin proc mới được hạt nhân tạo ra mỗi lần kernel bắt đầu chạy và biến mất khi tắt máy.  Hệ thống tập tin này chứa trong bộ nhớ (RAM) và được hạt nhân gắn kết chúng vào với thư mục /proc.  Với /proc, người ta có thể:

  • Kiểm tra xem module (hay bộ điều vận) nào đã được tải
  • Xem xét trạng thái tức thời của hạt nhân
  • Sự phân bổ bộ nhớ của hạt nhân cho các tiến trình
  • Một số phương thức để điều chỉnh tham số của các giá trị cài đặt cho hạt nhân -- cũng như một số thao tát quản lý mà không phải tái khởi động máy
    Lưu ý:  việc thay đổi các cài đặt trong hạt nhân cũng như trong các thao tác quản lý là một công c vô cùng manh nhưng cũng là một "con dao hai lưỡi"  đòi hỏi người dùng máy phải biết rõ mình đang làm gì?  Mọi sai sót hay không hợp đều có thể gây hậu quả tai hại. Hơn nữa còn phải tùy theo phiên bản của hạt nhân có cho phép tiến hành việc điều chỉnh cụ thể hay không.

A7.1 Truy cập /proc

Nếu chỉ để dọc thông tin, có thể dùng lệnh ls, grep, cat, ... lên các tập tin bên trong /proc.  Tuy nhiên, kernel có thể đã gắn kết (mount) sẵn từ trước với thư mục /proc này bằng lệnh mount.

Thí dụ
mount -fv -t proc proc /proc
hay đơn giản hơn
mount -t proc proc /proc
Người ta chỉ có thể thay đổi các tham số trong /proc nếu như nó được mount dạng read-write. Có thể dùng lệnh grep để xem xem nó đã được gắn kết như thế nào:
grep 'proc' /proc/mounts
grep proc /proc/mounts
/proc /proc proc rw 0 0

(Thí dụ trên cho thấy /proc đã được gắn kết với proc dùng tham số rw tức là có thể truy cập đọc và viết lên nó)

Lưu ý: nếu dùng lện ls -l lên hầu hết các tập tin trong /proc thì sẽ nhận thấy chúng không chiếm hữu byte nào. Lý do là vì các "tập tin" này không hiện hữu (giả tập tin  - pseudo file) trên ổ cứng và được trực tiếp tạo ra từ hạt nhân.

A7.2  Các tập tin có ích trong /proc:

Để đọc nội dung của các tập tin trong /proc nhằm biết đến các thông tin về hạt nhân, hệ điều hành, phần cứng ....có thể dùng lệnh cat đọc các nội dung này. Một số tập tin (kể cả các tập tin nm trong thư mục con) quan trng bao gồm:

  • /proc/cmdline - Các tham số đã truyền vào hạt nhân khi khởi động
  • /proc/cpuinfo - thông tin chi tiết về CPU
  • /proc/devices - Danh sách các thiết bị có thể dùng
  • /proc/diskstats - Trạng thái các ổ nhớ
  • /proc/filesystems - Các hệ thống tập tin được hỗ trợ
  • /proc/meminfo - thông tin chi tiết về  RAM.
  • /proc/mounts - danh sách các hệ thống tập tin đang được gắn kết 
  • /proc/modules - Các module đang đưọc tải
  • /proc/partitions - Các phân hoạch
  • /proc/version - Số phiên bản của Kernel

Các thư mục quan trọng bao gồm:

  • /proc/asound - Thông tin về thiết bị âm
  • /proc/bus - Thông tin về BUS
  • /proc/driver - Thông tin về bộ điều hợp
  • /proc/fs - Thông tin về hệ thống tập tin
  • /proc/ide - Thông tin về IDE
  • /proc/irq - Thông tin về các ngắt
  • /proc/scsi - Thông tin về scsi
  • /proc/tty - thông tin về các đầu cuối
  • ...

Có thể thử xem nội dung của một tập tin trong thư mục này qua lệnh cat <tên_tập_tin>

7.3 Thông tin của các tiến trình:

Mỗi tiến trình đang chạy được biểu thị là các thư mục có tên chính là các số danh định của tiến trình đó.  Để có thể biết trạng thái của mỗi tiến trình có thể trước tiên dùng lệnh ps -A để tìm xem số danh định của tiến trình là bao nhiêu mới xem xét được.

Thí dụ: Giả sử bạn đang chạy trình duyệt mozilla.  Để đọc trạng thái của các tiến trình của mozilla có thể ra lệnh:

ps -A | grep "mozilla"

Nếu mozilla đang chạy bình thường thì hệ thống sẽ hiển thị dòng tương tự như sau:

    8768    ?    09:09:00 mozilla
  8774    ?    09:09:01 mozilla-bin

Cột đầu tiên là số tiến trình của mozilla và mozilla-bin.  Để truy cập trạng thái của nó có thể đọc các tập tin trong thư mục /proc/8768 /proc/8774 bằng lệnh ls và lệnh cat

7.4 Điều chỉnh các tham số của môi trường hay của hạt nhân:

7.4.1  Cách tiến hành :

Lưu ý: Các tham số đã có cài sẵn trong /proc thường rất hiệu lực, để cho máy chạy đưọc an toàn, mọi thay đổi không cần thiết có thể dẫn đến trục trặc không lường trước.  Chỉ nên tiến hành khi người dùng biết rõ hậu qủa công việc mình đang làm gì.
Các lệnh dùng để soạn thảo văn bản thông thường như
vi, vim và các lệnh tương tự trong X window không thể dùng để thay đôi các tham số trong /proc.
Lệnh soan thảo duy nhất có thể dùng với mức cẩn thận cao là echo <Các_Dòng_Cài_Đặt_Mới>" > <Tên_Tập_Tin_Trong_/proc>

Thí dụ1:  Thay vì dùng lệnh hostname <Tên_Máy_Chủ> để đổi tên máy chủ, có thể dùng cách sau đây:

#see the old hostname:
cat /proc/sys/kernel/hostname  #display the current hostname
$ echo "myhostname"  > /proc/sys/kernel/hostname
cat /proc/sys/kernel/hostname  #display the new changed hostname

Thí dụ2:  "Cắm nóng" hay "lấy ra" một ổ cứng kiểu SCSI khỏi các khe SCSI.  Một ổ cứng kiu SCSI có thể được thêm vào khi máy đang chạy (tuy nhiên điều này chưa chắc đúng với mọi bộ điều hợp và mọi kernel phải thử nghiệm trước và cẩn thận có thể là hư hệ điều hành khi tiến hành!) - Thí dụ này trích từ "Administer Linux on the fly" cuả Graham White

Có thể thử cắm trực tiếp 1 ổ SCSI mới vào trong một chỗ trống (nếu máy không bị treo) có thể dùng lệnh sau đây để kết nối "nóng":

echo "scsi add-single-device w x y z" > /proc/scsi/scsi

Trong đó các tham số w, x, y, và z phải là các giá trị đúng:

  • w là số định danh của bộ điều hợp chủ (host adapter ID), bộ điều hợp đầu tiên có số định danh là 0
  • x là số kênh SCSI (SCSI channel) trêng bộ đièu hợp chủ, Trong đó, kênh đầu tiên là 0
  • y số định danh SCSI (SCSI ID) của ổ cứng
  • z là số LUN, số LUN đầu tiên là 0

Ngược lại, có thể lấy ra một ổ SCSI (ổ này phải không hề có một tiến trình nào liên hệ tới - như là không có I/O , ...)

echo "scsi remove-single-device w x y z" > /proc/scsi/scsi

7.4.2  Các tham số thông dụng có thể điều chỉnh :

/proc/sys/fs/file-max : Số tối đa của thẻ quản lý tệp (file handle) Số này có thể tăng lên khi mà hệ thống không thể cho phép mở thêm tập tin (qua lệnh open).  Giá trị mặc định là : 4096

/proc/sys/fs/overflowuid và /proc/sys/fs/overflowgid Lưu giữ các UID và GID cho các hệ thống tập tin hỗ trợ 16-bit. Giá trị mặc định là: 65534

/proc/sys/fs/super-max: Số tối đa củ bộ quản lý siêu khối (super block handlers). Mọi hệ thống tập tin gắn kết vào máy đều cần dùng số siêu khối này; máy có thể cần tăng lên nếu máy tính gắn kết với nhiều hệ thống tập tin.Giá trị mặc định là: 256

/proc/sys/kernel/ctrl-alt-del là giá trị nhị phân cho biết cách thức ứng xử một khi tổ hợp phím ctrl+alt+delete được bấm: Giá trị mặc định là 0:

  • 0  -- cho phép hệ thống chuyển sang chương trình init (ngưng máy) cho phép máy tái khởi động sau khi ngừng các tiến trình. Tưong đương với lệnh shutdown.
  • 1 --  Tương đương với việc cắt ngang các tiến trình và tái khởi động lập tức.  Tương đương với việc tắt điện

/proc/sys/kernel/domainname Thay đổi tên miền (domain) của máy trong mạng.

/proc/sys/kernel/hostname Thay đổi tên máy chủ.

/proc/sys/kernel/msgmax Cho cỡ lớn tối đa các thông báo từ một tiến trình đến tiến trình khác. Tăng giá trị này sẽ làm tăng bộ nhớ tiêu dụng bởi hệ điều hành. Giá trị mặc định là: 8192

/proc/sys/kernel/msgmnb Số byte tối đa cho một hàng thông báo (message queue) riêng lẽ. Giá trị mặc định là: 16384

/proc/sys/kernel/msgmni Số tối đa các định danh (ID) hàng thông báo. Giá trị mặc định là: 16

/proc/sys/kernel/panic Lượng thời gian (giây) mà hạt nhân sẽ chờ trước khi tái khởi động nếu nó bị hiện tượng "kernel panic". Khi cài giá trị 0 sẽ không cho phép tự tái khởi động trong trường hợp như thế xãy ra. Giá trị mặc định là: 0

/proc/sys/kernel/printk Bao gồm 4 con số xác định khi nào các thông báo biên bản (logging message) được gửi ra tùy theo mức độ quan trọng của nó. (Dùng lệnh man 2 syslog để biết thêm chi tiết).  Bộ bố giá trị này là:

  1. Console Log Level: Các thông báo mức cao hơn mức này sẽ được hiển thị ra đầu cuối
  2. Default Message Log Level: Các thông báo không có quyền ưu tiên sẽ được hiển thị nếu ở mức ưu tiên này
  3. Minimum Console Log Level: giá trị nhỏ nhất (ở mức ưu tiên cao nhất) mà  Console Log Level có thể được cài
  4. Default Console Log Level: giá trị mặc định cho Console Log Level

Giá trị mặc định là: 6 4 1 7

/proc/sys/kernel/shmall Tổng số lượng bộ nhớ chia sẽ (shared memory) tính bằng byte có thể dùng ở bất kì thời điểm nào. Giá trị mặc định là: 2097152

/proc/sys/kernel/shmax Phân đoạn (segment) lớn nhất của bộ nhớ tính bằng byte cho phép trong hạt nhân. Giá trị mặc định là: 33554432

/proc/sys/kernel/shmmni Số tối đa các phân đoạn của bộ nhớ chia sẽ trong toàn bộ hệ thống. Giá trị mặc định là: 4096

/proc/sys/kernel/threads-max Số tối đa các phân luồng (thread) mà hạt nhân có thể dùng. Giá trị mặc định là: 2048

/proc/sys/net/core/message_burst thời gian đòi hỏi để có một thông báo cảnh cáo (tính bằng 1/10 giây.  Các cảnh cáo nhận được trong khoảng thời gian ngắn hơn sẽ bị bỏ qua.  Cách này dùng để ngăn chận các tấn công "Denial of Service" (Dịch vụ Khước từ) bởi nổ lực làm ngập chìm h thống máy tính bằng các thông báo. Giá trị mặc định là: 50 (5 seconds)

/proc/sys/net/core/message_cost Đánh giá giá trị của các cảnh cáo.  Gía trị này càng cao cảnh cáo càng dể bị bỏ qua. Giá trị mặc định là: 5

/proc/sys/net/core/netdev_max_backlog Số tối đa các gói có thể được xếp hàng (queue) khi giao diện nhận được các gói nhanh hơn khả năng xử lí của hạt nhân. Giá trị mặc định là: 300

/proc/sys/net/core/optmem_max Giá trị cỡ tối đa của bộ đệm cho phép của một ổ nối (socket).

/proc/sys/net/core/rmem_default Cỡ mặc định tính bằng byte của một bộ đệm ổ nối thu nhận (receive socket).

/proc/sys/net/core/rmem_max Cỡ tối đa (byte) của một bộ đệm ổ nối nhận.

/proc/sys/net/core/wmem_default Cỡ mặc định (byte) của một bộ đệm ổ nối gửi (send socket).

/proc/sys/net/core/wmem_max Cỡ tối đa (byte) của một bộ đệm ổ nối gửi.

/proc/sys/vm/buffermem Bộ 3 số điều khiển tổng phần trăm bộ nhớ của hệ thống dùng trong bộ nhớ đệm:

  1. Phần trăm nhỏ nhất của bộ nhớ nên được dùng cho các bộ đệm
  2. Hệ thống sẽ thử dùng và giữ lượng phần trăm bộ nhớ đệm này một khi bộ nhớ hệ thống bị cắt hay chỉ còn một lượng thấp của bộ nhớ hệ thống
  3. Số phần trăm tối đa của bộ nhớ có thể dùng cho các bộ đệm

Giá trị mặc định là: 2 10 60

/proc/sys/vm/freepages Điều khiển cách thức hệ thống phản ứng với các mức độ khác nhau của bộ nhớ còn tự do:

  1. Nếu số trang tự do đã đạt tới số giới hạn nhỏ nhất này thì chỉ có hạt nhân được phép cấp phát thêm bộ nhớ (cho các chương trình).
  2. Nếu số trang tự do xuống thấp hơn giới hạn này thì hạt nhân sẽ bắt đầu "swap" (dùng bộ nhớ ảo trên các ổ cứng) mạnh hơn để có lại các phần nhớ tự do và bảo toàn hiệu năng của hệ thống.
  3. Hạt nhân se cố giữ lượng bộ nhớ tự do này. Dưới nó, quá trình "swaping kernel" bắt đầu

Giá trị mặc định là:  512 768 1024

/proc/sys/vm/kswapd Điều khiển cách thức mà kernel được phép để "swap" bộ nhớ:

  1. Số tối đa các trang (page) mà hạt nhân cố gắng làm cho tự do trong 1 lúc.  Nếu muốn tăng "băng thông" của quát trnìh swap có thể tăng số này.
  2. Số lần nhỏ nhất mà hạt nhân cố gắng để làm tự do 1 trang trong mỗi thao tác swap.
  3. Số trang mà kernel có thể viết trong 1 lần swap. Số này ảnh hưởng lớn nha6't đến hiệu năng của máy. Số lơn hơn thì nhiều dữ liệu hơn sẽ được "swap" và ít thời gian bỏ ra hơn cho việc kiếm (seeking) ổ dĩa. uy nhiên, nếu lớn qúa, cũng sẽ ảnh hưởng tới hiệu năng của hệ thống do bỵ ngập bởi hàng yêu cầu (request queue)

Giá trị mặc định là: 512 32 8

A8 Bảng các tập tin thông dụng để tạo cấu hình cho Linux

Các tập tin sau đây sẽ có ích trong trường hợp bạm muốn cấu hình cho máy theo cách của mình và cùng có thể dùng trong các văn lệnh (nhất là các văn lệnh khởi động)

Tên Tập tin Mô tả
/etc/host.conf Cài đặt cách thức cho máy chủ miền (domain server) kiếm các tên chủ (hosname). Dùng lệnh man 5 host.conf để biết cách cấu hình.
/etc/hosts Danh mục các máy chủ đã biết tương ứng với IP. Có thể dùng IP cụ thể nếu hệ thống không tự động tạo ra (dhcp). Cho vic đặt tên miền đơn giản, /etc/hosts.conf thường yêu cầu nhìn và đây trưc khi hỏi tên máy chủ , DNS hay NIS.  Dùng lệnh man hosts xem chi tiết
/etc/issue
/etc/issue.net
Cá tập tin này được đọc bởi mingetty để hiển thị dòng "chào đón" khi người dùng nối từ một đầu cuối (issue) hay từ telnet (issue.net).  Chúng được dùng bởi rc.local.
/etc/<OS>-release số phiên bản phát hành của OS. Dùng bởi rc.local. (e.g. /etc/SuSE-release)
/etc/rc.d/rc Văn lệnh này thường được chạy trong mọi cấp độ (mà cấp độ này được dùng như là tham số của văn lệnh). Thí dụ ở cp độ 5, chạy chế độ đồ họa có thể dùng lệnh : init 5. Tức là chạy máy ở cấp 5 (tức là cấp của chế độ đồ hoạ).
/etc/rc.d/rc.local Văn lệnh  (có trong RedHat).Có thể được gọi từ  rc, rc.sysinit, hay /etc/inittab.
/etc/rc.d/rc.sysinit Đây là văn lệnh khởi động đầu tiên  được chạy (có trong RedHat)
/etc/rc.d/rc/rcX.d Các văn lệnh trong các thư mục rcX.d này sẽ được rc gọi (X là số cấp từ 1 tới 5) khi máy khởi động/đổi mức khởi động ở cấp X.  Các văn lệnh có tên với tiền tố Sxx<Tên_Văn_lệnh> (xx là hai số tự nhiên từ 00 đến 99) sẽ được gọi khi khởi động và các văn lệnh với tiền tố Kxx sẽ được gọi nếu có đổi trạng thái khởi động (như là khi tắt máy chẳng hạn).  Văn lệnh có tiền tố với số nhỏ hơn sẽ được thi hành trước
/etc/group Chứa các tên nhóm còn hiệu lực và tên người dùng trong các nhóm.  Một người dùng có thể có tên trong nhiều nhóm và có thể thực hiện được nhiều thao tác mà nhóm có tên cho phép.
/etc/nologin Nếu tập tin này tồn tại, login(1) chỉ cho phép người dùng  root truy nhập. Các người dùng khác bị từ chối khi đăng nhập.
etc/passwd chứa các thông tin về tài khoản người dùng, GID, UID và trình bao mặc định cho người dùng đó
/etc/rpmrc Tập tin cấu hình của lệnh rpm.
/etc/securetty Chứa các tên thiết bị của tty  trong đó sẽ cho phép root đăng nhập.
/etc/usertty
/etc/shadow
Chứa các mật khẩu mã hoá của các tài khoản và có thể có thông tin về tuổi tác của mật khẩu. Các miền bao gồm:
  • Tên đăng nhập
  • mật khẩu mã hoá
  • Số ngày kể từ tháng 01 Giêng, 1970 mà mật khẩu này đổi lần cuối
  • Số ngày trước khi mật khẩucó thể được thay đổi
  • Số ngày mà mật khẩu phải được thay đổi sau đó
  • Số ngày truớc khi mật khẩu bị hết hạn mà người dùng bị cảnh báo
  • Số ngày sau khi mật khẩu bị hết hạn thì tài khoản bị đóng
  • Số ngày kể từ 1 tháng Giêng 1970 mà tài khoản đã bị đóng 
/etc/shells Danh mục các trình bao mà hệ thống hiện có
/etc/motd "Message Of The Day"; được dùng nếu quản lí muốn gửi vài thông báo tới mọi người.
/etc/mtab Đây chính là nội dung của tất cả các thiết bị hiện đang gắn kết với hệ thng (xem thêm  /proc/mount và lệnh mount) .
/etc/fstab Danh sách tất cả các hệ thống tập tin có thể gắn kết được với máy tính.Khi máy khởi động nó se dùng tập tin này qua lệnh mount -a  và các hệ thống tập tin nào có đánh số 1 ở cột kế chót trong fstab sẽ được gắn kết vào Linux
/etc/mtools.conf Cấu hình cho mọi thao tác trên các hệ thống tập tin kiểu DOS.
/etc/networks Danh sách tên địa chỉ của các mạng mà có thể truy cập được từ mạng tới máy được nối.
/etc/protocols Danh sách các giao thức hiện có và dùng được với giao thức TCP/IP. Xem thêm  man protocols
/etc/resolv.conf Thông báo kernel tên máy chủ nào nên được truy trả khi có chương trình yêu cầu "giải quyết" một địa chỉ IP
/etc/rpc Các chỉ thị và quy tắt cho RPC có thể được dùng trong các việc gọi NFS,  (gắn kết từ xa với các hệ thống tập tin, vv).
/etc/exports Các hệ thống tập tin được cho xuất  (NFS) và các phép truy cập của chúngt.
/etc/services Chuyển dịch các tên dịch vụ mạng (network service name) sang thành số cổng/giao thức (port number /protocol). Sẽ dưc đọc bởi  inetd, telnet, tcpdump, ....
/etc/sysconfig Các tập tin cấu hình cho nhiều chương trình ở thư mục này
/etc/sysconfig/network Chức các tập tin cấu hình cho mạng
/etc/logrotate.conf Bảo trì các  tập tin log trong thư mục /var/log .
/etc/ld.so.conf Tập tin cấu hình cho bộ liên kết động (Dynamic Linker)
/etc/inittab Tập tin cấu hình đầu tiên trong Linux/UNIX ; chương trình khởi động đầu tiên là init sẽ dựa trên inittab để chạy cho đúng tuỳ theo cấp và cũng dùng nó để điều khiển quá trình  khởi động  chính.
/etc/termcap Là cơ sở dữ liệu chứa mọi kiểu đầu cuối (terminal) và khả năng của chúng.
/etc/syslogd.conf Cấu hình cho trinh nền (daemon)  syslogd. syslogd là trình nền lo về các thông báo đăng nhập đến từ các chương trình bên khác vào hệ thống.

/etc/httpd.conf
Cấu hìch cho máy chủ WEB: Apache, the Web server. Thường tập tin này không có trong /etc. Nó có thể tìm thấy trong  /usr/local/httpd/conf/ hay /etc/httpd/conf/
/etc/conf.modules
/etc/modules.conf
Tập tin cấu hình cho kerneld. Đây là trình nền lo về việc tải thêm các module hạt nhân trong thời gian chạy (run time) khi cần.
/etc/xinetd.conf Cấu hình cho deamon xinetd.  Được dùng trong nhiều chương trình như là ftp, telnet, vns, talk,....
/etc/xinetd.d Thư mục chứa các tập tin cấu hình cho nhiều úng dụng qua mạng như tp, telnet, vns, talk,....

A9 Các tập tin tài nguyên thông dụng cho tài khoản người dùng

Các tập tin tài nguyên sau đây được dùng để tạo môi trường thuận tiện hay phù hợp với tài khoản người dùng; có thể dùng trong các văn lệnh để điều chỉnh một cách nhanh chóng các cài đặt cho người dùng

 
Tên tập tin Mô tả
~/.bash_profile Nguồn điều chỉnh cho trình bao bash sau khi dùng  /etc/profile.
~/.bash_history Danh sách các mệnh lệnh đã thi hành.
~/.bashrc  Nguồn điều chỉnh môi trường cho các trình bao không tương tác (non interactive). Nếu tập tin không tồn tại thì chỉ có các biến  môi trường và biến toàn cục của bash được cài.
~/.emacs Được dùng bởi emacs khi bắt đầu chạy.
~/.forward Nếu tập tin này chứa một địa chỉ email thì tất cả các thư diện tử gửi tới chủ nhân của ~ sẽ được chuyển tới địa chỉ email này
~/.fvwmrc ~/.fvwm2rc Cấu hình cho fvwm và fvwm2 (là hai trình quản lí cơ sở cho X Window).
~/.hushlogin Tạo ra việc đăng nhập "lặng lẽ" không có thư thông báo
~/.mail.rc Tập tin tài nguyên cho chương trình email
~/.ncftp/ Thư mục chứa các thông tin khi nối vào internet nhằm tạo một giao diện mạnh và uyển chuyển cho FTP tiêu chuẩn. Được thiết kế để thay thế chương trình ftp mặc định  của hệ thống.
~/.profile Giống như tập tin ~/.bash_profile
~/.exrc Cấu hình cho chương trình soạn thảo văn bản vi
Thí dụ: set ai sm ruler
~/.vimrc Cấu hình  cho vim hoàn toàn tương tự.exrc.
~/.gtkrc Tài nguyên cho GNOME Toolkit.
~/.kderc Cấu hình KDE.
~/.netrc Tên mặc định và mật khẩu cho  ftp.
~/.rhosts Dùng bởi r-tools: rsh, rlogin, .... Rất yếu trong an toàn
~/.rpmrc được đọc bởi  rpm nếu /etc/rpmrc không tồn tại
~/.signature Các dòng thông báo sẽ được tự động thêm vào cuối thư khi được gửi từ tài khoản này
~/.twmrc Cấu hình cho twm (The Window Manager).
~/.xinitrc Đưuợc đọc bởi X khi khởi động chương trình. Hầu như dược dùng để chạy chương trình :.
Thí dụ dòng : exec /usr/sbin/startkde
được thêm vào sẽ làm cho trình quản lý cửa sổ KDE bắt đầu mỗi lần lệnh startx được gọi  khi dùng tài khoản này
~/News/Sent-Message-IDs Danh mục lịch sử các tập  tin email cho GNU.
~/.Xauthority Đọc và viết bởi chương trình xdm để xử lí chủ quyền .
~/.Xdefaults,
~/.Xdefaults-hostname
Đọc bởi các ứng dụng X trong thời gian bặt đầu chạy trên một tên chủ.  Nếu tập tin hosname không tim thấy thì sẽ tìm .Xdefaults thay vào.
~/mbox mail cũ của người dùng.

Bài kì tới: Toán tử, Vòng lặp, và Biểu thức chính quy, lệnh grep, đào sâu thêm thao tác chuyển hướng

 

 

© http://vietsciences.free.fr , http://vietsciences.org  và http://vietsciences2.free.fr  Làng Đậu Võ Quang  Nhân