Mỗi khi bạn sử dụng terminal trong Ubuntu, Linux Mint hay bất cứ bản phân phối nào của Linux, bạn luôn tương tác một cách gián tiếp với shell. Vậy shell là gì? Bài viết này sẽ cung cấp mọi kiến thức cơ bản cần biết về Linux Shell và Shell Script.
Khái niệm Kernel là gì?
Kernel là chương trình máy tính cốt lõi của hệ điều hành, có toàn quyền kiểm soát mọi thứ trên hệ thống, trong đó có các tài nguyên quan trọng như: quản lý file, process, I/O, bộ nhớ, thiết bị,…
Vì vậy, có thể xem một hệ thống Linux hoàn chỉnh bao gồm kernel, công cụ và thư viện GNU, cùng với theo đó là những script quản lý và cài đặt.
Shell là gì?
Shell là một chương trình đặc biệt cung cấp giao diện người dùng khi sử dụng các dịch vụ của hệ điều hành. Shell nhận lệnh từ con người rồi chuyển sang ngôn ngữ tương ứng của kernel, do đó có thể xem shell là một trình phiên dịch với đầu vào là các thiết bị ngoại vi hoặc file. Khi người dùng đăng nhập hoặc khởi động terminal trong Linux thì shell cũng sẽ được khởi chạy.
Shell được phân thành hai loại chính: Command Line Shell và Graphical Shell.
Command Line Shell
Shell có thể được truy cập bằng giao diện command line hoặc terminal. Dưới đây là giao diện trong terminal của Ubuntu 16.4:
Việc sử dụng shell command line có thể hơi khó khăn với những người mới vì phải làm việc với nhiều câu lệnh phức tạp. Mặt khác, đây lại là một công cụ vô cùng mạnh mẽ, cho phép lưu trữ và thực thi nhiều file cùng lúc, thậm chí có thể được tự động hóa. Các file này thường được gọi là file batch trong Windows, hoặc Shell script trong Linux/macOS.
Graphical Shell
Graphical shell cung cấp các phương thức thao tác với chương trình dựa trên giao diện GUI, cho phép mở, đóng, di chuyển và điều hướng giữa các cửa sổ. Với cách này, người dùng không cần phải nhập lệnh để thực hiện các thao tác trên hệ thống mà có thể tương tác trực tiếp với chương trình như trên Windows hay Ubuntu.
Hầu hết các shell đều thực hiện cùng một nhiệm vụ, nhưng cung cấp nhiều lệnh và hàm khác nhau để thực hiện. Một số shell có sẵn trên hệ thống Linux gồm có:
- BASH (Bourne Again Shell) – Shell phổ biến nhất trên Linux, được dùng làm shell đăng nhập mặc định trên Linux và macOS. Ngoài ra người dùng Windows cũng có thể cài đặt shell này nếu cần.
- CSH (C Shell) – Có cú pháp và cách sử dụng giống với ngôn ngữ lập trình C.
- KSH (Korn Shell) – Cơ sở cho các thông số kỹ thuật tiêu chuẩn của POSIX Shell.
Shell Scripting là gì?
Shell nhận lệnh từ người dùng để thực thi, tuy nhiên đôi khi ta có thể cần thường xuyên thực hiện một số lệnh, mà việc nhập từng lệnh mỗi khi cần thực thi sẽ tốn rất nhiều thời gian.
Shell cũng có thể lấy input là các lệnh từ file, vì vậy người dùng cũng có thể viết các lệnh này trong file rồi thực thi để tránh việc nhập lại lệnh nhiều lần. Các file này được gọi là Shell Script/Shell Program. Shell script cũng tương tự như các file batch trong MS-DOS, được lưu với phần mở rộng là .sh.
Một shell script có cú pháp tương tự như các ngôn ngữ lập trình nên những người dùng đã có sẵn kinh nghiệm với Python hay C/C++ sẽ làm quen rất nhanh với shell script.
Một shell script bao gồm các thành phần sau:
- Keyword:
if, else, break,...
- Lệnh:
cd, ls, echo, pwd,...
- Hàm
- Control flow:
if..then..else,...
Vì sao nên sử dụng shell script?
Có rất nhiều lý do khác nhau để sử dụng shell script, chẳng hạn như:
- Hạn chế việc thực thi code nhiều lần.
- Dễ dàng backup hệ thống thường xuyên bằng shell script.
- Giám sát hệ thống.
- Bổ sung chức năng vào shell.
Bên cạnh đó ta cũng không thể không kể đến các ưu điểm chính của việc sử dụng shell script như:
- Câu lệnh và cú pháp tương tự như trong command line.
- Giao diện debug có tính tương tác cao.
Mặt khác, shell script lại có tốc độ thực thi không cao, không phù hợp với các tác vụ nặng và phức tạp. Bên cạnh đó, việc sử dụng shell script cũng làm tăng rủi ro dẫn đến lỗi hàng loạt khi thực thi lệnh, vì vậy người dùng phải hết sức cẩn thận khi viết và thay đổi bất kỳ lệnh nào.
Ví dụ về shell scripting
Trong phần cuối cùng của bài viết, hãy cùng xem qua một trường hợp sử dụng shell script đơn giản. Khi làm việc với terminal, việc điều hướng giữa các thư mục đôi khi tốn giá nhiều thời gian và cần sử dụng các câu lệnh lặp đi lặp lại nhiều lần. Giả sử ta cần quay trở về python từ thư mục hiện tại thì sẽ phải thực hiện câu lệnh như dưới đây:
Cảm giác rất cồng kềnh đúng không nào? Bây giờ hãy thử tạo một công cụ cho phép điều hướng đến thư mục chỉ bằng cách nhập tên của thư mục đó:
# !/bin/bash
# A simple bash script to move up to desired directory level directly
function jump()
{
# original value of Internal Field Separator
OLDIFS=$IFS
# setting field separator to "/"
IFS=/
# converting working path into array of directories in path
# eg. /my/path/is/like/this
# into [, my, path, is, like, this]
path_arr=($PWD)
# setting IFS to original value
IFS=$OLDIFS
local pos=-1
# ${path_arr[@]} gives all the values in path_arr
for dir in "${path_arr[@]}"
do
# find the number of directories to move up to
# reach at target directory
pos=$[$pos+1]
if [ "$1" = "$dir" ];then
# length of the path_arr
dir_in_path=${#path_arr[@]}
#current working directory
cwd=$PWD
limit=$[$dir_in_path-$pos-1]
for ((i=0; i<limit; i++))
do
cwd=$cwd/..
done
cd $cwd
break
fi
done
}
Tiếp theo, ta cần chạy lệnh sau để cho phép thực thi shell script:
$ chmod +x path/to/our/file/jump.sh
Để áp dụng cho mọi phiên terminal thì ta phải đưa script này vào file .bashrc – một shell script được chạy bởi Bash, file này được dùng đề thiết lập các biến, hàm, alias, định nghĩa các thiết lập muốn sử dụng khi mở một cửa sổ terminal bất kỳ.
Mở terminal rồi chạy lệnh sau:
$ echo “source ~/path/to/our/file/jump.sh”>> ~/.bashrc
Bây giờ ta có thể thử dùng lệnh jump vừa định nghĩa ở trên:
$ jump dir_name
Vậy là ta đã rút gọn việc sử dụng lệnh cd nhiều lần bằng shell scripting. Tất nhiên khả năng của shell scripting còn có thể được mở rộng hơn nữa, các bạn đọc hãy thử tự khám phá nhé!
Lời kết
Bài viết này đã cung cấp những kiến thức cơ bản về Linux shell và một công cụ vô cùng tiện lợi là Shell Script. Nếu có bất kỳ câu hỏi nào thì hãy để lại ở phần comment ở bên dưới để được giải đáp nhanh chóng nhé!