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   28/09/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ụch đí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ục đích giáo dục xin liên lạc về vo_quang_nhan@yahoo.com

Bài 1:

2. Lên đường:

2.1 Những lưu ý tổng quát:

Các văn lệnh đều là các tập tin văn bản (text) thông thường và do đó chỉ cần thoả mãn các luật chung của Linux/UNIX về tên và định dạng của tập tin văn bản là đủ. Mặc dù vậy, để có thể thi hành được trọn vẹn, thì một tập tin văn bản phải có thuộc tính khả thi (executable) và dĩ nhiên nó phải không có lỗi viết mã.  Hãy dùng lệnh chmod +x <TÊN_VĂN_LỆNH> để chỉ thị giá trị khả thi cho chương trình mà bạn viết thử.  Bạn có thể mượn bất kì một chương trình soạn thảo văn bản đơn giản nào để viết mã như là vi (vim), KWrite, Late hay ngay cả Word Perfect để tạo một văn lệnh nhưng hãy nh lưu giữ nó đưới dạng văn bản thông thường (text) hay ASCII.

Bạn cùng có thể soạn thử văn lệnh bằng wordpad hay các chương trình soạn thảo của Windows; Tuy nhiên, khi chạy trên Linux nó có thể cần phải chuyển được dịch ra dạng văn bản Linux (thí dụ dùng lệnh:
dos2unix <TÊN_TẬP_TIN>
để chuyển đổi định dạng. Tuy nhiên, tôi không khuyên bạn làm cách này vì lẽ một người dùng Linux không thể nào không biết cách tạo văn bản đơn giản bằng công cụ Linux mà không phải mượn bất kì thứ gì bên ngoài (Nếu mượn Windows để soạn thảo văn lệnh Linux thì giống như người lấy kìm nhổ đinh để ... nhổ răng: cái kìm phải bị "mài" dũa lại nếu không bạn sẽ làm hại "cái gốc con người") (1)(2)

Một khi đã có script thì bạn có thể thi hành (gọi) script đó bằng dòng lệnh bash <TÊN_VĂN_LỆNH> hay chỉ cần nhập <TÊN_VĂN_LỆNH> để thực thi các mệnh lệnh trong tập tin.

Khi viết script lần đầu tiên, bạn nên tìm hiểu cách dùng của một số lệnh hệ thống quan trọng như là ls, cat, cp, mkdir, rm, rmdir, chmod, ... Bạn có thể tìm thấy các lệnh này trong phần phụ luc cuối bài.

Bạn phải có một đầu cuối màn hình (console screen) để viết và thử nghiệm các văn lệnh. Trong đa số các trường hợp, ban có thể dùng một đầu cuối X (X terminal) - bằng cách gõ lệnh xterm hay bằng cách nhấn vào trình đơn (menu) gọi màn hình Terminal Emulation). Tuy nhiên, khi chạy các script trong X Window, thì nhiều thông báo từ lệnh mà bạn dùng trong script có thể bị cắt bỏ bởi các phần mềm đó và bạn sẽ có ít dịp để tìm hiểu sai sót (nếu có) hơn.

Một cách tốt là hãy nhấn tổ hợp phím <ctrl>+<alt>+<F1> để đăng nhập vào một đầu cuối riêng biệt.

Nếu bạn là người dùng "root" thì khi dùng dưới dạng này bạn sẽ toàn quyền chạy tất cả các lệnh hệ thống không bị một giới hạn nào.   Tuy nhiên, đây là con dao hai lưỡi vì khi bạn có 1 thao tác sai lầm thì lập tức sẽ ảnh hưởng tới máy.

Lưu ý:  Khi thực tập trên máy, hãy thật sự cẩn thận với các câu lệnh mà bạn dùng trong văn lệnh của mình.  Nhất là các câu lệnh có tính chất phá hủy như lệnh xoá tập tin, xóa người dùng, ... hay các lệnh có tính thay đổi đặc tính quản lý của hệ thống.

Quy ước chung dùng trong các bài giảng: Để tiện trình bày thông tin cho thật chính xác các quy ước sau đây sẽ được sử dụng. Lưu ý rằng, các điều này chỉ là quy ước riêng của loạt bài giảng.

  • Do kiến trúc của Linu/UNIX quy định nên các thư mục hay các thiết bị khác đều được xem là một tập tin. Và tên đầy đủ của của một tập tin sẽ bao gồm đường dẫn (path) và tên của chính tập tin đó.

  • Tên đầy đủ của thư mục mà nó chứa tập tin được gọi là đường dẫn của tập tin đó

  • Nếu không có lưu ý thêm thì các cụm từ "TÊN_TẬP_TIN" hay "TÊN_VĂN_LỆNH" được hiểu là tên đủ của tập tin bao gồm đường dẫn (path) và tên riêng của tập tin hay văn lệnh đó.

  • Chữ tên riêng (hay đôi khi một chữ "tên" nếu không bị nhầm lẫn) có nghiã là tên của tập tin mà không có đường dẫn đi kèm. Thí dụ: tên riêng của một thư mục trong dạng tên đầy đủ  /usr/local/share/man sẽ là man.  Tương tự, tên riêng của một tập tin mà có dạng đầy đủ là /etc/init.d/crond sẽ là crond

2.2 Kí tự quy ước và lệnh dạng kí tự: 

