Linux là gì?
Thuật ngữLinuxthực chất được sử dụng để chỉ “nhân Linux” (Linux kernel) Tuy nhiên trong thực tế, tên gọi Linux được sử dụng một cách rộng rãi để chỉ
Hệ điều hành giống Unix (Unix-like) tuân theo tiêu chuẩn POSIX (Portable Operating System Interface) được hình thành từ việc kết hợp nhân Linux với các thư viện và công cụ của GNU.
• Các bản phân phối Linux (xem Phần 2.6).
Nhân Linux
Nhân hệ điều hành (OS kernel) là thành phần cốt lõi của hầu hết các hệ điều hành máy tính, chịu trách nhiệm quản lý tài nguyên hệ thống và kết nối giữa phần cứng và phần mềm Nhân hệ điều hành cung cấp hai chức năng chính cho hệ thống.
Hệ điều hành cung cấp tài nguyên máy tính như bộ nhớ, CPU và thiết bị vào/ra cho các tiến trình của phần mềm ứng dụng Điều này được thực hiện thông qua các cơ chế liên lạc giữa các tiến trình và các hàm hệ thống, giúp phần mềm thực hiện các chức năng cần thiết.
Linux thiết lập rào chắn giữa các tiến trình khác nhau, giúp đảm bảo rằng nếu một tiến trình gặp sự cố, nó sẽ không ảnh hưởng đến tiến trình còn lại Đây là một trong những ưu điểm nổi bật của Linux so với các hệ điều hành như DOS và Windows.
Hình 1: Sơ đồ hoạt động của nhân hệ điều hành
Nhân Linux, được phát triển bởi Linus Torvalds vào năm 1991, được xây dựng bằng ngôn ngữ lập trình C và mô phỏng lại nhân Unix, một hệ điều hành máy tính ra đời trong những năm 1960-1970 với thiết kế theo mô-đun Nhiều đặc điểm của nhân Linux được kế thừa từ nhân Unix, tạo nên sự tương thích và hiệu suất cao.
Nhân kiểu nguyên khối (monolithic kernel) thực hiện các nhiệm vụ bằng cách chạy toàn bộ mã hệ điều hành trong cùng một địa chỉ bộ nhớ, điều này giúp tăng cường hiệu suất của hệ thống.
Hệ điều hành được thiết kế theo mô-đun, cung cấp một bộ công cụ đơn giản, trong đó mỗi công cụ thực hiện những chức năng hạn chế và được xác định rõ ràng.
The Filesystem Hierarchy Standard (FHS) organizes files in a hierarchical structure resembling a tree, with the root directory at the top, represented by the forward slash "/".
• Unix shell: giao diện trung gian giữa người dùng và nhân Unix.
• Cơ chế pipeline: xây dựng các lệnh phức tạp hơn bằng cách kết hợp các lệnh đơn giản.
Lịch sử hình thành Linux
Hệ điều hành Linux được phát triển dựa trên hai nền tảng chính đó là hệ điều hành Unix và
Hệ điều hành Unix được phát triển vào năm 1969 tại viện nghiên cứu Bell của AT&T (Mỹ) bởi các nhà khoa học Ken Thompson, Dennis Ritchie, Douglas McIlroy và Joe Ossanna Phiên bản đầu tiên của Unix ra đời vào năm 1971 và được lập trình bằng ngôn ngữ Assembly.
Năm 1973, Dennis Ritchie đã viết lại hệ điều hành Unix bằng ngôn ngữ C, trừ phần nhân hệ điều hành và I/O Việc sử dụng ngôn ngữ bậc cao giúp dễ dàng mang mã nguồn sang các nền tảng máy tính khác và biên dịch lại, cho phép Unix hoạt động trên nhiều hệ thống khác nhau Nhờ vào những lợi ích này, Unix nhanh chóng phát triển và trở thành hệ điều hành phổ biến trong các trường học và doanh nghiệp.
Năm 1983, Richard Stallman khởi xướng Dự án GNU nhằm phát triển một "Hệ thống phần mềm hoàn chỉnh tương thích với Unix" với toàn bộ phần mềm tự do Đến năm 1985, ông thành lập Tổ chức phần mềm tự do và vào năm 1989, ông đã tạo ra Giấy phép chung GNU (GNU General Public License - GNU GPL).
Năm 1987, hệ điều hành MINIX (viết tắt của “mini-Unix”) được thiết kế bởi giáo sư Andrew
S Tanenbaum dựa trên nền tảng Unix nhằm phục vụ cho mục đích giáo dục Chính MINIX là nguồn cảm hứng cho Linus Torvalds để tạo ra Linux sau này.
Vào đầu thập niên 1990, nhiều ứng dụng cho hệ điều hành Unix đã được phát triển, nhưng các thành phần cơ bản như trình điều khiển thiết bị và daemons vẫn chưa hoàn thiện Do đó, nhu cầu cấp thiết là cần một hệ điều hành hoàn chỉnh để có thể vận hành các chương trình này.
Vào năm 1991, trong thời gian học tại Đại học Helsinki, Linus Torvalds đã nảy ra ý tưởng phát triển một hệ điều hành mới, nhận thấy rằng giấy phép của MINIX chỉ cho phép sử dụng trong giáo dục Ông bắt đầu xây dựng nhân Linux trên nền tảng MINIX để cho phép các ứng dụng viết cho MINIX có thể chạy trên Linux Theo thời gian, các ứng dụng GNU dần thay thế các thành phần của MINIX, nhờ vào lợi ích của việc sử dụng mã nguồn mở từ dự án GNU.
Linux 1.0 được phát hành vào năm 1994 dưới giấy phép GNU, cho phép người dùng tải về và xem mã nguồn Kể từ đó, nhiều phiên bản Linux đã được phát triển với các hướng đi đa dạng.
Hệ điều hành Linux đã nhanh chóng đạt được thành công nhờ vào mô hình phát triển phần mềm nguồn mở hiệu quả Nó nổi bật với chi phí phần cứng thấp, tốc độ cao so với các phiên bản Unix độc quyền, và khả năng bảo mật tốt cùng độ tin cậy cao khi so sánh với Windows Ngoài ra, Linux còn có ưu điểm về giá thành rẻ và không bị phụ thuộc vào nhà cung cấp.
Kiến trúc của Linux
Ta có thể chia kiến trúc của Linux thành 2 khu vực chính (xem Hình 2)
Vùng nhân hệ điều hành (kernel space) gồm 3 thành phần chính
Mã nhân phụ thuộc kiến trúc vi xử lý trong Linux chủ yếu là độc lập với kiến trúc, nhưng vẫn có những phần cần tuân thủ theo từng kiến trúc cụ thể để đảm bảo hoạt động hiệu quả Thư mục con /linux/arch chứa các mã nguồn phụ thuộc vào kiến trúc, ví dụ như thư mục i386.
• Nhân hệ điều hành (kernel) phần mã nhân độc lập với kiến trúc vi xử lý, như đã trình bày bên trên.
Giao diện các hàm hệ thống (System call interface - SCI) là cầu nối giữa vùng ứng dụng và nhân Linux, cho phép gọi các hàm hệ thống một cách hiệu quả Giao diện này hoạt động độc lập với kiến trúc bộ vi xử lý, đảm bảo tính linh hoạt ngay cả trong cùng một họ vi xử lý Các gói liên quan được lưu trữ trong thư mục ẩn /linux/kernel, trong khi phần phụ thuộc vào kiến trúc vi xử lý được tìm thấy trong /linux/arch.
Vùng không gian của người dùng (user space) gồm 2 thành phần chính
• Các ứng dụng của người dùng (User Applications) bao gồm các phần mềm, gói ứng dụng.
Thư viện C (GNU C Library) cung cấp giao diện cho các hàm hệ thống, giúp kết nối giữa các ứng dụng và nhân Linux Giao diện này rất quan trọng vì nó cho phép các ứng dụng và nhân Linux hoạt động trong các vùng địa chỉ bộ nhớ bảo vệ khác nhau Mỗi ứng dụng có một vùng địa chỉ ảo riêng, trong khi nhân Linux sở hữu một vùng địa chỉ duy nhất.
Các thành phần chính của một hệ điều hành Linux hoàn chỉnh gồm có
Bộ khởi động (bootloader) là chương trình đầu tiên được thực thi khi máy tính khởi động, với nhiệm vụ chính là tải nhân Linux vào bộ nhớ Một số bộ khởi động phổ biến hiện nay bao gồm GRUB và LILO.
Hình 2: Kiến trúc của hệ điều hành Linux
Trình khởi động (init program) là tiến trình gốc do nhân Linux khởi động, đóng vai trò quan trọng trong việc khởi tạo các tiến trình khác trong hệ thống Tất cả các tiến trình, bao gồm dịch vụ hệ thống và dấu nhắc đăng nhập (cả giao diện đồ họa lẫn dòng lệnh), đều được khởi động thông qua init, tạo nên cấu trúc cây tiến trình của hệ điều hành.
Thư viện phần mềm trên hệ thống Linux chứa các tập tin thư viện cần thiết cho các tiến trình đang chạy, sử dụng định dạng ELF (Executable and Linkable Format) Trình liên kết động ld-linux.so quản lý việc sử dụng các thư viện liên kết động Thư viện ngôn ngữ C của GNU là thư viện phổ biến nhất trên hệ thống Linux Khi người dùng tự biên dịch phần mềm, các tập tin header sẽ được thêm vào để mô tả giao diện cho các thư viện đã được cài đặt.
• Các chương trình giao diện người dùng như các shell hoặc môi trường cửa sổ (windowing environments).
Một số đặc tính của hệ điều hành Linux
Mã nguồn mở theo giấy phép GNU cho phép người dùng Linux truy cập vào phần mềm miễn phí, có khả năng thay đổi mã nguồn theo nhu cầu Người dùng cũng có quyền phân phối lại phần mềm, miễn là kèm theo mã nguồn và ghi chú các thay đổi đã thực hiện.
Trong Linux, đa nhiệm cho phép các tiến trình hoạt động độc lập mà không bị cản trở lẫn nhau Nhân Linux sử dụng chế độ phân chia thời gian của CPU, phân bổ thời gian thực hiện cho từng tiến trình một cách lần lượt.
Hệ điều hành Linux hỗ trợ đa người dùng, cho phép nhiều người làm việc đồng thời Nó cung cấp tất cả các tài nguyên hệ thống cho người dùng thông qua các terminal, sử dụng giao diện dòng lệnh (Command Line Interface - CLI).
Linux, ban đầu được phát triển trên nền tảng Intel 386/486, hiện nay có khả năng hoạt động trên tất cả các bộ vi xử lý Intel, bao gồm cả bộ xử lý 64bit Ngoài ra, Linux còn tương thích với nhiều loại bộ vi xử lý khác như AMD, ARM, DEC Alpha và SUN Sparc.
Hệ điều hành Linux đã phát triển nhiều trình giả lập cho các hệ điều hành khác như DOS, Windows 3.1 và Windows 95, cùng với Wine Bên cạnh đó, Linux còn cung cấp một loạt các chương trình tạo máy ảo mã nguồn mở và các sản phẩm thương mại như QEMU, Bochs và VMware.
Đưa bộ nhớ swap lên đĩa giúp tối ưu hóa hiệu suất làm việc với Linux khi bộ nhớ hạn chế Việc ghi một phần bộ nhớ lên ổ cứng sẽ làm giảm tốc độ xử lý, nhưng cho phép chạy các chương trình yêu cầu dung lượng bộ nhớ lớn mà máy tính không đủ khả năng cung cấp.
Hệ thống bộ nhớ của Linux tổ chức dữ liệu thành các trang có dung lượng 4KB, cung cấp bộ nhớ theo yêu cầu Chỉ những phần mã cần thiết của chương trình được tải vào bộ nhớ, trong khi các phần mã không sử dụng sẽ được lưu trữ trên đĩa.
Khi cần chạy nhiều bản sao của cùng một ứng dụng trên Linux, hệ điều hành chỉ nạp một lần mã chương trình vào bộ nhớ, cho phép tất cả các tiến trình tương tự chia sẻ mã này.
• Thư viện chung phân chia các thư viện thành các thư viện động (dynamic) và tĩnh (static), cho phép giảm kích thước bộ nhớ bị ứng dụng chiếm.
Bộ đệm động của đĩa bộ nhớ sẽ được điều chỉnh tự động: giảm khi bộ nhớ không được sử dụng và tăng lên khi hệ thống hoặc tiến trình cần nhiều bộ nhớ hơn.
Hệ thống tập tin Linux hỗ trợ đa dạng các định dạng, bao gồm DOS, OS/2 và các hệ thống mới như reiserfs và HFS Hai hệ thống tập tin chính của Linux, Second Extended File System (ext2fs) và Third Extended File System (ext3fs), giúp tối ưu hóa việc sử dụng không gian đĩa hiệu quả.
Khả năng hỗ trợ mạng của hệ thống bao gồm tất cả các dịch vụ Unix như NFS, kết nối từ xa qua telnet, rlogin và ssh, cũng như làm việc trong các mạng TCP/IP Hệ thống còn cho phép truy cập dial-up thông qua các giao thức SLIP và PPP, đồng thời hỗ trợ chia sẻ tập tin và in ấn từ xa trên các mạng Macintosh, Netware và Windows.
Các bản phân phối hệ điều hành
Hiện nay, có nhiều bản phân phối hệ điều hành Linux trên toàn thế giới, cho phép người dùng tải và cài đặt dễ dàng qua mạng Người dùng có thể chọn lựa hệ điều hành phù hợp với nhu cầu của họ, và các bản phân phối này thường được duy trì bởi cá nhân, tổ chức tình nguyện hoặc công ty Mỗi bản phân phối hoàn chỉnh bao gồm nhân Linux, hệ thống bảo mật và các gói phần mềm cần thiết Các bản phân phối sử dụng các trình quản lý gói khác nhau như dpkg, Synaptic, YAST, yum hoặc Portage để quản lý phần mềm trong hệ thống Một số bản phân phối Linux nổi bật và phổ biến nhất hiện nay bao gồm
Debian GNU/Linux là một hệ điều hành được phát triển từ Dự án Debian, dựa trên nhân Linux và tích hợp nhiều công cụ cơ bản từ dự án GNU Hệ điều hành này sử dụng hệ thống quản lý gói ứng dụng APT (Advanced Packaging Tool) để cài đặt và quản lý phần mềm hiệu quả.
Trang web: http://www.debian.org/
• Ubuntu: hệ điều hành dựa trên Debian GNU/Linux.
Trang web: http://www.ubuntu.com/
• Red Hat Enterprise Linux: bản phân phối Linux được phát triển bởi công ty Red Hat và mục tiêu hướng tới thị trường thương mại.
Trang web: http://www.redhat.com/rhel/
• Fedora: bản phân phối Linux dựa trên hệ thống quản lý gói ứng dụng RPM (RedHat Package Manager), được phát triển theo Dự án Fedora.
Trang web: http://www.fedoraproject.org/
• SUSE Linux: hệ điều hành mã nguồn mở xây dựng dựa trên nhân Linux.
Trang web: http://vi.opensuse.org/
• CentOS: có nguồn gốc từ bản phân phối Red Hat Enterprise Linux (RHEL).
Trang web: http://www.centos.org/
• OpenSolaris: hệ điều hành mã nguồn mở dựa trên nền tảng hệ điều hành Solaris (dành cho Unix) trước đó được tạo bởi công ty Sun Microsystems.
Trang web: http://www.opensolaris.org/
Scientific Linux là hệ điều hành được phát triển dựa trên nền tảng Enterprise Linux tại Fermilab, CERN và nhiều phòng thí nghiệm khác trên toàn cầu Hệ điều hành này tích hợp nhiều công cụ như Alpine và OpenAFS để phục vụ cho các nghiên cứu hiện tại, đồng thời thiết lập một nền tảng chung cho các thí nghiệm khác nhau trên thế giới.
Trang web: https://www.scientificlinux.org/
Shell
Hệ thống Linux có thể được chia thành hai phần chính: phần hệ thống, bao gồm nhân hệ điều hành, và phần người dùng, bao gồm các chương trình ứng dụng và công cụ Việc tương tác trực tiếp với nhân hệ điều hành rất phức tạp và yêu cầu kỹ thuật cao Để giảm bớt sự phức tạp cho người dùng và bảo vệ nhân khỏi những sai sót, một lớp vỏ (shell) đã được phát triển để bao quanh nhân.
Hình 3: Hình ảnh minh họa cấu trúc hệ điều hành Linux
Về cơ bản, shell là một giao diện (interface) tương tác giữa người dùng và nhân hệ điều hành.
Shell là một công cụ giúp thông dịch các lệnh từ người dùng hoặc từ các tập tin theo cú pháp nhất định, sau đó chuyển giao cho nhân hệ điều hành để thực hiện Mặc dù shell không phải là một phần của nhân hệ điều hành, nhưng nó sử dụng nhân để thực thi các lệnh và chương trình, và cuối cùng trả lại kết quả cho người dùng.
Các loại shell thường được sử dụng trong Linux gồm có
Bourne Shell (sh) là một trong những shell nguyên thủy của hệ điều hành Unix, được phát triển bởi Stephen Bourne tại phòng thí nghiệm AT&T Bell Shell này lần đầu tiên được phát hành trên phiên bản Unix, đánh dấu bước tiến quan trọng trong việc quản lý và tương tác với hệ thống.
7 năm 1977 Phần khởi tạo mặc định cho các tiến trình shell này mặc định là /bin/sh.
C Shell (csh) là một ngôn ngữ dòng lệnh được phát triển bởi Bill Joy và ra mắt vào năm 1979 trên hệ thống BSD Unix, mang đến cú pháp tương tự như ngôn ngữ lập trình C, giúp người lập trình dễ dàng hơn trong việc sử dụng Tuy nhiên, hiện nay, C Shell không còn phổ biến trên các hệ thống Unix/Linux và đã được thay thế bởi TENEX C Shell (tcsh).
Korn Shell (ksh), được phát triển bởi David Korn tại phòng thí nghiệm AT&T Bell vào đầu những năm 80, có khả năng tương thích ngược với Bourne shell và kế thừa một số tính năng từ C Shell Phần khởi tạo mặc định cho các tiến trình shell này là /bin/ksh.
Bourne Again Shell (bash), được phát triển bởi Brian Fox vào năm 1987 cho dự án GNU, hiện là shell mặc định trên hầu hết các hệ điều hành Linux và cũng có mặt trên Mac OS X Đường dẫn khởi tạo mặc định của bash là /bin/bash.
Z Shell (zsh), được phát triển bởi Paul Falstad vào năm 1990, là shell mới nhất tích hợp đầy đủ các tính năng của các shell trước đó Nó mang đến những cải tiến nổi bật như tính năng tự hoàn thành câu lệnh, kiểm tra lỗi cú pháp và hỗ trợ câu lệnh nhiều dòng.
Terminal
Để tương tác được với shell chúng ta cần một chương trình giao tiếp, trong Linux có hai phương thức giao tiếp gồm có
Hầu hết các hệ điều hành Linux hiện nay đều tích hợp Giao diện đồ họa người dùng (GUI), cho phép người dùng sử dụng chuột một cách dễ dàng, tương tự như trong hệ điều hành Windows.
Giao diện dòng lệnh (CLI) là phương thức truyền thống để điều khiển hệ thống Linux, yêu cầu người dùng nhập các lệnh để thực hiện các tác vụ Ưu điểm của CLI là khả năng thực hiện nhanh chóng và xử lý nhiều công việc cùng lúc, nhưng nhược điểm lớn nhất là việc học và ghi nhớ các câu lệnh có thể gặp khó khăn đối với người mới.
Trong tài liệu này, tác giả sẽ hướng dẫn cách sử dụng CLI thay vì GUI quen thuộc Để giao tiếp với shell qua dòng lệnh, người dùng cần một chương trình giao tiếp, được gọi là Terminal Emulator trong Linux Có nhiều loại Terminal khác nhau cho Linux, như Konsole (KDE) và Gnome Terminal (Gnome), nhưng các lệnh trong Terminal đều thống nhất giữa các phiên bản Linux.
Một số phím tắt thường dùng trongTerminal:
Ctrl-R tìm lệnh đã chạy trước đó
Tab tự động hoàn tất câu lệnh
Shft-PgUp (PgDn) cuộn màn hình lên (xuống)
Shft-Alt-Fn chuyển sang terminal thứ n
Các lệnh thao tác với tài khoản người dùng
Linux là hệ điều hành đa người dùng, cho phép nhiều người truy cập và sử dụng máy tính đồng thời Trong hệ thống Linux, có hai loại người dùng: người dùng thông thường và siêu người dùng Để truy cập vào hệ thống, mỗi người dùng cần tạo một tài khoản cá nhân, trong đó chứa thông tin cần thiết cho việc sử dụng hệ thống.
• Tên tài khoản (username): tối đa 8 ký tự, tên tài khoản có phân biệt chữ hoa, chữ thường; thông thường người dùng hay đặt tất cả là chữ thường.
• Mật khẩu(password): được mã hoá và được đặt trong file /etc/shadow.
UID (user identification) là số ID duy nhất, là một số nguyên dương được hệ điều hành gán cho mỗi tài khoản người dùng, giúp phân biệt giữa các người dùng khác nhau.
– Người dùng có UID = 0 là người dùng có quyền quản trị hệ thống cao nhất (root). – UID của người dùng bình thường có giá trị khác 0.
– UID = 65534 được gán cho tài khoản nobody (người dùng không có quyền quản trị). – UID = 1 − 999 được dành cho các tài khoản hệ thống (mail, daemon, sshd, ).
GID (nhận diện nhóm) là số ID của nhóm người dùng, với mỗi người dùng luôn thuộc về một nhóm nhất định Các thành viên trong cùng một nhóm có quyền hạn tương đương, thường thì tất cả người dùng đều thuộc nhóm User, ngoại trừ tài khoản root và các tài khoản hệ thống đặc biệt Mỗi người dùng chỉ có quyền truy cập vào thư mục cá nhân của mình và những thư mục được phép bởi hệ thống, không thể vào thư mục của người dùng khác trừ khi được sự cho phép từ chính người đó hoặc từ tài khoản root.
• Thông tin cá nhân: thường gồm tên đầy đủ của người dùng hoặc các thông tin khác có liên quan.
Mỗi người dùng trong hệ thống được cấp một thư mục riêng, thường là thư mục con của /home, với tên trùng với tên tài khoản để tránh nhầm lẫn, ví dụ như tài khoản "phuong" sẽ có thư mục "/home/phuong" Đối với tài khoản root, thư mục riêng là "/root" Để đăng nhập vào hệ thống, người dùng cần cung cấp tên người dùng và mật khẩu.
Kiểm tra thông tin người dùng bằng cách xem tập tin /etc/passwd thông qua lệnh sudo cat / etc / passwd
Tập tin passwd lưu trữ thông tin chi tiết của tất cả người dùng trên hệ thống, với mỗi người dùng được trình bày trên một dòng riêng biệt, cách nhau bởi dấu ‘:’ Ví dụ, tài khoản "dang" chứa các thông tin quan trọng như tên tài khoản, mật khẩu đã mã hóa, UID (1000), GID (1000), thông tin cá nhân (Dang Nguyen Phuong), thư mục riêng (/home/dang) và shell đăng nhập (/bin/bash).
The article discusses various system users and their associated details, including the Kernel Oops Tracking Daemon, PulseAudio daemon, RealtimeKit, and HPLIP system user Each entry provides information such as user ID, home directory, and shell access, highlighting their functions and locations within the system For instance, the Kernel Oops Tracking Daemon is located at "/bin/false," while the PulseAudio daemon operates from "/var/run/pulse." Additionally, it mentions users like Dang Nguyen Phuong and the guest user, along with their respective home directories and shell configurations Overall, the content emphasizes the management of system users and their roles in maintaining system functionality.
Tài khoản root, hay còn gọi là tài khoản siêu người dùng, là tài khoản có quyền cao nhất trên hệ thống Linux Người dùng có thể thực hiện các công việc quản trị như thêm tài khoản mới, thay đổi mật khẩu, cài đặt và gỡ bỏ phần mềm, cũng như thay đổi quyền truy cập của tập tin và thư mục Tuy nhiên, việc sử dụng tài khoản root đòi hỏi sự cẩn thận, vì mọi thao tác sẽ ảnh hưởng trực tiếp đến toàn bộ hệ thống.
Một số lệnh làm việc với tài khoảnroot
• Thay đổi password cho root sudo passwd root
• Chuyển sang tài khoản root su
• Thực thi lệnh với quyền root bằng cách thêmsudo phía trước lệnh
Trong hệ điều hành Ubuntu, tài khoản root mặc định bị khóa, ngăn người dùng đăng nhập trực tiếp hoặc sử dụng lệnh su để trở thành root Tuy nhiên, người dùng vẫn có thể thực thi các chương trình với quyền root thông qua lệnh sudo Khi cài đặt Ubuntu, tài khoản người dùng đầu tiên được tạo sẽ tự động thuộc nhóm Admin, có quyền quản trị hệ thống.
Tài khoản người dùng cho phép truy cập và thao tác trên hệ thống Để tạo, thay đổi hoặc xóa tài khoản người dùng, cần có quyền của siêu người dùng.
Một số lệnh làm việc với tài khoản người dùng
• Tạo tài khoản người dùng sudo useradd [ options ] hoặc sudo adduser [ options ]
Một số tùy chỉnh cho lệnh useradd
-d, home HOME_DIR khai báo thư mục riêng
-m, create-home tạo thư mục riêng trong trường hợp không có trước đó -p, password PASSWORD khai báo mật khẩu
-s, shell SHELL khai báo shell đăng nhập
-u, uid UID khai báo UID
-g, gid GROUP khai báo GID
-e, –expiredate EXPIRE_DATE khai báo ngày hết hạn của tài khoản (YYYY-MM-DD)
• Xóa tài khoản người dùng sudo userdel [ options ]
Một số tùy chỉnh cho lệnh userdel
-f, force xóa ngay cả khi người dùng đang đăng nhập
-r, remove xóa thư mục riêng và các tập tin chứa trong đó
• Tạo nhóm sudo groupadd [ options ]
• Xóa nhóm sudo groupdel [ options ]
• Chuyển sang tài khoản của người dùng khác su
• Thay đổi mật khẩu sudo passwd [ options ]
• Thay đổi thông tin tài khoản người dùng sudo usermod [ options ]
Tạo tài khoản người dùng có tên ‘phuong’, thư mục riêng là ‘phuong1’, shell đang nhập là bash shell và chỉ số UID là 1001
$ sudo useradd −m −d / home/ phuong1 −s / bin / bash −u 1001 phuong
Xóa tài khoản vừa được tạo
Các lệnh thao tác với thư mục và tập tin
Linux tổ chức thư mục và tập tin theo cấu trúc cây tương tự như DOS và Windows, cho phép sử dụng cả đường dẫn tương đối và đường dẫn tuyệt đối Tuy nhiên, điểm khác biệt lớn nhất là Linux sử dụng dấu ‘/’ để phân cách các cấp thư mục, trong khi DOS sử dụng dấu ‘\’ Một số thư mục chính trong Linux bao gồm các thư mục quan trọng mà người dùng cần biết.
/home chứa các thư mục riêng của người dùng
/bin chứa các ứng dụng (binary application)
/boot các tập tin cấu hình cho quá trình khởi động hệ thống
/etc chứa các tập tin cấu hình hệ thống cục bộ
/dev chứa các tập tin thiết bị
/lib chứa các thư viện hệ thống (system libraries)
/lost+found chứa các tập tin không có thư mục mẹ
/media chứa các tập tin liên kết được tạo ra khi một thiết bị lưu động cắm vào /mnt gắn các hệ thống tập tin tạm thời (mounted filesystems)
/opt chứa các phần mềm ứng dụng được cài đặt thêm
/proc chứa các thông tin về tình trạng của hệ thống, các tiến trình đang hoạt động /root thư mục riêng của root
/sbin chứa các tập tin thực thi của hệ thống (system binaries)
/sys chứa các tập tin của hệ thống (system files)
/tmp chứa các tập tin được tạo ra tạm thời (temporary files)
/usr chứa những tập tin của các ứng dụng chính được cài đặt cho mọi người dùng /usr/src chứa mã nguồn
/usr/include chứa các tập tin header của C
/usr/bin chứa hầu hết các lệnh thực thi của người dùng
/usr/lib chứa các file thư viện của các chương trình người dùng
/usr/local chứa các chương trình bổ sung không thuộc hệ thống
/usr/man chứa các tài liệu trực tuyến
/var chứa các tập tin ghi các số liệu biến đổi (variable files)
/var/log chứa các tập tin lưu trữ thông tin làm việc hiện hành của người dùng
Hình 4: Ví dụ cấu trúc thư mục của Linux
Một số lệnh thao tác trên thư mục và tập tin
• Di chuyển đến thư mục cd
Trong Linux, dấu ‘.’ biểu thị thư mục hiện hành, trong khi dấu ‘ ’ chỉ thư mục mẹ, tức là thư mục cao hơn một cấp Nếu đường dẫn bắt đầu bằng ‘/’, hệ thống sẽ coi đó là đường dẫn tuyệt đối, vì tất cả các thư mục gốc đều bắt đầu bằng dấu ‘/’ Ngược lại, đường dẫn bắt đầu bằng ‘∼’ được xem là đường dẫn tương đối Các ký hiệu này có thể được kết hợp sử dụng với nhau để tạo ra các đường dẫn linh hoạt.
Di chuyển về thư mục riêng của người dùng
Di chuyển lên thư mục mẹ (cao hơn 1 cấp)
Di chuyển tới một thư mục bất kì theo đường dẫn tuyệt đối
$ cd / home / dang / Documents/ presentations
Di chuyển tới một thư mục bất kì theo đường dẫn tương đối
Di chuyển tới một thư mục bất kì theo vị trí tương đối so với thư mục hiện tại
• Xem vị trí thư mục hiện hành pwd
Để liệt kê thư mục và tập tin cùng với thông tin chi tiết, bạn có thể sử dụng lệnh `ls -l` Nếu muốn tìm kiếm các đối tượng chứa kí tự hoặc chuỗi kí tự cụ thể, hãy sử dụng kí tự * để thay thế cho các chuỗi không quan tâm Để hiển thị các tập tin ẩn, bạn sử dụng tùy chỉnh `-a`.
Liệt kê tập tin và thư mục chứa trong thư mục ‘presentations’ với thông tin chi tiết
Liệt kê các các tập tin có đuôi pdf
• Tạo thư mục mkdir
• Xóa thư mục, tập tin rm và rm −r Để xóa toàn bộ thư mục cùng với các tập tin bên trong, ta sử dụng rm −rf
Mỗi tập tin hoặc thư mục trên hệ điều hành Linux đều thuộc quyền sở hữu của một người dùng và một nhóm nhất định Trong hệ thống này, có ba loại đối tượng chính được xác định để quản lý quyền truy cập.
• Người sở hữu (owner): người đầu tiên tạo ra tập tin hoặc thư mục đó
• Nhóm sở hữu (group): nhóm mà người sở hữu thuộc vào
• Người khác (others): những người còn lại
Linux cho phép người dùng thiết lập quyền đọc, ghi và thực thi cho từng đối tượng Khi sử dụng lệnh ls -l, kết quả hiển thị sẽ cho thấy các quyền này một cách rõ ràng.
$ ls −l drwxr−xr−x 2 dang dang 4096 2013−10 −01 1 8 : 4 0 directory
Trong hệ thống tệp, ký tự đầu tiên trong chuỗi quyền truy cập cho biết đối tượng là thư mục (d) hay tập tin (-) Các ký tự tiếp theo được phân chia thành ba nhóm: quyền của người sở hữu (3 ký tự đầu), quyền của nhóm sở hữu (3 ký tự tiếp) và quyền của người dùng khác (3 ký tự cuối) Các quyền này bao gồm read (r), write (w) và execute (x).
Một số lệnh về quyền truy cập thư mục và tập tin
• Thay đổi quyền truy cập chmod [ options ]
Trong đó, các tùy chỉnh bao gồm các khai báo sau:
– Khai báo nhóm người dùng: ulàuser;glàgroup;olàothers;alàall.
– Thao tác: + là thêm quyền;− là xóa quyền; = là gán quyền.
– Quyền: rlàread;wlàwrite;xlà execute.
Chúng ta có thể sử dụng chữ số để gán quyền truy cập, với các giá trị cụ thể là read (4), write (2) và execute (1) Để gán quyền đọc và ghi, ta sử dụng số 6 (4 + 2), trong khi chỉ đọc và thực thi là số 5 (4 + 1) Để cấp toàn bộ quyền, ta sử dụng số 7 (4 + 2 + 1).
Ví dụ: Gán toàn quyền cho người sở hữu, chỉ đọc và thực thi cho những người còn lại
$ chmod u=rwx , g= rx , o=rx file
• Thay đổi người sở hữu chown [ owner : group ]
Ví dụ: Thay đổi người sở hữu là phuong thuộc nhóm abc
Để thay đổi người sở hữu và nhóm sở hữu của một thư mục cùng với tất cả các thư mục con bên trong, bạn có thể sử dụng lệnh `chown` với tùy chọn `-R`, ví dụ: `chown -R phuong:abc file`.
• Thay đổi nhóm sở hữu chgrp [ newgroup ]
Các lệnh điều khiển tiến trình
Tiến trình là một chương trình hoạt động độc lập trong không gian địa chỉ ảo của nó Cần lưu ý rằng một lệnh trên shell có thể tạo ra nhiều tiến trình khác nhau, do đó cần phân biệt rõ ràng giữa tiến trình và lệnh.
Có 3 loại tiến trình chính trên Linux:
• Tiến trình tương tác (interactive process) tiến trình khởi động và quản lý bởi shell.
• Tiến trình batch (batch process) tiến trình không gắn liền vớiterminal và được nằm trong hàng đợi (queue) để lần lượt thực hiện.
Tiến trình daemon (daemon process), viết tắt của Disk And Execution MONitor, là các tiến trình chạy ở chế độ ngầm và được khởi động tự động từ hệ thống Các daemon có thể hoạt động liên tục hoặc theo chu kỳ Để lấy thông tin trạng thái của các tiến trình này, người dùng có thể sử dụng nhiều lệnh khác nhau, trong đó có lệnh ps.
Cột đầu tiên trong danh sách tiến trình là số ID của tiến trình (PID), cho phép nhận diện mỗi tiến trình trong hệ điều hành Linux Cột thứ hai hiển thị tên thiết bị đầu cuối nơi chương trình được thực hiện, cột thứ ba cung cấp thông tin về thời gian, và cột cuối cùng là lệnh tạo ra tiến trình đang chạy Để xem tất cả các tiến trình, người dùng có thể sử dụng tùy chỉnh -a, trong khi tùy chỉnh -x cho phép hiển thị cả những tiến trình không liên kết với thiết bị đầu cuối (TTY) Thông tin chi tiết về các tiến trình đang chạy có thể được truy cập thông qua lệnh -axl.
Ngoài ra ta cũng có thể sử dụng lệnhtopđể xem trạng thái của các tiến trình (bấmqđể thoát)
$ top top − 0 5 : 5 7 : 3 3 up 3 : 3 5 , 2 users , load average : 0 0 0 , 0 1 1 , 0 1 8
Tasks : 163 total , 1 running , 161 sleeping , 0 stopped , 1 zombie
Cpu ( s ) : 9.1% us , 3.8%sy , 0.0% ni , 86.5% id , 0.7%wa , 0.0% hi , 0.0% si ,
Mem : 2049688 k total , 1925156 k used , 124532 k free , 209008 k buffers
Swap : 2084860 k total , 28k used , 2084832 k free , 1023704 k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
Để dừng một tiến trình, ta sử dụng lệnhkill kill [ signal ]
Giá trị mặc định của signal là 15, dùng để kết thúc tiến trình Ngoài ra, có thể sử dụng giá trị 9 để ngừng thi hành tiến trình mà không bị can thiệp bởi các tiến trình khác, hoặc giá trị 2 để ngừng từ bàn phím bằng tổ hợp phím Ctrl+C.
Lệnh cài đặt các gói phần mềm, ứng dụng
Để cài đặt ứng dụng trên hệ điều hành Linux, người dùng cần sử dụng các chương trình quản lý gói phù hợp với từng định dạng Các hệ điều hành như Fedora và OpenSUSE thuộc nhóm Red Hat sử dụng gói phần mềm với đuôi rpm, trong khi các hệ điều hành Debian sử dụng gói với đuôi deb Đối với hệ điều hành Red Hat, hai trình quản lý gói phổ biến là rpm (Redhat Package Manager) và yum (Yellowdog Updater Modified).
• Để cài đặt với yum, ta sử dụng lệnh
$ yum install Để gỡ bỏ ta dùng lệnh
• Để cài đặt với trình rpmta có thể sử dụng lệnh
$ rpm −ivh Để gỡ bỏ ta dùng lệnh
$ rpm −e Đối với các hệ điều hành Debian hay Ubuntu, hai trình quản lý gói thông dụng làapt(Advanced Package Tool) vàdpkg (Debian Package)
• Với apt, ta có thể cài đặt gói phần mềm thông qua lệnh
$ sudo apt−get install Để gỡ bỏ ta dùng lệnh
$ sudo apt−get remove
• Để cài đặt trực tiếp từ gói phần mềm (thường có đuôi deb) ta có thể sử dụng dpkg
$ sudo dpkg −i Để gỡ bỏ ta dùng lệnh
Chúng ta có thể cài đặt các gói phần mềm trực tiếp từ mã nguồn, thường được nén dưới dạng tarball với các đuôi như tar, tar.gz, tar.bz2, tgz, và nhiều định dạng khác Dưới đây là hướng dẫn chi tiết để thực hiện quá trình này.
$ tar −zxvf tar gz # g i a i nen
$ cd # vao t r o n g thu muc p a c k a g e
$ make install # chep chuong t r i n h vua b i e n d i c h vao he thong
4 Các công cụ Linux thông dụng
Lệnh echo
Đây là lệnh dùng để hiển thị dòng văn bản, giá trị biến
Cú pháp echo [ option ]
Một số tùy chỉnh cho lệnhecho
-n không in ký tự xuống dòng
-e cho phép hiểu những ký tự theo sau dấu ‘\’ trong chuỗi
Một số kí tự đặc biệt cho chuỗi gồm có
$ echo " Today ' s date is $ ( date ) "
Today ' s date is Sun Dec 15 0 8 : 2 9 : 3 7 ICT 2013
$ echo { one , two , red , blue} fish onefish twofish redfish bluefish
Các dấu nháy có 3 loại dấu nháy sau
• Dấu nháy đơn (single quote) ‘ ’: những gì nằm trong dấu nháy này có ý nghĩa không đổi.
• Dấu nháy kép (double quote) “ ”: những gì nằm trong dấu nháy này được xem là những kí tự riêng biệt.
• Dấu nháy ngược (backtick) ` `: thực thi lệnh.
Để thay đổi màu chữ hiển thị trên màn hình, bạn có thể sử dụng chuỗi ký hiệu điều khiển escape, bắt đầu bằng \033 hoặc \e, theo sau là mã số màu mong muốn.
Ví dụ:thay đổi màu chữ
$ echo −e " \ 0 3 3 [ 3 4 m This is blue text "
$ echo −e "\ e [ 3 4 m This is blue text\ e [ 0 m"
$ echo −e " This is normal text"
Để in đậm chữ, bạn có thể thêm các ký hiệu chỉ thuộc tính hiển thị, cách nhau bởi dấu ';' Một số thuộc tính thông dụng bao gồm 1 (in đậm), 5 (nhấp nháy), 7 (đảo màu),
Ví dụ:thay đổi thuộc tính
$ echo −e "\ e [ 3 4 m This is blue text\ e [ 0 m"
$ echo −e "\ e [ 1 ; 3 4 m This is bold blue text \ e [ 0 m "
Trong Linux, các màu chữ chuẩn được đánh số từ 30 đến 37, trong khi các màu phông nền tương ứng được đánh số từ 40 đến 47 Dưới đây là danh sách các màu chữ chuẩn.
37 xám (trắng đối với phông nền)
Ví dụ:thay đổi màu chữ và phông nền
$ echo −e "\ e [ 4 3 ; 3 4 m Yellow blue \ e [ 4 7 ; 3 0 m Black and white"
Một số lệnh Linux cơ bản
cp sao chép tập tin hoặc thư mục (để sao chép thư mục ta phải sử dụng thêm tùy chỉnh-r)
$ cp file1 file2 # copy f i l e 1 thanh f i l e 2
$ cp file directory / # copy f i l e vao thu muc d i r e c t o r y
$ cp −r dir1 / ∗ dir2 / # copy t a t ca t a p t i n va thu muc t r o n g d i r 1 vao d i r 2 more hiển thị nội dung các tập tin (nhấn phím qđể thoát)
$ more file less tương tự lệnhmore nhưng không lưu lại nội dung tập tin sau khi thoát
$ less file grep tìm kiếm một chuỗi kí tự
$ grep " s t r i n g " file find tìm kiếm tập tin
$ find / path −name file man hiển thị hướng dẫn sử dụng lệnh
$ man command cat hiển thị nội dung hay nối các tập tin
$ cat file1 file2 > file # n o i ta p t i n diff so sánh nội dung 2 tập tin
$ diff file1 file2 gzip nén một tập tin kèm theo đuôi gz
$ gzip file gunzip giải nén tập tin
$ gunzip file tar nén và giải nén tập tin, thư mục kèm theo đuôi.tar
$ tar −cf file tar file # nen t a p t i n
$ tar −zxvf file tar # g i a i nen ta p t i n alias gán tên cho lệnh
$ alias name=command clear xóa màn hình
$ clear date hiển thị ngày tháng
$ date expr tính toán biểu thức, có thể được thay thế bằng$(( ))
$ expr 20 % 3 file xác định kiểu tập tin
Các lệnh kiểm tra dung lượng
$ du −h # kiem t r a dung l u o n g thu muc h i e n t h o i va thu muc con
$ du −sh # c h i kiem t r a dung l u o n g thu muc h i e n t h o i
Các kí tự đặc biệt
Trong Linux có sử dụng một số kí tự đặc biệt chẳng hạn như
# bắt đầu phần chú thích (comment)
; phân cách nhiều lệnh trên một dòng lệnh
? đại diện cho 1 kí tự hay thực hiện lệnh test
* đại diện cho chuỗi kí tự
& chạy ứng dụng ở chế độ nền (background), trả lại dấu nhắc cho tác vụ khác
\ tắt tác dụng của những kí tự đặc biệt
( ) gom các lệnh thành một nhóm
> định hướng dữ liệu xuất ra file
< định hướng dữ liệu nhập từ file
>> định hướng dữ liệu xuất ra cuối file nếu file đã tồn tại
| định hướng dữ liệu xuất là dữ liệu nhập cho lệnh tiếp theo
$ sử dụng nội dung biến
&& câu lệnh nằm sau kí tự chỉ được thực hiện khi câu lệnh phía trước thành công
|| câu lệnh nằm sau chỉ được thực hiện khi câu lệnh phía trước không thành công
Viết nhiều lệnh trên cùng 1 dòng
$ cd ~/my_dir ; rm ∗ txt ; mkdir my_sub_dir Đặt giá trị cho biến
Chạy chương trình mpd ở chế độ nền
Gom các lệnh lại thành một nhóm
Copy các tập tin file1, file2 và file3 vào trong tập tin mới có tên là combined_file
$ cat { file1 , file2 , file3} > combined_file
Nếu tập tin test1.txt tồn tại, hãy in ra tên tập tin này Tiếp theo, kiểm tra xem test2.txt có tồn tại không; nếu có, hãy in ra tên của test2.txt.
$ [ −f test1 txt ] && echo " t e s t 1 t x t " && [ −f test2 txt ] && echo " t e s t 2 t x t "
Filter và pipe
Bộ lọc hay filter là một chương trình nhận dữ liệu từ thiết bị nhập, xử lý và gửi kết quả đến thiết bị xuất Một số loại bộ lọc phổ biến bao gồm
• grep là lệnh tìm kiếm các dòng có chứa một chuỗi hoặc từ khóa trong file, một số cú pháp của lệnh
$ grep [ options ] ' string1 string2 ' filename
-i không phân biệt chữ hoa hay thường trong quá trình tìm
-w chỉ đưa ra kết quả chính xác với từ khóa
-c đếm số dòng kết quả được tìm thấy
-n hiển thị thứ tự mỗi dòng của kết quả
-v in đảo ngược kết quả (chỉ in những dòng không chứa từ khóa)
• wc là lệnh thực hiện việc đếm trong tập tin
-L chiều dài của dòng dài nhất
• tr dùng để chuyển đổi các ký tự
-L chiều dài của dòng dài nhất
Chuyển đổi a thành 1 và * thành b
Chuyển đổi chữ thường thành chữ hoa
• cut lấy ra một cột dữ liệu hay phần chỉ ra từ các dòng trong tập tin
-b LIST chỉ chọn các byte này
-c LIST chỉ chọn các kí tự này
-d DELIM sử dụng DELIM thay cho tab để phân cách các cột
-f LIST chỉ chọn các cột này
Lấy các kí tự từ vị trí 1-3 trong tập tin test.txt
$ cat test txt cat command for file oriented operations cp command for copy files or directories ls command to list out files and directories with its attributes
$ cut −c1−3 test txt cat cp ls
Lấy tên nhân viên trong tập tin name.txt
• uniq thực hiện việc gỡ bỏ các dòng chữ giống và kề nhau
Pipe là một công cụ mạnh mẽ cho phép kết hợp nhiều lệnh và xử lý chúng như một lệnh duy nhất, bằng cách lấy kết quả từ lệnh trước và chuyển nó làm dữ liệu đầu vào cho lệnh tiếp theo Trong hệ thống lệnh, Pipe được biểu thị bằng dấu gạch đứng (|).
Ví dụ:xem tên đầy đủ của user dang cùng với đường dẫn tới thư mục riêng và shell mặc định
$ cat / etc / passwd | grep " \ dang : " | cut −d ' : ' −f5 , 6 , 7
Dang Nguyen Phuong , , , : / home/ dang : / bin / bash
Ví dụ:hiển thị ngày của tuần
Ví dụ:hiển thị tên các user và thời gian họ đăng nhập
$ who | tr −s ' ' | cut −d ' ' −f1 , 4 dang 1 8 : 0 1 dang 1 8 : 0 9
Mảng và chuỗi
Mảng có dạng array[N], một số lệnh dành cho mảng như sau
$ array=(item1 item2 item3 ) hoặc
• Lấy giá trị của một phần tử trong mảng
• Lấy tất cả các phần tử trong mảng
• Tổng số phần tử có trong mảng
• Xóa một phần tử có trong mảng
Chuỗi là một dãy các kí tự, một số lệnh dành cho chuỗi như sau
• Vị trí của kí tự trong chuỗi
$ ${ string : position : length} # l a y c h u o i con co do d a i l e n g t h tu v i t r i p o s i t i o n
$ ${ string#substring } #xoa c h u o i s u b s t r i n g ngan nhat t i n h tu dau c h u o i
$ ${ string## substring} #xoa c h u o i s u b s t r i n g d a i nhat t i n h tu dau c h u o i
$ ${ string / substring / replacement} # thay t h e c h u o i s u b s t r i n g dau t i e n bang r e p l a c e m e n t
$ ${ string // substring/ replacement} # thay t h e t a t ca c h u o i s u b s t r i n g bang r e p l a c e m e n t
Trình soạn thảo văn bản
Trong hệ điều hành Linux, người dùng có nhiều lựa chọn về trình soạn thảo văn bản để tạo ra các loại tài liệu như dữ liệu văn bản, thư điện tử, danh sách, bản ghi chú và báo cáo Bên cạnh những công cụ cơ bản như nano và cat, bài viết này sẽ giới thiệu thêm một số trình soạn thảo văn bản phổ biến hiện nay.
Gedit là trình soạn thảo văn bản đơn giản, được cài đặt mặc định trên hệ thống GNOME Điểm mạnh của Gedit là khả năng mở rộng thông qua nhiều plugin, bao gồm cả các plugin chính thống và từ các nhà phát triển thứ ba Một số plugin phổ biến giúp nâng cao trải nghiệm người dùng.
• Bracket Completion: tự động đóng ngoặc (( )), ([ ]), ({ }), (< >)
• Charmap: chèn kí tự từ bản đồ kí tự
• Code Comment: đánh dấu ghi chú bằng phím tắt
• Join lines/ Split lines: nối, cắt dòng với Ctrl-J hoặc Shft-Ctrl-J
• Session Saver: lưu lại một phiên làm việc
• Smart Spaces: tự động làm sắp xếp khoảng trống đầu dòng của các đoạn mã lệnh bằng phím tắt Ctrl-T hoặc Shft-Ctrl-T
Emacs (Editor MACroS) là một trình soạn thảo văn bản đa năng, tương thích với nhiều hệ điều hành và cho phép mở rộng để tích hợp các chức năng mới Emacs được ưa chuộng trong cộng đồng lập trình viên và những người sử dụng máy tính có kỹ thuật cao Một số tính năng nổi bật của Emacs bao gồm khả năng tùy chỉnh linh hoạt và hỗ trợ nhiều ngôn ngữ lập trình.
• Soạn thảo trên nhiều cửa sổ và bộ đệm (buffer)
• Tìm kiếm, thay thế, tự sửa lỗi
• Soạn thảo đệ quy (recursive edit): cho phép soạn thảo khi một câu lệnh đang thực hiện giữa chừng
Nhiều chế độ soạn thảo phong phú bao gồm văn bản thường, các file chương trình với tính năng tô màu cú pháp và thực thi từng đoạn mã lệnh, hỗ trợ ngôn ngữ đánh dấu như HTML và LaTeX, cùng khả năng vẽ hình bằng các ký tự.
• Sửa đổi theo ý thích cá nhân bằng cách chỉnh sửa các biến của chương trình
• Lập trình bằng ngôn ngữ Lisp (LISt Processing)
• Nhiều chương trình hỗ trợ (danh sách thư mục, đọc và soạn e-mail, trò chơi, )
Vim (Vi IMproved) là một trình soạn thảo văn bản được cải tiến từ trình soạn thảo Vi cổ điển Nó hoạt động với hai chế độ khác nhau, mang lại sự linh hoạt cho người dùng trong việc chỉnh sửa và quản lý văn bản.
• Ở chế độ câu lệnh (command mode), những gì người dùng gõ vào sẽ được hiểu như là câu lệnh ra lệnh cho vim.
• Ở chế độ nhập văn bản (insert mode), những gì người dùng gõ vào được máy hiểu là nội dung của tập tin.
Để chuyển đổi giữa chế độ lệnh và chế độ nhập trong Vim, bạn sử dụng phím 'i' hoặc 'a' để vào chế độ nhập, và phím 'Esc' để quay lại chế độ lệnh Khi khởi động, Vim mặc định hoạt động ở chế độ lệnh.
Để thực thi các chương trình soạn thảo văn bản, bạn chỉ cần gõ tên chương trình tại dấu nhắc lệnh, kèm theo tên tập tin mà bạn muốn mở.
Các phím tắt một số phím tắt thông dụng trong việc soạn thảo bằng cách hương trình trên
Thoát khỏi chương trình Ctrl-q Ctrl-x Ctrl-c :q
Mở tập tin Ctrl-o Ctrl-x Ctrl-f :e Đóng tập tin Ctrl-w
Lưu file Ctrl-s Ctrl-x Ctrl-s :w
Lưu file với tên khác Shft-Ctrl-s Ctrl-x Ctrl-w :w filename
Tìm kiếm Ctrl-f Ctrl-s / hay ?
Tìm tiếp theo Ctrl-g Ctrl-s n
Tìm và thay thế Ctrl-h Alt-% %s/oldword/newword/g Đi đến dòng thứ N Ctrl-i N Alt-x goto-line N NG
Cuộn lên 1 trang Ctrl-Alt-PgUp Alt-v Ctrl-b
Cuộn xuống 1 trang Ctrl-Alt-PgDn Ctrl-v Ctrl-f Đánh dấu chọn tất cả Ctrl-a Ctrl-x h
Cắt vùng được đánh dấu Ctrl-x Ctrl-w v,d
Copy vùng được đánh dấu Ctrl-c Alt-w "*y
Chuyển sang chế độ lệnh Alt-x lệnh Esc
Shell thường nhận lệnh từ người dùng qua bàn phím, với mỗi lệnh được kết thúc bằng phím enter Tuy nhiên, khi cần thực thi nhiều lệnh cùng lúc, người dùng có thể lưu chúng vào một tập tin văn bản và yêu cầu shell thực hiện tập tin đó Tập hợp các lệnh trong tập tin này được gọi là shell script.
Cách tạo và thực thi shell script
Để tạo một shell script, người dùng chỉ cần sử dụng bất kỳ trình soạn thảo văn bản nào để soạn thảo một tập tin chứa các lệnh cần thực hiện Sau khi hoàn thành, hãy lưu tập tin với đuôi phù hợp với loại shell mà bạn muốn sử dụng để thực thi.
Để tạo một shell script sử dụng bash shell xuất ra dòng chữ “Hello world!”, chúng ta cần tạo một file có tên là hello.sh và thêm nội dung thích hợp vào file này.
# gan c h u o i " H e l l o w o r l d ! " cho b i e n STRING string=" H e l l o World "
# xuat n o i dung cua b i e n STRING r a man h i n h echo $string
Trong ví dụ này, dòng đầu tiên của hello.sh chứa ký tự #! để chỉ định cho Linux biết trình thông dịch shell mà chúng ta muốn sử dụng, cụ thể là bash shell Bên cạnh đó, người dùng cũng có thể lựa chọn sử dụng một số trình thông dịch khác.
Với tập tinhello.shvừa được tạo ra, ta có thể gọi thực thi theo 2 cách.
• Gọi trình thông dịch shell với tên tập tin làm đối số
Để gọi thực thi một tập tin script từ dòng lệnh giống như các lệnh Linux thông thường, trước tiên bạn cần gán thuộc tính thực thi cho tập tin đó bằng lệnh chmod.
Sau đó có thể gọi thực thi script
Biến
Trong shell script, biến không cần phải được khai báo trước khi sử dụng; chúng sẽ tự động được tạo ra khi lần đầu tiên tên biến xuất hiện Mặc định, tất cả các biến đều khởi tạo với kiểu chuỗi (string), ngay cả khi dữ liệu là số Shell và một số lệnh tiện ích có khả năng tự động chuyển đổi chuỗi thành số để thực hiện phép tính khi cần thiết.
Trong shell script, để truy xuất nội dung của một biến, ta sử dụng dấu '$' trước tên biến Để hiển thị nội dung của biến, lệnh echo được sử dụng Để nhận dữ liệu từ người dùng và lưu vào biến, lệnh read có thể được áp dụng.
#! / b i n / bash read string echo " H e l l o " $string
Lệnhreadkết thúc khi người dùng nhấn phím Enter.
Một số lưu ý khi gán nội dung cho biến
• Tên biến được bắt đầu bằng kí tự hoặc dấu gạch chân ‘_’
• Tên biến phân biệt chữ hoa và chữ thường
• Không được sử dụng các kí tự đặc biệt (?, *, ) đặt tên cho biến
• Khi thực hiện lệnh gán, trước và sau dấu ‘=’ không được có khoảng trắng
• Nếu gán nội dung chuỗi trắng cho biến,cần bao bọc chuỗi bằng dấu “ ”
Khi trình shell khởi động, nó cung cấp một số biến môi trường (environment variable) được khai báo và gán giá trị mặc định Các biến này thường được viết hoa để phân biệt với biến do người dùng tự định nghĩa, thường là ký tự không hoa Nội dung của các biến môi trường này phụ thuộc vào thiết lập của hệ thống và quyền hạn mà người quản trị cho phép người dùng sử dụng Dưới đây là một số biến môi trường thông dụng nhất.
$HOME vị trí thư mục chủ
$PATH danh sách các đường dẫn chương trình thực thi (cách nhau bằng dấu ‘:’)
$PS1 dấu nhắc (prompt) hiển thị trên dòng lệnh, thường là ‘$’
$SP2 dấu nhắc thứ cấp, thường là dấu ‘>’
$IFS dấu phân cách các trường trong chuỗi, thường chứa ký tựTab, ký tự trắng hoặc ký tự xuống hàng
$0 chứa tên chương trình gọi trên dòng lệnh
$# số tham số truyền trên dòng lệnh
$$ ID tiến trình của shell script thực thi
Mỗi môi trường người dùng đăng nhập đều có các biến môi trường riêng biệt Bạn có thể xem danh sách các biến này bằng lệnh `env` Để tạo một biến môi trường mới, sử dụng lệnh `export` trong bash shell hoặc lệnh `setenv` trong C shell.
Để cấu hình môi trường cho ROOT, bạn cần thêm đường dẫn tới chương trình thực thi ROOT và thư viện ROOT vào biến PATH và LD_LIBRARY_PATH Bạn có thể thực hiện điều này bằng cách sử dụng lệnh export: ```bashexport ROOTSYS=~/root_v5.3.4/root/export PATH=$ROOTSYS/bin:$PATHexport LD_LIBRARY_PATH=$ROOTSYS/lib:$LD_LIBRARY_PATH```Ngoài ra, nếu bạn sử dụng csh hoặc tcsh, bạn có thể dùng lệnh setenv như sau: ```bashsetenv ROOTSYS "~/root_v5.3.4/root/"setenv PATH "$ROOTSYS/bin:$PATH"setenv LD_LIBRARY_PATH "$ROOTSYS/lib:$LD_LIBRARY_PATH"```
Biến tham số là những biến được hệ thống tự động tạo ra khi người dùng thực hiện các lệnh trong shell và nhận tham số để xử lý Một số biến tham số phổ biến bao gồm các biến giúp người dùng quản lý và thao tác hiệu quả hơn trong môi trường dòng lệnh.
$1, $2, $3, vị trí và nội dung của các tham số theo thứ tự trái sang phải
$* danh sách tất cả các tham số, được lưu trong một chuỗi duy nhất phân cách bằng kí tự trong$IFS
$@ danh sách các tham số được chuyển thành chuỗi, không sử dụng dấu phân cách của $IFS
$? giá trị trả lại của câu lệnh trước
Ví dụ:Tạo shell cript hello.sh với hai tham số tên người dùng và ngày
#! / b i n / bash name=$1 date=$2 echo " H e l l o " $name " , today i s " $date
Kết quả khi thực thi shell script
Cấu trúc điều khiển
Tương tự như các ngôn ngữ lập trình khác, shell cũng cung cấp cấu trúc lệnh điều khiển, bao gồm các lệnhif,for,while,until,case.
If kiểm tra điều kiện đúng hoặc sai để thực thi lệnh thích hợp
Cú pháp if condition then statements else statements hay if condition1 then statements elif condition2 then statements
Để kiểm tra điều kiện trong Linux, bạn có thể sử dụng lệnh `test` hoặc cặp dấu ngoặc vuông [] Có ba kiểu so sánh chính trong Linux: sử dụng từ khóa `if`, `elif`, và có thể đưa từ khóa khó vào cùng dòng với điều kiện bằng cách đặt dấu `;` sau điều kiện.
-le nhỏ hơn hoặc bằng
-ge lớn hơn hoặc bằng
• So sánh chuỗi s1 = s2 hai chuỗi bằng nhau s1 != s2 hai chuỗi không bằng nhau
• Kiểm tra tập tin, thư mục
-s file tập tin không rỗng
-f file tập tin tồn tại, không phải thư mục
-d dir thư mục tồn tại, không phải tập tin
-w file tập tin cho phép ghi
-r file tập tin chỉ đọc
-x file tập tin có quyền thực thi
Ví dụ:kiểm tra xem đối số có phải tên của tập tin hay không
#! / b i n / bash if [ −f " $1 " ] then echo " $1 i s a f i l e " else echo " $1 i s n o t a f i l e " fi
Ví dụ:so sánh một số với 100
#! / b i n / bash count if [ $count −eq 100 ] ; then echo " Count i s 100 " elif [ $count −gt 100 ] ; then echo " Count i s g r e a t e r than 100 " else echo " Count i s l e s s than 100 " fi
Vòng lặp có thể được thực hiện nhiều lần với các giá trị xác định, và phạm vi lặp có thể được xác định từ một tập hợp chuỗi hoặc là kết quả trả về từ một biến hoặc biểu thức khác.
Cú pháp for variable in values do statemens done
Ví dụ:liệt kê tất cả các tập tin và thư mục có trong thư mục /var
#! / b i n / bash for f in $ ( ls / var / ) ; do echo $f done
While thực hiện lặp vô hạn khi điều kiện kiểm tra vẫn còn đúng
Cú pháp while condition do statements done
Ví dụ:tạo bảng cửu chương
#! / b i n / bash y=1 while [ $y −le 10 ] ; do x=1 while [ $x −le 10 ] ; do printf "% 4d" $ ( ( $x ∗ $y ) ) let x++ done echo " " let y++ done
Until tương tự lệnh whilenhưng điều kiện kiểm tra bị đảo ngược lại
Cú pháp until condition do statements done
Ví dụ:in các số lùi dần từ 20
#! / b i n / bash counter until [ $counter −lt 10 ] ; do echo $counter let counter−=1 done
Case so khớp nội dung của biến với một chuỗi các mẫu (pattern) nào đó, khi một mẫu được so khớp thì lệnh tương ứng sẽ được thực hiện
Cú pháp case variable in pattern [ | pattern ] ) statements ; ; pattern [ | pattern ] ) statements ; ;
Ví dụ:in ra các câu chào tương ứng với thời gian trong ngày
#! / b i n / sh echo " I s i t morning ? P l e a s e answer y e s o r no " read timeofday case " $ t i m e o f d a y " in
Các lệnh thoát ra ngoài vòng lặp gồm hai lệnh chính là
• break: thoát hoàn toàn ra khỏi vòng lặp
• continue: thoát khỏi lần lặp hiện tại và chuyển sang lần lặp kế tiếp
Ví dụ:sử dụng lệnh break và continue
#! / b i n / bash counter=0 until [ $counter −eq 10 ] ; do
( ( counter++ ) ) if [ $counter −eq 5 ] ; then continue elif [ $counter −eq 7 ] ; then break fi echo $counter done
Trong ví dụ này, biến counter được tăng từ 1 đến 10 Khi counter đạt giá trị 5, nó sẽ không được in ra mà sẽ chuyển sang vòng lặp tiếp theo với giá trị counter = 6 Khi counter đạt đến 7, lệnh break sẽ được thực thi, khiến vòng lặp dừng lại và không in ra các giá trị từ 7 trở đi.
Hàm
Người dùng có thể tạo hàm hoặc thủ tục trong shell script để tổ chức các nhóm lệnh Việc gọi các script con trong script chính cũng giống như gọi hàm, nhưng thường tốn nhiều tài nguyên hơn Để định nghĩa hàm trong shell script, cần khai báo tên hàm theo sau là cặp ngoặc đơn ( ), và các lệnh của hàm được đặt trong cặp ngoặc nhọn { }.
Ví dụ:Viết hàm tính tổng hai đối số
Để khai báo biến cục bộ trong hàm, cần sử dụng từ khóa "local" Nếu không sử dụng từ khóa này, biến sẽ được coi là biến toàn cục, có thể tồn tại và giữ giá trị sau khi hàm kết thúc Biến toàn cục có thể được truy cập và thay đổi bởi tất cả các hàm trong cùng một shell script Nếu một biến toàn cục đã tồn tại và biến cục bộ cùng tên được khai báo, biến cục bộ sẽ có ưu tiên và chỉ có hiệu lực cho đến khi hàm kết thúc.
Ví dụ:Viết hàm tính tổng hai đối số sum ( ) { local x=$1 local y=$2 echo $ ( ( $x+$y ) )
Trả về giá trị để trả về giá trị của hàm, ta có thể sử dụng lệnh return
Ví dụ:Viết hàm tính tổng hai đối số
#! / b i n / bash sum ( ) { local x=$1 local y=$2 return $ ( ( $x+$y ) )
Để trả về giá trị chuỗi trong Bash, bạn có thể sử dụng lệnh `echo` kết hợp với việc chuyển hướng nội dung kết xuất của hàm Ví dụ, trong hàm `mystring()`, bạn có thể viết `echo "giá trị chuỗi"` để trả về kết quả mong muốn.
Biến x sẽ nhận giá trị trả về của hàm mystring() là “string value” Một phương pháp khác để lấy giá trị trả về của hàm là sử dụng biến toàn cục, vì biến toàn cục vẫn giữ lại giá trị ngay cả khi hàm kết thúc.
6 Cách thức biên dịch và thực thi chương trình
Các chương trình thực thi trên Linux có thể được viết bằng nhiều ngôn ngữ lập trình như C, Fortran, Pascal, Assembly và Perl Chúng tồn tại dưới hai dạng: mã nguồn (source code) và tập tin thực thi (executable) Để chạy được các chương trình này, cần biên dịch mã nguồn thành tập tin thực thi, và quá trình này được thực hiện bởi các bộ biên dịch (compiler).