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>
và <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ự
và
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,
và
/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 nằm
trong thư mục con) quan trọng 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
và /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
kiểu 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à:
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
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
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
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:
- Phần trăm nhỏ nhất của bộ nhớ nên được dùng cho các
bộ đệm
- 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
- 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:
- 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).
- 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.
- 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ớ:
- 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.
- 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.
- 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 việc đặ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ụ ở cấp độ 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ệ thống
(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 |