Trong BASH, các kí tự đặc biệt như là ~,`,@,#.$.%,&,*,?,<,>,;,",... đều có thể mang các ý nghiã quy ước riêng. Một số lớn trong chúng thực sự là các mệnh lệnh đặc trưng.  Sau đây là một số kí tự và  ý nghĩa quy ước cần biết khi viết mã.  Số khác được dùng trong các phép toán hay các mệnh lệnh mở rộng đặc biệt sẽ được trình bày ở các bài giảng sau

2.2.1 Dòng bị chú với dấu

Tương tự như các ngôn ngữ khác, trong BASH người ta có thể viết các dòng thông tin mà trình dịch sẽ không có tác động trực tiếp và được dùng làm các dòng bị chú

2.2.1.1 Dòng bị chú thông thường:  Trong BASH, để tạo một dòng bị chú chỉ cần đặt ở đầu dòng dấu #.  Khác với C++, người ta không thể viết một bị chú với nhiều dòng liên tục (bằng cách sử dụng các dấu kiểu /* các dòng bi chú */

2.2.1.2 dòng bị chú thông báo trình dịch:  Đặc biệt dòng bi chú bắt đầu bởi  #!đường_dẫn_cho_trình_dịch sẽ được dành riêng để máy biết được người viết mã muốn dùng trình thông dịch nào để chạy mã nguồn.  (Vì BASH là ngôn ngữ tương thích được với nhiều loại khác như Korn và C-shell).   Dòng thông báo này nên được đặt ở dòng mã đầu tiên trong tập tin Với cách này người ta có thể chạy một tập tin văn lệnh bằng nhiều phiên bản hay trình dịch khác nhau (chỉ cần thay đổi dòng bị chú về trình dịch)

Thí dụ: 

        #!/bin/bash
    # the line above request to run bash from /bin (not from anywhere else)
    #File name: test1
    #This is comment line
    echo "Hello World!"
    #the only command to be run in this script is 'ls -al'

Hãy soạn và lưu nội dung trên trong tập tin tên test1 ngay tại thư mục đang hoạt động, rồi dùng lệnh
chmod 755 ./test1 (
hay lệnh chmod +x ./test) để làm cho nó khả thi và chạy nó bằng lệnh ./test1.
 Từ đây về sau, các bài thí dụ sẽ không nhắc lại làm thế nào để cho 1 văn lệnh trở thành thi hành được

2.2.2 Dấu phân cách ;  thay thế cho kí tự xuống hàng (cariage return) :

Trong các văn lệnh Linux, mỗi câu lệnh đơn giản có thể tự nó đứng riêng thành một dòng.  Để có thể viết một dòng với nhiều lệnh có thể dùng dấu ; để ngăn cách giữa các câu lệnh này.  Hơn nữa, trong trường hợp một câu lệnh bao gồm nhiều dòng thì người lập trình có thể viết chung thành một dòng nhưng phải để dấu ; ngăn cách giữa các câu lệnh với nhau và dùng ; trong thay cho các dấu xuống hàng trong một câu lệnh có nhiều dòng. Tuy nhiên, lưu ý rằng, ở giữa hai câu lệnh trong một tập tin mã nguồn BASH, các kí tự xuống hàng hay kí tự  "space", "tab" có thể được đặt nhiều hơn 1 lần và do đó, giữa hai câu lệnh, bạn hoàn toàn có thể đặt vào trong đó tùy ý nhiều dấu ;  nhưng điều này chỉ gây ra bất tiện và không làm thay đổi chức năng vận hành ngoại trừ việc làm cho trình dịch đọc và thi hành mã lâu hơn.

Thí dụ:  Hãy xem thi dụ dau đây gán cho biến a giá trị bằng 1, và sau đó kiểm nghiệm lại bằng câu lệnh if - else: Nếu đúng giá trị của a bằng 1 thì hiển thị dòng "succeed", nguọc lại sẽ hiển thị dòng "failed".  ($a là biểu thức chỉ nội dung giá trị mà biến a lưu giữ)              

#!/bin/bash
a=1
if [ $a = 1 ] 
then          
        echo "succeed"
else          
        echo "failed"
fi            


# gán cho biến a giá trị 1 
# nếu a có giá trị bằng 1
#thì 
#in ra dòng chữ "succeed"
#nếu không thì
#in ra dòng chữ  "failed"     
#kết thúc câu lệnh "if"

Thay vì viết cách thông thường như trên người viết mã có thể thay vì xuống hàng thì thay vào đó bằng dấu  ;  và nội dung tập tin trở thành:

            #!/bin/bash
        a=1;  if [ $a = 1 ]; then  echo "succeed"; else echo "failed"; fi

Hay là:

        #!/bin/bash
        a=1; 
        if [ $a = 1 ]
        then  echo "succeed"
        else echo "failed"
        fi

Dĩ nhiên, mỗi cách viết có ưu khuyết điểm riêng về sự trình bày nhưng nếu viết đúng chúng đều không ảnh hưởng gì đến chức năng hay thứ tự khi vận hành. Tuỳ theo thói quen và  cách nhìn người viết mã có thể trình bày sao cho dễ hiểu. Cùng một  nội dung như trên có thể viết lại như sau:

             #!/bin/bash
        a=1
        if [ $a = 1 ]; then
                echo "succeed"
        else
                echo "failed"
        fi  

Lưu ý : Không thể đặt dòng lệnh bắt đầu bằng dấu # làm hàng bị chú rồi ngăn nó với một câu lệnh thực thụ khác với câu bị chú bằng dấu ; Vì khi đó, toàn bộ dòng này sẽ được trình dịch hiểu là câu bị chú nên sẽ bỏ qua

2.2.3 Lệnh trống ':

Trong BASH, dấu : được quy ước là một lệnh trống tức là câu lệnh không thi hành gì hết (tương đương với dấu ; trong C/C++ hay tương đương với lệnh nop; trong ASM). Lệnh này luôn luôn có gía trị luận lý trả về là true

Thí dụ:  

        #!/bin/bash
      let "n = 1"
      while :
      do
            echo "value of n is $n"
            let "n += 1"
            if [ $n -ge 3 ]
            then
                    echo "program terminated."
                    break
            fi
      done

Khối mã trên hoàn toàn tương đương với khối mã sau -- chỉ trình bày khác đi và thay : bởi (true):

    #!/bin/bash
      let "n = 1"
      while (true); do
            echo "value of n is $n"
            let "n+=1"
            if [ $n -ge 3 ]; then
                    echo "program terminated."
                    break
            fi
      done

Cả hai khối trên khi thực thi đều sẽ cho kết quả :

    value of n is 1
    value of n is 2
    value of n is 3
    program terminated.

Trong thí dụ trên, sau khi biến n được cài đặt giá trị ban đầu là 1 thì vòng lặp sẽ được tiến hành. Trong mỗi chu kì, biến n được tăng giá trị 1 đơn vị; câu lệnh  if sẽ kết thúc vòng lặp này một khi n > 3. Như vậy vòng lặp sẽ chạy vô hạn lần nếu thiếu câu lệnh break trong trường hợp này. "con kiến mày lèo cành đa leo phải vòng lặp leo ra leo vào"

Lưu ý:  Trong các mệnh đề điều kiện và cả lệnh gán trực tiếp giá trị (chẳng hạn như [ $n -ge 3 ]a=1) thì số luợng các khoảng trống (space) ở giữa các toán tử và phép toán phải theo đúng cú pháp chặc chẽ nếu không trình dịch có thể báo lỗi hay không thực đúng như mong muốn  (trong chẳng hạn ở trên thì không thể viết thành [$n -gt 3] hay 'a = 1'. Tuy nhiên lệnh 'let' lại cho phép đặt các toán tử và phép toán ở vị trí thỏi mái hơn (tức là các cách viết let "n+=1", hay let " n += 1", hay let "n +=1" đều được chấp nhận và tương đương nhau

2.2.4 Nhóm lệnh (dùng trình bao con)  (KHỐI_LỆNH) :

Trong mã nguồn, nếu có một nhóm lệnh nếu muốn được thực thi riêng lẽ độc lập bằng cách gọi lại trình bao để thực thi thì có thể nhóm chung lại trong cặp dấu ngoặc đơn.  Vì trình bao của chương trình chính chịu trách nhiệm gọi lại chính mình để thực thi khối lệnh nằm trong dấu ngoặc nên ta gọi nó là "trình bao con" (sub shell).

Thí dụ:

       #!/bin/bash
    touch myfile
    mkdir test
    (cd test; cp ../myfile .; cd ..)

Trong thí dụ trên, lệnh touch tạo ra một tập tin không có nội dung là myfile, lệnh mkdir dùng để tạo ra một thư mục là test (cd test; cp ../myfile .; cd ..) sẽ gọi một trình bao con để thực thi nhóm lệnh bao gồm di chuyển thư mục hiện hoạt (current directory) tới thư mục test, chép tập tin myfile từ thư mục cha vô đó, rồi di chuyển hoạt vị trở ra.

2.2.5 Nhóm lệnh { KHỐI_LỆNH; }

Giống như 2.2.4 nhưng ở đây, trình bao hiện tại sẽ chuyển sang thực thi nhóm lệnh này mà không tự gọi trình bao khác thực thi nó.  Khi sử dụng cách này, lưu ý là giữa các câu lệnh phải hoặc là có dấu '; ' hoặc là dấu đầu dòng (xuống hàng mới) và phải có khoảng trống ở giữa dấu ngoặc nhọn với các câu lệnh.  Cách dùng nhóm lệnh này thông dụng khi định nghiã hàm hay dùng trong các vòng lặp

Thi dụ: hai nhóm lệnh sau đây là tương đương

    { cd test; cp ../myfile . ; cd ..; }

hay:

    {
        cd test
        cp ../myfile .
        cd ..
    }

2.2.6 Ngoặc mở rộng lệnh {THAM_SỐ1,THAM_SỐ2,THAM_SỐ3, ...} :

Trong trường hợp một lệnh BASH chấp nhận tham số  để yêu cầu lệnh này thi hành lại vói các tham số khác thì có thể đặt các tham số này vào trong cặp dấu móc. Cách thức này còn được gọi là mở rộng dấu ngoặc (Brace expansion)

Thí dụ1:  dòng lệnh sau đây cho phép người đọc yêu cầu hiển thị danh sách các tập tin có tên mở rộng (extension)  .h và .cpp bên trong thư mục tên là test:

ls test/{*.cpp,*.h}

Lệnh trên tương đương với hai lệnh:

ls test/*.cpp; ls test/*.h

Thí dụ2: dòng lệnh sau đây sẽ cho phép chép (copy) hai tập tin là myfile.cpp myfile.h vào trong thư mục test:

cp {myfile.cpp,myfile.h} test

Thí dụ3: Dòng lệnh này sẽ giúp tạo một lúc 3 thư mục con trong /home/myname là old ,new và report

mkdir /home/myname/{old,new,report}

Lưu ý: 

  • Không phải lệnh hệ thống nào cũng hổ trợ dấu ngoặc mở rộng (như lệnh find chẳng hạn)
  • Để thử nghiệm mã nêu trên, trong cả hai thí dụ, thì thư mục test phải tồn tại và thêm vào đó, đối với thí dụ2, trong thư mục hiện tại (current directory) phải có sẵn hai tập tin myfile.cpp và myfile.h
  • giữa các dấu phẩy ',' bên trong cặp dấu móc { } sẽ không được để một khoảng trống nào từ ngoại trừ tên của các tham số. Nếu viết sai cú pháp này thì trình dịch sẽ báo lỗi

2.2.7 Ngoặc khối mã {... }:

Để phân lập riêng một đọan mã người lập trình có thể đặt mã đó vào giữa cặp dấu móc { } tạo thành một khối mã. Tuy nhiên, trong trường hợp dùng khối mã thông thường thì việc viết mã trong một khối chỉ có tính hình thức, việc dùng cặp dấu móc này sẽ có ý nghĩa hoàn toàn khi chúng có được giá trị phân lập thực thụ  (như  trong trường hợp dùng khối mã để định nghiã hàm)

Thí dụ1:  Hai đoạn sau đây là hoàn toàn tương đương

#!/bin/bash
ls
{
cd test
cp myfile yourfile
cd ..
}

#!/bin/bash
ls
cd test
cp myfile yourfile
cd ..

Thí dụ2:  Thí dụ về hàm sau sẽ làm cho định nghiã khối mã trỏ nên có ý nghiã

    #!/bin/bash
    function Welcome
    {
        echo "Welcome to $NAME"
        echo "today is `date`"
    }

    NAME="myName"
    Welcome

Lưu ý : Trong nhiều ngôn ngữ lập trình (như C/C++ chẳng hạn) thì một biến mới được định định nghĩa bên trong khối lệnh chỉ có giá trị nội bộ và chúng sẽ mất hiệu lực (hay ngay cả bị trình dịch bắt lỗi) nếu dùng chúng bên ngoài khối lệnh. Điều này không đúng với BASH, nghiã là, một khi biến được định nghiã, thì nó sẽ có giá trị địa phương cho toàn bộ tập tin chứa định nghiã đó mà không bị giới hạn nội bên trong khối mã như trường hợp C/C++. 

2.2.8 Thực thi các mệnh lệnh và gán kết quả cho một biến hay một biểu thức bằng  `<KHỐI_LỆNH>`  hay bằng $(<KHỐI_LỆNH>)

Dấu huyền '`' (backtick) là một toán tử trong Linux. Nếu đặt một dòng lệnh vào giữa hai dấu '`' (xem như các dấu ngoặc đặc biệt) sẽ có nghiã là yêu cầu trình dịch BASH thực thi câu lệnh ở trong ngặc này trả về các dữ liệu xuất từ ngõ ra của câu lệnh đó.  (Do đó, nếu lệnh này không được gán vào giá trị của một biến hay biểu thức thì hầu như bạn sẽ bị báo lỗi.

Thí dụ1:    Đoạn mã sau đây sẽ đọc nội dung của tập tin account_file và lọc ra string "Dung Vo"

    a=`cat account_file | grep "Dung Vo"`
    if [ "$a" = "" ]; then
        echo "There is no string 'Dung Vo' in the account_file"
    else
        echo "the sring :'Dung Vo'  matched in account_file!"
    if   

Thí dụ 2 : Vòng lặp for sau đây sẽ nhận các dữ liệu từ ngõ ra của lệnh ls và sau đó kiểm xem các tên đó là thư mục (directory), tập tin (file), hay thành phần đặc biệt.để hiển thị.

for file in `ls`; do
    if [ -d $file ]; then
        echo "$file if a directory"
    elif [ -f $file ]; then
        echo "$file is a regular file"
    else
        echo "$file is a specific file".
    fi
done

Thí dụ3: Gán tất cả các thông tin trong tập tin list.txt và thêm vào đó dòng có chữ congratulation ở dòng đầu tiên để sử dụng vào nhiều nơi khác nhau mà không phải gọi lại tổ hợp mệnh lệnh này

WIN_LIST=$(echo "*** Congratulation ***"; cat list.txt)
echo "$WIN_LIST"

2.3 Các kí tự đổi hướng xuất nhập:

2.3.1 Đổi hướng xuất từ stdout sang tập tin >:

Để có thể chuyển hướng các thông tin từ ngõ xuất (output) của một mệnh lệnh đưa trực tiếp vào tạo thành nội dung của một tập tin mới hay một ngõ ra chuẩn (stderr, stdout) (3) , ta có thể dùng kí tự lớn hơn '>' để làm việc này. (Xem thêm phụ lục các thiết bị quan trọng trong Linux)

Thí dụ1: Câu lệnh dùng để chuyển tất cả các hiển thị từ stdout của lệnh myscript tạo thành nội dung của tập tin my_file.  việc làm này sẽ xóa toàn bộ tập tin my_file cùng tên (nếu có)

    myscript  > my_file   

Thí dụ2: Tất cả các dữ liệu xuất ra từ hai ngõ stdout và stderr đều được chuyển vào nội dung của tập tin my_file

    myscript &>my_file

Lưu ý: Câu lệnh trên tương đương với câu lệnh:

    myscript  > my_file  2>&1

Thí dụ3: Chuyển nội dung thông tin xuất ra từ lệnh myscript vào thẳng stderr; với cách này thì tất cả thông tin xuất của myscript theo ngõ stdout cũng sẽ trở thành thông tin xuất từ ngõ stderr (nghĩa là một cách dùng để thông báo lỗi)

    myscript >&2

Thí dụ4: 

    mycommand  1>/dev/null 2>/dev/null

Thí dụ5: Sử dụng kĩ thuật nhóm lệnh để xuất các thông báo chuẩn từ stdout của các câu lệnh vào làm thành một tập tin myfile:

    (echo "The file list of the current directory today are:"; date; ls -A)> my_log_file

2.3.2 Đổi hướng xuất từ stdout chép nối vào tập tin >>:

Tương tự như khi dùng dấu '>' . Điểm khác ở đây là thay vì xoá tập tin cùng tên nếu có thì dấu thực thi lệnh chuyển hướng '>>' chỉ chép thông nối tiếp vào phần sau của tập tin

Thí dụ1: Câu lệnh sau đây sẽ có chức năng gần giống với thí dụ5 ở trên (2.3.1) và dĩ nhiên trong thí dụ 5; nếu tập tin my_log_file đã có từ trước thì nó sẽ bị thay thế bằng tập tin my_log_file mới  trong khi thí dụ sau sẽ không xoá mà chép tiếp vào đó.

echo "The file list of the current directory today are:" >> my_log_file
date >> my_log_file
ls -A >> my_log_file

Xem như bài tập:  Hãy điều chỉnh  các dòng lệnh trong thí dụ trên sao cho nó trở thành hoàn toàn tương đương với thí dụ 5 trong 2.3.1

2.3.3 Đổi hướng nhập stdin để nhập từ tập tin (hay dòng mã trực tiếp) <:

2.3.3.1 Đổi hướng từ stdin sang đọc từ một tập tin:

Thí dụ1 :  Dòng lệnh sau dùng để hiển thị nội dung tập tin my_file.  Nó tương đương với lệnh cat my_file

    cat <  my_file   

Thí du2: Dòng lệnh sau đây dùng để chép toàn bộ dữ liệu trong thiết bị /dev/sda (thường là một ổ cứng) sang thành một tập tin (nhằm mục đích lưu trữ) và nó tương đương với lệnh
dd if=/dev/sda of=my_backup

    dd </dev/sda  >my_backup

Và để phục hồi lại trong truờng hợp ổ cứng tên /dev/sda bị hư có thể dùng lệnh dd <my_backup >/dev/sda

Lưu ý:  Đây là cách lưu trữ "thô" chỉ nhằm giúp bạn hiểu thêm. Trong trường hợp lưu trữ thực tế; bạn có thể sẽ nén các dữ liệu đọc được để giảm choáng chỗ hay dùng các tiện ích chuyên dụng cho lư trữ khác và dở nén khi phục hồi.

2.3.3.2 Đổi hướng và đọc từng dòng từ một tập tin:

Đôi khi muốn truy cập từng dòng một của một tập tin có thể làm cách sau:

    while read my_line
    do
        echo "$my_line"
    done <./my_file

2.3.3.3 Đổi hướng và đưa dữ liệu vào một chương trình tương tác:

Dùng cách này người ta có thể tự động hoá nhiều chưong trình thông qua các script

Thí dụ1: Giả sử bạn là thành viên của một máy chủ ftp địa chỉ xxx.yyy.zzz.ttt.  Công việc của bạn hàng ngày là tải về để cập nhật từ máy này tất cả các tập tin mã nguồn có dạng *.c trong thư mục có tên My_login. Để khỏi lập lại các mệnh lệnh ftp ban có thể thiết lập tập tin my_ftp.txt có nội dung như sau:

My_login
bin
mget *.c
a
bye

Mỗi lần cần phải cập nhật hoá, thì bạn chỉ việc gõ lệnh:

    ftp xxx.yyy.zzz.ttt < my_ftp.txt

Chương trình này sẽ yêu câu bạn gõ vào mật khẩu và sau đó tư nó sẽ thực thi các lệnh để tải về các tập tin *.c. Với cách chuyển hướng như vậy bạn sẽ tiết kiệm được nhiều thì giờ để gõ lệnh tay mỗi lần làm cùng 1 loại thao tác.

Lưu ý: Bạn hoàn toàn có thể dùng cách tương tự trên cho một số chương trình tườn gtác như là vi, fdisk, ..các chương trình này không yêu cầu phải gõ mật khẩu. Tuy nhiên, khi dùng fdisk nhớ cẩn thận không khéo bạn có thểxoá ổ cứng của chính bạn thì không ai cứu nổi đâu nhé.

2.3.4 Đổi hướng nhập stdin để nhập từ nhiều dòng mã trực tiếp hay tập tin <<:

Cách đổi hướng này còn gọi là hồ sơ HERE (tại chỗ). Nó cho phép người dùng đọc nhiều dòng dữ liệu cho đến khi gặp dòng nhãn (label) xác định trước.

Thí dụ1:   Thay vì sử dụng cách để đăng nhập như trong mục 2.3.3.3, ở đây dùng cách cung ứng trực tiếp tên và mật mã qua hồ sơ HERE. 

myName="<TÊN_NGƯỜI_DÙNG>"
myPassword="<MẬT_KHẨU>"
# "End_Of_Session is the LABEL
ftp -n $IP  <<End_Of_Session
user "$myName" "$myPassword"
#enable binary mode
bin
#upload 2 file myFilesname1 and myFilename2
put myFilename1
put myFilename2
#end ftp session
bye
# after this LABEL the HERE document is also end
End_Of_Session

Thí dụ2: Sau đây là một cách dùng hồ sơ HERE để nhập dữ liệu tại chỗ thay vì phải nhập vào từ stdin vào một hàm. Trường hợp này sẽ tiện dùng nếu như hàm được gọi là một hàm thư viện dùng chung trong nhiều mụch đích nhưng lại có nhu cầu nhập dữ liệu trực tiếp từ đầu cuối giao diện (console)

GetData ()
{
    read name
    read class
    read school
}

#input parameter values to the above function.
GetData << MY_LABEL
NgocUyen
12
Marie Curie
MY_LABEL
echo
echo "your name:$name
echo "your class: $class"
echo "your school: $school"
echo

 

2.3.5 Dùng ống truyền dẫn (pipe) đổi hướng từ stdout sang stdin  |

Thí dụ1:  Câu lệnh sau đây sẽ chuyển nội dung của myFile (đọc từ lệnh cat) sang ngõ vào của lệnh grep (và lệnh grep trong nhiệm vụ sẽ chỉ hiển thị những dòng nào có string "John"

    cat myFile | grep "John"

Thí dụ2: Câu klệnh sau cho phép tìm trong thư mục con "test" (của thư mục hiện tại) tất cả các tập tin có tiếp đầu ngữ là Myfile và có phần tên mở rộng (extension) và hiển thị khi xuất ra được đưa thẳng vào lệnh ls -l.   Lệnh này sẽ cho phép hiển thị lại các tập tin tìm được từ lệnh find thành dạng đầy đủ.

    find ./test/  -name "Myfile.*" | ls -l {}

Lưu ý: dùng kĩ thuật pipe bạn có thể chuyển tiếp ngõ ra cuả một lệnh sang một lệnh khác nhiều lần.

Thí dụ3 : Câu lệnh sau sẽ thực thi các bước tương tự như trong thí dụ2; nhưng sau đó, tiếp tục lấy ngõ ra của lệnh ls đưa vào ngõ vô của lệnh grep và lệnh grep chỉ cho phép hiển thị những dòng chữ nào bắt đầu kí tự "d" (tức là chỉ có các thư mục là được hiển thị). còn lệnh awk cuối cùng chỉ cho hiển thị chữ ở vị trí thứ 9 (tức là vị trí chứa  tên tập tin).  Nói gọn lại, dòng lệnh tổ hợp này sẽ tìm trong thư mục ./test các thư mục con có tiên bắt đầu bằng "Myfile" và hiển thị chúng ra màn hình

    find ./test/  -name "Myfile*" | ls -l {} | grep "^d" | awk '{print $8}'

Ngoài ra, còn nhiều kí tự được dùng trong các phép toán, dùng trong việc mở rộng hệ vỏ, và dùng trong các chức năng chuyên biệt sẽ được trình bày lần luợc trong các bài giảng kế tiếp

Lưu ý: Ngoài cách đổi hướng thông thường như trình bày trong 2.3; người ta còn sử dụng cách cách thức đổi hướng khác mượn lệnh "exec". Các bạn có thể tham khảo thêm trang  “Advanced Bash-Scripting Guide”  phần viết về "I/O Redirection"

2.4 Thi hành lệnh trong nền bằng kí tự &:

Để thực thi một mệnh lệnh một cách không đồng bộ thì có thể dùng dấu & đặt ở vì trí xau cùng của mệnh lệnh này.  Khi đó, mệnh lệnh sẽ được thực thi trong nền (back gound) và nếu đặt lệnh dạng này một văn lệnh thì trình bao sẽ gọi một trình bao con để thực thi đông thời trả về giá trị 0 và tiếp tục thực thi các lệnh kế tiếp trong trình bao (nếu có). Như vậy mệnh lệnh gọi với & sẽ tiếp tục được thi hành. Nếu các lệnh kiểm soát công việc (job control) không được dùng thì các ngõ vào chuẩn của các mệnh lệnh chạy trong nền dạng này sẽ được đổi hướng vào thiết bị /dev/null. Tiện lợi của việc thi hành trong nền là khi có một số mệnh lệnh mà người gọi không cần đợi có kết quả mà có thể  tiếp tục công việc cho đến sau này.

Thí du:  Hai đoạn mã sau đây sẽ được thi hành khác nhau. Trong khối mã thứ nhất BASH sẽ đợi cho đến khi lệnh find làm xong công tác mới thực thi tiếp lệnh echo.  Trong khi khối mã thứ nhì sẽ chạy lệnh find đó trong nền và tiếp tục thực thi dòng kế tiếp là lệnh echo ngay lập tức

#Using back ground process
echo "searching and printing result into found.txt"
find /etc -name "*log" > found.txt
echo "continue"
ls

#Not Using background process
echo "searching and printing result into found.txt "
find /etc -name "*log" > found.txt &
echo "continue"
ls


A1 Tập tin trong Linux/UNIX - Các thuộc tính

Một cách vắn tắt, trong Linux các thuộc tính của một tập tin được chỉ thị và xác định bởi các bit trạng thái liên kết với tập tin đó  để biểu tả các đặc tính như là read-only (chỉ đọc được), archive (dùng cho lưu trữ), system (hệ thống), hidden (ẩn dấu), v.v...

Trong Linux/UNIC mỗi tập tin sẽ chứa:
a) Quyền sở hữu bao gồm quyền sở hữu của người dùng với giá trị định danh (identifier) trong hệ bát phân là 4000 và quyền sở hữu của nhóm có giá trị danh định trong hệ bát phân là 2000
b) Các quyền truy cập được xác định bằng 9 bit, các bit này cho phép loại đối tượng nào có thể đọc, viết và thực thi nội dung tập tin. Gọi là các phép sử dụng (permissions)
c) 3 bit trong đó  có 2 bit dùng để xác định xem tập tin đó hay chương trình đó có thể được truy cập và xử lý trong lúc thi hành và bit còn lại là bit lưu dính (sticky)
d) 4 bit dùng để xác định chức năng của tập tin. Các bit này được cài đặt ngay từ khi tập tin được tạo nên và không thể thay đổi được.
e) Thời điểm tập tin được tạo (creating time) ra và thời điểm chúng bị truy cập (access time)
f)  Độ lớn của tập tin:  đây là số đo bằng đơn vị byte (hay bội số của byte) của nội dung thông tin lưu chứa bên trong một tập tin không tính đến các yếu tố khác kể cả các thông tin về thuộc tính của nó
g) Tên tập tin và phân loại.
h) Số liên kết của cùng một tập tin

Đặc biệt 12 bit của trường hợp a và b trên hợp thành kiểu của tập tin. Chi tiết của các thuộc tính kể trên ngoại trừ điểm f) và g) sẽ được bàn chi tiết phần sau

Để kiểm nghiệm lại các thuộc tính của một tập tin người ta thường dùng lệnh:
"ls -l  <TÊN_TẬP_TIN>".

Thí dụ: Khi dùng lệnh ls -l lên một thư mục, các tập tin sẽ hiển thị tương tự

Hình1:  Minh họa các thuộc tính tổng quát của các tập tin

Lưu ý:

Một lệnh khác cũng giúp người dùng hiểu thêm về nội dung (nhưng không phải là các thuộc tính theo định nghiã trên) của một tập tin là lệnh
file <TÊN_TẬP_TIN>
Để đọc được nhiều chi tiết về thuộc tính và trạng thái sử dụng của một tập tin có thể dùng lệnh
stat <TÊN_TẬP_TIN>

A1.1 Quyền sở hữu:

Các đặc tính về quyền sở hữu được đặt ra cho tập tin trong linux cũng không ngoài lý do an toàn.  Có hai đặc tính chính đó là sở hữu chủ (owner) và nhóm chủ (group owners). Hầu hết các hệ điều hành Linux và UNIX chỉ kiểm tra lại quyền sở hữu này trên tập tin khi chúng được đem ra cài đặt quyền thực thi hay được truy cập lúc thi hành một lệnh nào đó.

A1.1.1 Sở hữu chủ:
Đặc tính sở hữu quy định quyền tối thượng quyết định về nội dung, các đặc tính và các quyền khả dụng của tập tin đó thuộc về ai. Thường người dùng nào tạo ra tập tin sẽ có được quyền sở hữu này. Người có quyền sở hữu trên một tập tin có thể thay đổi nội dung, có thể hoán chuyển, thay đổi các đặc tính về phép sử dụng (permission) của tập tin cũng như có thể chia sẽ hay chuyển quyền sử dụng hay sở hữu của tập tin đó cho người dùng khác.

Người ta có thể thay đổi sở hữu chủ của các tập tin bằng lệnh chown

Thí dụ: Giả sử bạn đang có quyền sở hữu tập tin mytxt và muốn chuyển quyền này cho người dùng 'anon':  chown -c anon mytxt

Lưu ý: Người dùng "root"(4) có toàn quyền thay đổi đặc tính này như là truất phế đặc tính sở hữu chủ trên một tập tin của bất kì người dùng nào và đổi thành quyền sở hữu cho người dùng khác một cách vô điều kiện mà không cần phai thông báo cho người chủ nguyên thủy của tập tin

A1.1.2 Nhóm sở hữu:
Trong khi chỉ có một người được quyền sở hữu tập tin thì, tập tin đó còn có thể có đặc tính là sở hữu của một nhóm người. Một nhóm người đó được chỉ định (bởi người hay nhóm tạo ra tập tin hay bởi "root") là nhóm sở hữu của một tập tin.  Một khi là thành viên sở hữu trong nhóm, thì người đó có  thể có quyền thi hành một số thao tác lên trên tập tin. Các thao tác này đưọc quy định bởi người quản lý (root) hay bởi mặc định khi máy đưọc cài đặt. (Trong Linux thì mỗi nhóm có thể có một tên nhận dạng riêng (group identifier)).

Lưu ý: Hoàn toàn tương tự như trường hợp sở hữu cá nhân, đặc tính nhóm sở hữu hoàn toàn có thể bị thay đổi bởi người dùng "root".

Người ta có thể thay đổi sở hữu chủ hay nhóm chủ của các tập tin bằng lệnh chown hay lệnh  chgrp

Thí dụ:
* Để chuyển đổi nhóm sở hữu của  mytxt cho nhóm 'root'
:  chown :root mytxt
* Để chuyển đổi quyền sở hữu mytxt cho tài khoảng 'Dung' và nhóm chủ là 'medicine':   chown Dung:medicine mytxt

A1.2  Các quyền truy cập của một tập tin

Các quyền truy cập (access right) hay phép truy cập (access permission) của một tập tin được tạo thành một cách mặc định hay do quyết định của người tạo ra tập tin đó nhằm chia sẽ quyền sử dụng một phần hay toàn bộ quyền sử dụng cho người cùng nhóm hay người sử dụng bên ngoài.  Các quyền sử dụng này bao gồm: Quyền đọc (read) nội dung tập tin, quyền thay đổi nội dung tập tin (write), và quyền thực thi (execute) tập tin

Để xác định sự chia sẻ quyền sử dụng này thì Linux/UNIX dành ra 12 bit thông tin chia là 3 loại chính: loại chỉ thị quyền truy cập (9 bit), loại bit cho phép chia sẽ sẽ một nhóm  làm chủ hay người (khác) chủ tập tin, và loại bit lưu dính (sticly)

Các bit dùng cho quyền truy cập của một tập tin nhằm xác định những thao tác nào cho phép tiến hành lên tập tin người nào được phép tiến hành. Chúng bao gồm 3 lớp:

  • Lớp 1: 3 bit trong hệ thống bát phân (octal) là các bit ở các vị trí 100, 200, và 400; chúng khống chế quyền truy cập cho người chủ (của tập tin) kí hiệu tắt là u (viết tắt từ "user")
  • Lớp 2: 3 bit trong hệ thống bát phân là các bit ở các vị trí 10, 20, và 40 chúng khống chế quyền truy cập cho nhóm chủ (của tập tin)  kí hiệu tắt là g (viết tắt từ "group")
  • Lớp 3: 3 bit trong hệ thống bát phân là các bit ở các vị trí 1, 2, và 4 chúng khống chế quyền truy cập cho những người dùng khác (không phải thuộc cùng nhóm chủ hay không là người chủ của tập tin) kí hiệu tắt là o (viết tắt từ "other")

Như vậy mỗi nhóm có thể tạo ra tối đa 8 giá; trị quy định khác nhau. Để thay đổi các giá trị này thì người chủ, nhóm chủ hay root có thể dùng lệnh chmod. Sau đây là bảng ghi ý nghiã của 8 giá trị có thể này.

Bảng ghi các  các giá trị quyền truy cập khi dùng lệnh 'chmod'
(Các giá trị nhị phân trong ngoặc đơn dùng để đối chiếu)

 

Các giá tri quyền
 truy cập của một lớp  
 Quyền truy cập viết
trong dạng string
Ý nghiã
0 (000)
1 (001)
2 (010)
3 (011)
4 (100)
5 (101)
6 (110)
7 (111)
-x -w -r
+x -w -r
-x +w -r
+x +w -r
-x -w +r
-x +w +r
+x -w +r
+x +w +x
không cho phép đọc, viết ,thực thi
chỉ cho quyền thực thi
chỉ cho quyền viết
chỉ cho quyền thực thi và viết
chỉ cho quyền đọc
chỉ cho quyền viết và đọc
chỉ cho quyền thực thi và đọc
cho cả thực thi, viết, và đọc

 

 

 

 

 

Khi không muốn sử dụng giá trị bác phân, để có thể áp dụng lệnh chmod cho từng lớp, có thêm các tham số dạng string như là kí hiệu 'u' cho lớp 1, g cho lóp 2, và o cho lớp 3.

Thí dụ: Thay đổi các thuộc tính của tập tin mytxt.  (Một cách tổng quát dùng dấu + để cho thêm thuộc tính và dấu - để ngăn cấm thuộc tính đó)
* Tạo thuộc tính khả thi lên mytxt đối với người chủ tập tin mà thôi:  
chmod u+x mytxt
* Tạo thuộc tính khả thi lên mytxt đối với mọi người: chmod u+x g+x o+x mytxt
 hay đơn giản hơn chmod +x mytxt
* Tạo thuộc tính chp phép đọc, viết, và thực thi lên
mytext với người chủ tập tin:  chmod u+x+w+r mytxt
* Ngăn cấm người ngoài và nhóm chủ viết lên nội dung tập tin:  chmod g-w o-w mytxt
* Không cho bất kì ai viết lên tập tin: 
chmod u-w g-w o-w mytxt
* Cho phép người ngoài có cùng quyền hạn truy cập của chủ:
   chmod o=u mytxt
* Thay vì dùng hệ thống kí hiệu tắt, người ta có thể dùng hệ cơ số bát phân.  Tuy nhiên, khi ra lệnh này người có chủ quyền trên tập tin cần nhớ rằng vị trí thứ nhất từ trái dành cho chủ tập tin, vị trí thứ hai là nhóm chủ và vị trí thứ 3 dành cho người ngoài.
* Lệnh thường thấy nhất là chmod 755 mytxt.  Lệnh này cho phép nhóm chủ và người ngoài chỉ được phép đọc và thi hành nhưng lại không thể điều chỉnh nội dung của tập tin trong khi người chủ tật tin lại có quyền đó.

Lưu ý: Việc ra lệnh điều chỉnh quyền truy cập mà dùng chỉ có 1 con số (0-7), chẳng hạn như lệnh "chmod 7 mytxt" sẽ tạo các thuộc tính đọc viết và thi hành cho người ngoài và mặc định các giá trị thuộc tính cho nhóm chủ và người chủ bằng 0. Nó tương đương với lệnh
chmod 007 mytxt

--
thuộc tính 007 sẽ ngăn cấm chính người chủ hay nhóm chủ của mytxt làm các thao tác đọc viết và thi hành lên mytxt. Do đó cách tốt nhất là nên gõ cả ba số bát phân để thay đổi thuộc tính. Như vậy để ngăn người ngoài và cả nhóm chủ truy cập lên tập tin thì có thể ra lệnh:
chmod 700 mytxt

A1.3. Sticky bit:
Sticky bit hay còn gọi là bit lưu dính.  Bit lưu dính có vị trí bát phân là 1000 trước đây thiết kế để dùng trên các máy không có nhiều bộ nhớ và nó chỉ được gán để dùng với các tập tin khả thi. Khi bit này được cài nó sẽ thông báo cho hệ điều hành lưu giữ chương trình trong bộ nhớ cho các thực thi sau đó (có thể được chạy bởi người dùng khác) nhằm mụch đích chia chung một chương trình phần  bộ nhớ tải cho nhiều người và tăng hiệu quả sử dụng. 

Ngày nay, bit này đã không còn dùng cho mụch đích kể trên mà chúng được dùng để tăng cường an toàn cho các thư mục.  Nếu không cài bit này lên một thư mục thì thư mục đó sẽ cho phép bất kì người dùng nào tạo ra, điều chỉnh, hay xóa các tập tin và các thư mục con nằm bên trong nó. Ngược lại khi được cài, ngoại trừ người chủ (và root) thì không ai được phép thay đổi hay xoá toàn bộ thư mục đó

Trong Linux, người ta có thể mở/đóng bit lưu dính bằng cách dùng lệnh chmod. Thí dụ lệnh: chmod 1755 mydir/  sẽ cho cài các quyền truy cập theo giá trị 755 và cài luôn giá trị 1 cho bit lưu dính

Kí hiệu của bit lưu dính là 't'.

Để biết được một thư mục có cài giá trị bit lưu dính hay không người ta có thể dùng lệnh:  file <TÊN_THƯ_MỤC>  và giá trị trả về cho thư mục có cài đặt sticky bit có thể là
<
TÊN THƯ MỤC>: sticky directory

A1.4 Thuộc tính cài cho người sử dụng về quyền thực thi:

Trong nhiều trường hợp một tập tin sau khi đã được cài quyền thực thi  (+x) cho người ngoài dùng nhưng đến khi người dùng chạy thử thì tập tin đó không thể hoàn tất công việc vì mycommand trong lúc thi hành đòi hỏi phải xử lí hay truy cập một số dữ liệu hay lệnh khác mà các dữ liệu hay lệnh này lại không được cài quyền truy cập cho người ngoài. Kí hiệu của thuộc tính này  là s

Như vậy, nếu người dùng X tạo ra một script mycommand đã được cài giá trị thực thi +x lên  mycommand nhưng khi thi hành mycommand lại đòi hỏi  phải mở và đọc tập tin dữ liệu mydata và người dùng X không muốn cho người ngoài được phép trực tiếp đọc hay viết lên mydata mà không thông qua lệnh mycommand thì X có thể ra lệnh:  chmod +s mycommand . Trong hình 1, dòng 10, tập tin có tên share đã được cài giá trị này. Do đó kí tự s xuất hiện trong các thuộc tính về quyền truy cập.

Bị chú:  chữ s là sự viết tắt cho cụm từ setuid on execution or setgid on execution  (có nghiã là cài quyền thực thi trên sở hữu chủ hay nhóm chủ của tập tin đó).

A1.5. Đổi tên tập tin:
Có nhiều cách để đổi tên một tập tin thông dụng nhất là dùng lệnh
mv <TÊN_CŨ> <TÊN_MỚI> Một cách khác để đổi tên một tập tin là dùng lệnh cp <TÊN_CŨ> <TÊN_MỚI> để chép nó sang một tập tin có tên khác và sau đó xoá tập tin cũ bằng lệnh rm <TÊN_CŨ> . Tuy nhiên khi làm việc này với một tập tin có cỡ lớn thì sẽ tốn thời gian cho máy chép.

Lưu ý: Lệnh này nguyên cho phép người ta chuyển vị trí của một tập tin. Thí dụ: mv test/mytxt release/document sẽ di chuyển tập tin mytxt trong thư mục con test sang thư mục con release với tên mới là document.

A2 Các lệnh hệ thống quan trọng Trong Linux

Để nhận được đầy đủ thông tin hơn, dùng lệnh man <TÊN_LỆNH>  Trong đó, <TÊN_LỆNH> không cần phải chỉ rõ đường dẫn.  Trong bảng trình bày, chữ in đậm đứng sau dấu ;  là lệnh tương tự có cách dùng giống nhau.  Một số lệnh sẽ không có trong hệ điều hành UNIX.  Tuỳ theo cách cài đặt,  nhiều mệnh lệnh sẽ đòi hỏi chủ quyền, nhóm quyền hay quyền truy cập để có thể gọi được chúng đặc biệt là các nhóm lệnh liên quan đến bảo mật hệ thống. Ngoài ra, cách tốt nhất để nắm bắt và có thể tận dụng hệ thống lệnh của Linux là nên có trong tay một tài liệu chuyên khảo về việc này. Chẳng hạn như cuốn: "Linux in a Nutshel" của nhiều tác giả do nhà xuất bản O'reilly ấn hành (ISBN 0596009305)

Các tham số nếu viết trong ngoặc nhọn { } là các tham số bắt buộc phải có dê lệnh thực thi trong khi các tham số đặt trong ngoặc vuông sẽ có giá trị lựa chon  [ ] nếu không có lệnh có thể vẫn được thi hành theo chế độ mặc định

Lưu ý: Kiến trúc của Linux/Unix cho phép xem tất cả  các thiết bị, tập tin, thư mục,.... và ngay cả bộ nhớ đều là một dạng của các tập tin hệ thống. Do đó, các lệnh Linux/Unix có thể có hiệu lực mạnh hơn các mệnh lệnh trong hệ điều hành Windows rất nhiều.  Chẳng hạn, việc đọc thẳng nội dung thô cuả một ổ cứng hay của một địa chỉ trong bộ nhớ hay ngay cả trong hạt nhân trên Linux/UNIX thì dễ dàng hơn nhiều (có thể chỉ dùng các lệnh hệ thống thông thường và lại có để lắp đặt chúng vào trong các văn lệnh trong khi đó, việc này gần như không cho phép khi dùng Windows ngoại trừ phải sử dụng các dịch vụ, hay các bộ điều vận (device driver) hay các tiện ích đặc biệt hay phải dùng ngôn ngữ lập trình bậc tương đối thấp như C/C++ chẳng hạn. Còn việc đọc trực tiếp bằng văn lệnh thì hầu như không thể được.

 

Mệnh lệnh/
Cú pháp thông dụng nhất (các tham số hay dùng)
Ý nghiã --
(dòng lệnh Windows tương đương)
Thí dụ/
(thí dụ phân cách nhau bởi dấu ; hay xuống hàng)
Lưu ý/
khả năng
awk
 'pattern {action}file'
;gawk
Điều chỉnh nội dung và báo cáo văn bản awk '{print $1 $2}' mydata xem thêm trong các phần kế tiếp
bash
 [script]
;sch;ksh
Gọi 1 màn hình dòng lệnh con hay thực thi một văn lệnh sh myscript.sh;  bash Để gọi trình bao korn thi hành myscript dùng:  ksh <TÊN_TẬP_TIN>
basename
 
{path}
trả về tên riêng trong dòng tên đầy đủ basename "/home/test/myfile.txt trả về myfile.txt
bc lệnh gọi máy tính toán. echo "scale=9; 6/100.0" | bc có tính tương tác
bzip2
 
[-dztfq1..9]
; bunzip2; bzcat;
nén và giải nén các tập tin   .bz2 bzip2 -d myfile.bz2  
cat
 [-AbEnstTv]{files}
hiển thị nội dung của tập tin (văn bản)
-- type
cat -n mytext; cat *.txt có thể dùng kí tự phỏng định (wildcard) (5)
chmod
 {attribute} {file}
thay đổi thuộc tính các file
-- attrib
chmod +x +r myscript*.txt có khả năng dùng kí tự phỏng định và đệ quy
chown
 [-cfR][owner][:group]{file}
thay đổi chủ hay nhóm chủ các tập tin chown -c Bill myfile;
chown hung:root myfile
có khả năng dùng kí tự phỏng định và có  khả năng đệ quy
clear làm trống, tạo màn hình mới
-- cls
clear  
cd
 
{directory}
thay đổi thư mục hiện hoạt
--
cd
cd ~; cd /home  
cp
 
[-auifp]{source} {target}
chép các tập tin hay thư mục sang thư mục hay tập tin khác.
--
copy; xcopy
cp -a mydir /home;
cp -f file
1.txt file2.txt mydir/
có khả năng dùng kí tự phỏng định và có  khả năng đệ quy (dùng tham số -a)
date
 
[-s] [+FORMAT]
cài hay hiển thị đồng hồ thời gian trên máy
-- time; date
date +%d/%M/%Y; date
date -s "Wed Nov 24 11:23:00"
cho phép thay đổi định dạng khi hiển thị.
dd
[if=file][of=file][bs=;count=]
chép dữ liệu thô (dump) từ 1 tập tin sang tập tin khác dd if=/dev/sdb of=/dev/sdc
dd <dev/zero >myDisk.img count=512 bs=1024
cho phép đổi hướng, có thể sử dụng như một lệnh để tạo bản dự phòng (dùng chung với gzip để nén)
df
 
[-ahikm] [file]

; du; free
báo cáo về tỉ lệ sử dụng trên các thiết bị lưu trữ
--
chkdsk
df; df -k  
diff
 
[-lines,ibBr]{file1}{file1}
Trả về sự khác nhau giữa hai tập tin
--
comp, fc
diff -r --brief oldir newdir
diff -i text1 text2
có khả năng đệ qui hay không phân biệt chữ viết hoa
dirname
 {file}
trả về tên đầy đủ của thư mục chứa tập tin {file} (hay còn gọi là đường dẫn) dirname /home/dung/test.txt  
dmesg
  [-n] 
trả về thông tin chứa trong bộ đệm (buffer) của nhân (kernel) dmesg lệnh giúp đọc lại các thông báo từ việc tải và dở tải của các bộ điều vận. Có ích trong quá trình tìm lỗi (debug)
dos2unix
 
[-kqon]

; unix2dos
đổi đi-nh dạng cho tập tin văn bản từ kiến trúc DOS sang UNIX dos2unix myfile.txt  
echo
 
{-en} {string}
hiển thị một dòng chữ
--
echo
echo -n "helo"; 
echo -e $"\\033[1;32mGreen"
cho phép sử dụng các phiếm thoát (escape character) với tham số -e
expr
 
{expression}
đánh giá một biểu thức y=`expr $y + 1`
; x
=`expr length $a`
 
factor tính giai thừa factor 100  
fdisk
 
[-l -u] {device}
điều chỉnh bảng phân bố (partition) ổ diã
--
fdisk
fdisk /dev/hdb có thể làm hại máy.
file
 
[-kz] {file}
xác định kiểu tập tin file a.out
file -z file.zip
 
find
  {path} {expressions}
tìm kiếm tập tin trong một thư mục find /home -name text* hồ trợ kí tự phỏng định (wildcard) và tìm kiếm đệ quy
fsck
 
[-Atr] {device}

; fsck.ext2;fsck.ext3;fsck.vfat; fsck.reiserfs
Kiểm và sửa các tập tin hệ thống
--
chkdsk
fsck.ext3 /dev/sda1

fsck.exe2 initrd

có thể gây hệ quả mất dữ liệu khi sửa
ftp
  [-ig] [host]
chương trình dịch chuyển file
--
ftp
ftp 11.101.177.178 có tính tương tác
fuser
 [-aiklm]
xác định các tiến trình dùng tới các tập tin của một ổ nối (socket) fuser -km /home có thể gây hại cho các ứng dụng đang chạy.  Dùng để hủy các tiến trình đang chạy làm cản trở một thao tác khác.
grep
 
[-ceir] {pattern}{file}
; egrep
trả về dòng văn bản trùng khớp với một  dạng thức cho trước
--
find
grep "Vo \w Dung" myfile xem thêm trong các phần kế tiếp
groupadd
 [-grf]

; groupdel; groupmod
tạo nhóm mới (đây là các nhóm chủ dùng trong thuộc tính các tập tin) groupadd -g 122 Chemistry lệnh của quản lý
gzip
 [options] {file}
; zip; unzip; gunzip
nén và giải nén các tập tin kiểu zip  gzip myfile; gunzip file.gz  
head
 [-cnq] {file}
xuất ra các dòng đầu của tập tin head myfile; head -n 1 mytext
hostname
 [-adFif] [hostname]

; domainname;nodename
xuất hay cài đặt lại tên máy chủ hostname VNN; dùng trong cài đặt mạng
id
 [-gGnru]
trả về các UID GID thực và còn hiệu dụng id phuongdung lệnh của quản lý
info
 
[-dfnOR] [name]
hiển thị thông tin đầy đủ về một mệnh lệnh hay một thiết bị info ls tương tự như man nhưng có tính tương tád
init
 {0123456asbc}[-sba]
; telinit
khởi động sự điều khiển tiến trình init 3; init 5; init 6 dùng đổi chế độ người dùng hay tái khởi động máy
insmod
  [-efq] [module]

; rmmod
Tải vào kernel môt bộ điều vận hay mô đun insmod aic7xxx  
logname trả về taì khoản người đăng nhập logname lệnh của quản lý
ls
  [-aAdklt1] [file]
 hiển thi nội dung của một thư mục
-- dir
ls *.txt; ls -a; ls -l cho phép dùng kí tự phỏng định và chế độ đệ quy
lsdev Hiển thị thông tin về thiết bị phần cứng trên máy lsdev  
lsmod lhiển thị các bộ điều hợp đã tải lsmod  
lspci
  [-nxbdi]
hiển thị các thiết bị PCI lspci -n; lspci -d  
lsusb
 
[-sdDpt]

: usbmodules
lhiển thị các thiết bị USB lsusb  
ln
 
[-dfs]{target}[link_name]
tạo các tập tin liên kết ln txt txt2;
ln -s file slinkfile
có ich khi dùng liên kết mềm -s
lp
 
[options] {file}
; lpr
gửi yêu cầu tới dịch vụ in lprng
--
print
   
man 
  [-acK] {name}

; info
định dạng và xuất ra bảng hướng dẫn
--
help
man ls; man -a mkdir; info cat  
make
 
-f file
[options] target
tiện ích make make install  
MAKEDEV
 [-nMSdi]

; mknod
tạo tập tin thiết bị cd /dev; MAKEDEV xda
mknod sg c 21 0
 
mkdir
  [-mp] {directories}
tạo thư muc mkdir -m 755 dir1 dir2;
mkdir -p /home/chem/org
có thể tạo thư mục trong nhiều cấp độ sâu, và tạo nhiều thư mục cùng lúc
mkfs
  [-tc] {filesystem}

; mkfs.ext2;mkfs.ext3;mkfs.vfat
định dạng hệ thống tập tin
--
format
mkfs.ext3 /dev/sda1;
mkfs.ext2 initrd;
mkfs -t vfat /dev/hda1
 
modinfo
 
[-adflnp] {modulefile}
hiển thị thông tin về một mô dun trong hạt nhân modinfo aic7xxx  
more
 
[-dlfs] {file}

; less
cát nội dung của một tập tin ra thành cơ của màn hình để hiển thị
--
more
more myfile  
mount
  [-afFrwto][device directory]
Kết nối vào một hệ thống tập tin
nêu danh sách các hệ thống tập tin
mount; mount /dev/cdrom /mnt/cdrom; mount -o loop imge.iso img_dir  
mv
  [-fiu] {source}{target}
di chuyển hay đổi tên tập tin
 --
ren, move
mv file1 file2 mydir/:
mv file.text file.txt
hỗ trợ di chuyển nhiều tập tin, kí tự phỏng định
netstat
 
[options]
hiển thị trạng thái mạng netstate lệnh quản lý
nice
 
{-n} {command [arg]}

; renice; snice; skill
thực thi chương trình với độ ưu tiên
 (-20=cao nhất và 19=thấp nhất)
nice -n -8 ./myprog  
nohup
 
{command [arg]}
run a program immune to hang up nohup mydaemon start  
passwd
  [-kludnxwi]
thay đổi ật khẩu passwd Bill  
pgrep
 [-flnPs] {pattern}

; pkill
hiển thị tên của các tiến trình và các thuộc tính khác pgrep myscript  
pidof
 [-sxo] {programs}
trả về danh định của tiến trình đang chạy pidof mydaemon  
ping
 [-ăbcdfFpQr] {host}
gửi  ICPM ECHOREQUEST đến máy chủ
-- ping
ping 12.177.178.105  
printf
  {format} [ARG]
định dạng và hiển thị dữ liệu (float=2.234; printf "float=%f" $float);
printf "tHellon"
dùng kiểu C/C++
procinfo
 
[-fFabdimnr]
hiển thị trạng thái của hệ thống procinfo  
ps
 [-AadflHn][rplosu]

; pstree
báo cáo trạng thái của các tiến trình ps -A; ps -ef useful to controll processes
reboot
 [-nwdihp]
; poweroff; halt
tái khởi động rboot -n có thể gây mất dữ liu
rev
 
{file}
hiển thị ngược trật tự của một tập tin rev myfile.txt  
rm
 [-drRfi] {files}
xoá file hay directory
--
del; deltree
rm  myfile; rm -rf mydir/ có thể nguy hại, đệ quy, ki; tự phỏng định, xóa nhiều tên
rmdir
 [-p] {directory}
xóa directory
--
deltree
rmdir -p a/b/c;
rmdir a/b/c a/b c
có thể nguy hại, đệ quy, ki; tự phỏng định, xóa nhiều tên
rpm
 
lệnh quản lý gói rpm rpm -ql man;
rpm -i newfoftware.rpm
rpm -e oldsoftware
hữu dụng để cài đặt phần mềm
sed
 [-nef] file
Stream EDitor (soạn thảo dòng) sed 's/Vo/Nguyen/g' myfile xem bài giảng sau
seq
 
[-sfw][first][increment]{last}
; jot
hiển thị một dãy số for a in `seq $COUNT` 
do
  echo -n "$a "
done      # 1 2 3 4 5 ... 80
tiện trong các vòng lặp (loop)
setserial
 [-abGqWz]{device}[param[arg]]
cài đặt hay đọc thông tin từ một cổng liên tục   có thể gây hại
shutdown
 [-tkrhfFc][time][message]
dùng để tắt máy shutdown -t 3 now  
sort
 [-bdfinr][-t-u-o] {file}
trả về các dòng xếp thứ tự  từ 1 tập tin
--
sort
sort -r mydata; sort -b file  
stat
 
[-ft] {files}
báo cáo đầy đủ trạng thái của một tập tin stat myfile  
stty
 [-agF] {setting}
diều chỉnh và hiển thị cài đặt ở đầu cuối stty -echo  
string
 
[-afnote] files
hiển thị các dòng là dòng chữ trong tệp strings mydriver.o  
strip
 [-FIORfKNopxX] {object}

;  nm
cắt bỏ các "symbol" trong tập tin khả thi strip *.o dùng để thu nhỏ lại kích thước các tập tin hư viện và mô dun.  Có thể nguy hại
su
 [-cflm] {user}
chạy hệ vỏ dùng tên và mật khẩu người khác su root; su Joe lệnh quản lý
sudo
 [lLkpbcasHPS]command
thi hành lệnh như là người dùng trong /etc/sudoers sudo -u Bill cat BillFile use for hacking?
sync buộc viết các dữ liệu cập nhật trong các bộ đệm vào trong thiết bị lư trữ sync có thể hữu dụng
tail
 [-cnq] {file}
hiển thị thông tin phần sau của 1 tập tin tail -n 3 mytext  
tar
 [cdufgpvxz] {file}
tạo ra hay giải nén 1 tập tin
-
-expand
tar cpf - . |gzip 9 > file.tar.gz:
tar zxvf file.tar.gz
tar cpf mydir > data.tar
tar -xvf data.tar
có thể hữu dụng
telnet
 [-BKacefl] {host}[port]
chương trình nối qua giao diện telnet telnet 12.177.113.178 tương tác
top
 [dpqSscCinb]
hiển thị các tiến trình của CPU top tương tác
tr
  [-cdst]
dịch hay xoá các kí tự từ stdin và viết chúng vào stdout tr -d a-c <file #delete all character a,b,c in file cho phép dùng kí tự thoát
uname
 
[-amnrsp]
báo cáo thông tin về hệ thống uname -r có thể hữu dụng
uniq
 [cđfisnuw]
xoá các dòng trùng lặp trên 1 file đã xếp thứ tự dòng sort mydata | uniq dùng với sort
units
 [-cofs]
đổi đơn vị đo đạc units miles meters  
useradd
 [-cdDefgGpu] {login_name}

; userdel; usermod
tạo hay cập nhật thông tin về 1 tài khoản useradd -G root  - u 100 Phuong lệnh quản lý
vi
 
[options] files

; vim
bộ soạn thải văn bản
--
edit
vi myfile tương tác
w
 
[-husf] [user]
chỉ ra ai đang đăng nhập và làm gi w Bill; w lệnh quản lý
wall
 {message}
gửi thông báo đến mọi đầu cuối wall hello system shut down in 3 minutes có thể hữu dụng
wc
[-cmlLw] files
hiển thị số byte, word và dòng của tập tin wc -w file; wc -l file  
wget
 [options] {url}
cho phép tải về 1 tập tin từ máy phục vụ wget -p http://www.123.com/file1 tiện lợi khi dùng trong một script
which
 [options] {program}
hiển thị tên đầy đủ của một mệnh lệnh which cp  
whereis
 [-bmsuBMSf] {file}
tìm ra chỗ lưu giữ của dữ liệu, nguồn, và trang hưóng dẫn của một lệnh whereis mkdir  
whatis
 
{word}
tìm trong cơ sở dữ liệu của lệnh whatis thông tin về một từ (tên, thuật ngữ) whatis for dùng đẻ tìm các mô tả ngắn gọn của một mệnh lệnh hay một từ khoá
who
 [-ilqT]
nêu ra tài khoản những người đang truy nhập who -i quản lý
whoami  hiển thi tên tài khoản hiên dung và số ID whoami  
xargs
 [options] {commands [arg]}
thi hành một dòng lệnh từ stdin find ~ -name *.txt | xargs -i ls -l {} hữu dụng khi dùng ngõ ra của một mệnh lệnh biến thành tham số của mệnh lệnh khác

A3 Tên tập tin trong Linux và kí tự phỏng định

A3.1. Tên tập tin

A3.1.1 Khái niệm:

Tên tập tin là một dãy hữu hạn các kí tự (hay một string) được dùng để nhận diện một tập tin.

Trong phần phụ lục này khi nhắc đến tên tập tin chúng ta quy ước rằng đó là tên riêng (không phải là tên đầy đủ)

A3.1.2 Các Quy ước và khuyến cáo về tên tập tin trong Linux:

Tên của một tập tin trong Linux có thể bao gồm các kí tự bất kì ngoại trừ kí tự /  và kí tự 'null'.  Kí tự / được dành làm tên của thư mục gốc (thư mục gốc là thư mục chứa tất cả các thư mục và tập tin khác). Trong khi đó , kí tự null, mà trong Linux thường được kí hiệu là $, là kí tự được dùng để kết thúc một string.

Kí tự khoảng trống (space) cho phép được dùng nhưng được khuyên là nên tránh dùng để làm thành phần tên của tập tin vì nó có thể gây ra việc không tương thích với nhiều chương trình không chuẩn của Linux.

Thông thường thì tên của các tập tin chỉ có các chữ cái viết hoa và viết thường, các số, dấu gạch dưới  _  (underscore), dấu nối - (hyphen) và dấu chấm . (dot)  . Đại đa số tên tập tin nhất là tên các mệnh lệnh trong Linux dược viết không có chữ viết hoa (thí dụ myfile, root, readme,...).  (Khác với windows, tên tập tin trên Linux có thể bắt đầu bằng dấu chấm . thí dụ như .bashrc và để hiển thị các tập tin loại này bạn có thể dùng lệnh ls -a)

Trong các kí tự đặc biệt như  $ % # ! ^ & * ? < > , ; : +  =  \ ~ `  và các dấu ngoặc thưòng có giá trị riêng biệt trong các trình bao nên tránh được dùng để đặt tên. Tên tập tin không bao giờ bắt đầu bằng dấu nối -

Trong một số hệ thống UNIX cũ thì tên của tập tin chỉ giới hạn tối đa 14 byte.  Nhưng trong các hệ điều hành tựa Unix thì nó có thểdài tới 255 kí tự. 

Cũng như các hệ điều hành khác, trực thuộc cùng một thư mục không cho phép có hai tập tin cùng tên.  tuy nhiên, điều này không cấm việc hai tập tin hoàn toàn giống nhau có cùng tên nhưng nằm trong hai thưc mục riêng, các tập tin cùng tên này có thể phân biệt được là vì chúng có tên đầy đủ khác nhau

Thư mục gốc là thư mục duy nhất có tên là  / và tên này không thể thay đổi

Có nhiều cách để đổi tên một tập tin (xem thêm đổi tên tập tin) . Một tập tin có ít nhất một tên nhưng có thể có nhiều tên (xem thêm phần phụ lục B về các kiểu tập tin)

A3.2 Kí tự phỏng định:

Kí tự phỏng định hay còn gọi là kí tự thay thế được hiểu là một loại kí tự mà nó được dùng để đại diện cho một (hay một dãy) kí tự khác.  Có hai loại kí tự phỏng định được dùng trong biểu thị tên của các tập tin đó là

? Kí tự "dấu hỏi" đại diện cho bất kì một kí tự nào

* Kí tự "dấu sao" đại diện cho bất kì dãy ký tự hợp lệ nào kể cả dãy kí tự trống. 

Các kí tự phỏng định sẽ được dùng rộng rãi trong nhiều mệnh lệnh của Linux

Thí dụ:

Một dãy kí tự có dùng các quy ước về kí tự phỏng định này có thể xem là một dạng đơn giản của biểu thức chính quy mà chúng ta sẽ có dịp tìm hiểu sâu hơn trong các bài sau

A4 Đặc tính đệ quy trong các lệnh hệ thống Linux

Đệ quy là một dạng qúa trình hay một thao tác mà tự nó có thể gọi chính nó để lập lại qúa trình hay thao tác đó.  Trong hầu hết các ngôn ngữ lập trình khi nhắc đến tính đệ quy tức là việc cho phép một hàm được gọi lại chính nó.  BASH hổ trợ tính đệ quy này để tạo các hàm đệ quy.  Tuy nhiên, trong các lệnh hệ thống của Linux, khi nhắc tới tính dệ quy, thì người tà hiểu là khả năng để mệnh lệnh này tự tìm vào các thư mục con của thư mục là đang là đối tượng thực thi để tiếp tục thực thi cùng một lệnh này cho tới khi không còn thư mục con nào chưa dược thực thi nữa.  Dĩ nhiên, khi thực thi với chức năng đệ quy thì các lệnh cùng thường thay đổi dạng hiển thị trả về cho thích hợp.

Trong Linux, tham số để gọi một lệnh hệ thống chạy đệ quy trên một thư mục thường là --recursive (hay là  -r hoặc -R tùy theo lệnh hỗ trợ). Tuy nhiên, chức năng này cũng có thể bị giới hạn tùy theo lệnh.

Để biết một lệnh của Linux có hỗ trợ tính năng này hay không thì có thể dùng lệnh man <TÊN_LỆNH> và đọc hướng dẫn

Thí du:

A5 Lược tả các loại tập tin trong Linux/UNIX

Trong Linux/UNIX, các thiết bị phần cứng có giao diện mệnh lệnh (command interface) và sự thông dịch mệnh lệnh (command interpretation) rất đa dạng .  Để giải quyết thống nhất, Linux/UNIX xác định một phương pháp chuẩn của I/O nhằm truy cập tới mọi kiểu thiết bị được gắn nối vào máy tính cũng như là việc điều hợp mọi thành phần phần cứng.  Đó là kiến trúc hệ điều hành sao cho nó xem tất cả các  thiết bị hay dữ liệu đều là "một dạng tập tin".  Tuỳ theo chức năng của một tập tin mà nó có thể được phân loại như sau:

A5.1 Tập tin thông thường: 

Tập tin thông thường là một "thùng chứa mà đơn vị chứa là byte". Mọi tập tin đều có thể xem  là tập tin thông thường. giống như Windows, một tập tin có thể là tập tin khả thi (executable), có thể là tập tin văn bản (text), là tập tin hình ảnh, là một chương trình phần mềm, một bộ mã nguồn C, hay là một thiết bị. Một tập tin mà không có dữ liệu nào bên trong là tập tin rỗng.

A5.2 Thư mục:

Thư mục là một "ngăn chứa của các tập tin". Ngăn chứa này có thể không chứa tập tin nào hay chứa nhiều loại tập tin khác nhau nhưng nó không thể chứa chính nó.  Thực mục lớn nhất là thư mục "/" được gọi là thư mục gốc (root directory).  Thư mục gốc là thư mục mẹ chứa bên trong nó tất cả các tập tin của một hệ thống. Một thư mục có thể được tạo thành bởi lệnh mkdir <TÊN_TẬP_TIN> và có thể xóa bởi lệnh rmdir <TÊN_TẬP_TIN> hay lệnh rm -r <TÊN_TẬP_TIN>   (Trong hình minh họa thì tập tin mydir là thư mục và nếu để ý thì ở ct phân loại tập tin có hiển thị chữ d (viết tắt từ chữ directory)

A5.3 Thiết bị:

Đây là loại tập tin có vai trò đặc biệt. Nó cho phép các chương trình Linux/UNIX liên lạc với hệ thống phần cứng và các thiết bị ngoại vi. Có hai loại tập tin thiết bị là bộ điều vận (device driver) và tập tin thiết bị (device file)

A5.3.1 Bộ điều vận: Như Windows, hệ điêu hành cần có các bộ điều vận (device driver) để chuyển đi các mệnh lệnh hay nhận về các trả lời từ thiết bị. Bộ điều vận trong linux thương có tên mở rộng là ".ko" (cho các phiên  hạt nhân (kernel) tương đối mới 2.6.x trở lên) và ".o" (cho các phiên bản hạt nhân cũ hơn).  Để một thiết bị phần cứng hoặt động được thì hạt nhân trước hết phải tải (load) các bộ điều vận tương ứng.  Có thiết bị chỉ cần 1 bộ điều vận để hoạt động nhưng cũng có thiết bị đòi hỏi tải nhiều bộ điều vận khác nhau để hoạt động được. Người ta phải dùng trình dịch mà thông thường là C hay C++ để tạo nên một bộ điều vận.  Các bộ điều vận quan trọng thường sẽ được chứa trong thư mục /lib/modules/. Người ta còn gọi tên của bộ điều vận là module. Các module chỉ có thể có mặt 1 thực thể trong bộ nhớ. Người ta dùng lệnh insmod hay modprobe để tải lên bộ nhớ bộ điều vận nào chưa được tải và dùng lệnh rmmod hay modprobe -r để dở tải một module. Một khi đã dở tải thì thiết bị phần cứng tương ứng với bộ điều vận sẽ không liên lạc được với hệ điều hành, dó đó, cần phải tải bộ điều vận của thiết bị đó nếu muốn nó hoạt động trở lại. Lệnh lsmod sẽ cho phép hiển thị các module đang được tải trong hạt nhân

 A5.3.2 Tập tin thiết bị:  Thông thường các thiết bị xuất nhập hay chứa dữ liệu còn đòi hỏi thêm một loại tập tin nữa nhằm cho phép hệ điều hành xuất hay nhập dữ liệu cũng như là để truy cập nội dung của thiết bị nếu đó là thiết bị lưu trữ dữ liệu (data storage).  Thiết bị này được có tên chung là tập tin thiết bị.  Các tập tin thiết bị nếu đuợc hệ điều hành dùng để truy cập nội dung của một thiết bị lưu trữ thì còn được gọi là "điểm kết" (mount point). Người ta chia tập tin thiết bị (xuất nhập) thành hai loại và chúng đều được chứa trong thư mục "/dev":

A5.3.2.1 Tập tin thiết bị kiểu kí tự (Character device Files): Loại thiết bị này cho phép bộ điều vận của nó có bộ đệm xuất nhập (I/O buffer) riêng. Đây là  thiết bị chứa dữ liệu (data storage device) hay thiết bị vận chuyển dữ liệu cho phép thay đổi (hay vận chuyển) dữ liệu từng  kí tự.  Thí dụ của loại thiết bị này là các máy in hay các thiết bị đầu cuối (terminal). 

A5.3.2.2 Tập tin thiết bị kiểu khối: (Character device Files): Các thiết bị kiểu này sẽ không có bộ đệm, chúng xử lí I/O trong một khối lớn.  Thay vào đó, OS (hạt nhân) sẽ cung cấp một bộ đệm. Các ổ cứng và các băng từ đều là thiết bị kiểu khối.  Mỗi tập tin thiết bị được đặc trưng bởi hai số trọng số của thiết bị  (major device number)  và khinh số của thiết bị (minor device number).  Trọng số sẽ cho biết đó là thiết bị loại gì và bộ điều vận nào trong khi khinh số cho phép bộ điều vận biết được đơn vị cụ thể nào để làm việc với.  Thí dụ trọng số là 8 tương ứng với đó là thiết bị SCSI (các ổ cứng) và phần cứng ổ dữ liệu (volume) đầu tiên sẽ có khinh số là 0.  Để xem thêm các chi tiết bạn có thể gọi lệnh ls -l /dev/sda) (trong hình minh hoạ thì tập tin sdm là tập tin thiết bị lưu trữ kiểu khối cột phân loại file hiển thị chữ b (viết tắt của chữ block)

Do tầm quan trọng của các tập tin thiết bị, phần chi tiết sẽ được dđào sâu hơn trong phụ lục tiếp theo của bài kì tới.

A5.4 Ổ nối:

Đây là một cơ chế liên lạc. Ổ nối thường đuợc dùng như là một đểm cuối cho việc gửi và nhận dữ liệu giữa hai máy tính. Có nhiều loại socket.  Hầu hết trong chúng được dùng trong kĩ thuật nối mạng và một số được dùng trong hệ thống in ấn.  Mặc dù ổ nối được nhìn thấy trong Linux như là các thư mục, nhưng chúng sẽ không thể đọc hay viết bởi các chương trình mà không có tham dự vào sự nối kết trong liên lạc.  Để tạo ra một ổ nối dùng lệnh socket và để xoá chúng người ta dùng lệnh rm hay unlink

A5.5 Ống truyền dẫn tên (named pipe):

Đây là loại tập tin FIFO (từ chữ "first-in-first-out" nghiã "vào trước thì ra trước).   Nó cho phép hai chương trình độc lập trên cùng một máy chủ (host) có thể liên lạc với nhau theo nguyên tắc thông tin gửi vào trước sẽ phải lấy ra trước.  Ống truyền dẫn tên có thể tạo ra bởi lệnh mknod hay mkfifo và xóa bởi lệnh rm.  Một cách hữu hiệu hơn để dùng named pipe là thiết lập nó trong ngôn ngữ C/C++.

A5.6 Liên kết (link):

Thực ra liên kết không phải là một loại tập tin.  Đây chính là một cơ chế của  hệ thống Linux nhằm cho phép một tập tin có nhiều hơn một tên. Có hai loại liên kết.

A5.6.1 Liên kết cứng (hard link):  Mỗi tập tin trong Linux/Unix có ít nhất một liên kết (kiểu này) thường đó là tên mà tập tin lần đầu tiên được tạo thành. Việc thêm vào một liên kết cứng sẽ tạo thêm tên khác cho cùng tập tin đó.  Khi một hard link được tạo thành thì nội dung của nó hoàn toàn giống với nội dung của tập tin ban đầu.  Trong thực tế, khi có tập file2 là liên kết cứng của fie1 (nói ngược lại file1 cũng sẽ là liên kết cứng của file2) thì một khi nội dung hay thuộc tính của file1 (hay file2) thay đổI thì cũng kéo theo nội dung của tập tin còn lại thay đổi theo tương ứng. Tuy nhiên, khi xóa 1 trong chúng thì tập tin còn lại sẽ không bi thay đổi (xem thêm thí dụ dưới đây). Theo quy định thi không thể tạo ra một liên kết cứng đến một thư mục. Dùng lệnh ln để tạo liên kết cứng đến 1 tập tin và dùng rm để xoá. Vì không có sự phân biệt nào về mặt cấu trúc giữa một tập tin ban đầu và tập tin hard link tạo ra sau này nên không thể dùng các phương cách thông thường để biết tập tin nào tạo ra trước và chúng lại cùng có 1 nội dung một thuộc tính như nhau. Dẫu sao, lệnh ls -l trên các tập tin sẽ cho thấy các thuộc tính hoàn toàn trùng nhau của hai tập tin cùng liên kết về 1 nội dung.

A5.6.2 Liên biểu trưng (symbolic link) hay còn gọi là liên kết mềm (soft link):  Đây là một tập tin tựa như con trỏ chỉ tới tên đầy đủ của một tập tin khác mà nó liên kết tới. Trong hầu hết các trường hợp, thì liên kết biểu trưng hoạt động giống như liên kết cứng.  Hơn nữa, một liên kết mềm có khả năng liên kết tới một tập tin là thư mục (trong khi hark link thì không).  Có một sự phân biệt cơ bản giữa hai loại liên kết đó là liên kết cứng là một dạng tham chiếu trục tiếp (đến dữ liệu trong tập tin) trong khi liên kết mềm chỉ tham chiếu đến tên của tập tin. Để tạo một liên kết mềm dùng lệnh ln -s và dùng rm để xoá. Để biết một tập tin là liên kết mềm hay không thì dùng lệnh ls -l  hay lệnh file lên tập tin đó; tập tin là liên kết mềm sẽ được hiển thị thêm hình mũi tên chỉ tới tên tập tin nguồn mà nó liên kết đồng thời trong cột chỉ phân loại tập tin sẽ hiển thị bởi chữ l (viết tắt từ chữ "link")

A5.6.3 Thí dụ:  Trong thí dụ của phụ lục A1 hardlink softlink lần lượt là liên kết cứng và mềm của tập tin mark.txt (xem các dòng 6,7,11). Văn lệnh sau đây sẽ cho thấy sự khác nhau giữa hai loại liên kết. 

#to see similarity and difference between hard link and symbolic link
echo "My file" > original
ln hardlink  original  # create hard link from file1
ln -s softlink original  #create symbolic link from file1
echo "content of original file"
cat original
echo "content of hardlink"
cat hardlink
echo "content of softlink"
cat softlink
#now edit hard and softlink
echo "my hardlink" >> hardlink
echo "my softlink" >> softlink
echo "After editing, the content of original file is:"
cat original
echo "content of hardlink is:"
cat hardlink
echo "and content of softlink:"
cat softlink
echo "displaying the different:"
ls -l original hardlink softlink
# the difference after removing original
rm -f original
cat softlink             # it should generate an error
cat hardlink             # it should be OK
echo "checking again how thay are displayed:"
ls -l original hardlink softlink
 

Bài kì tới: Biến và tham số.  Các thiết bị quan trọng trong Linux. tập tin thiết bị, hệ thống tập tin /proc


Chú thích:

(1):  Sự khác biệt căn bản giữa một tập tin ASCII trong Windows và trong Linux là trong tập tin trong định dạng kiểu DOS/Windows các dấu xuống hàng (cariage return - 0D) thường đi kèm với dấu đầu dòng (newline - 0A) trong khi đó tập tin dạng này trong Linux chỉ có các dấu đầu dòng. Nhiệm vụ của lệnh dos2unix chỉ là để lấy những kí tự không tương thích và thay vào đó những gì cần thiết để làm cho tập tin trở nên tương thích với Linux

(2) Cái răng, cái tóc là gốc con người (tục ngữ)

(3) Trong BASH thì bộ mô tả tập tin (file descriptor) ngõ vào chuẩn stdin còn được kí hiệu là 0< (hay 0 ), stdout được kí hiệu là 1> (hay 1), và stderr là 2>  (hay 2) --  Xem thêm phụ lục trong các bài tới về các loại tập tin và thiết bị.

(4) Root (dịch nghiã là gốc, hay tổ tiên) là người dùng có quyền truy cập mọi tập tin, có thể tiến hành mọi thao tác  của hệ thống Linux.  Root có thể hiểu là tài khoản của người quản trị. Khái niệm root này tương đương với khai niệm administrator (người quản trị) trong hệ thống Windows

(5) Wildcard:  Một dạng kí tự đặc biệt, tùy theo quy ước, có thể đại diện cho một hay dãy kí nào đó chưa xác định rõ ràng. Có nơi dịch là "kí tự thay thế"

 

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