Shell là gì ?
Ta có thể hiểu nôm na, Shell là một chương trình cung cấp giao diện giao tiếp giữa người dùng và hệ điều hành, về mặt kỹ thuật, Shell là một interface nằm giữa OS Kernel và người dùng, nó cung cấp một môi trường để người dùng tương tác với Kernel (nhân của hệ điều hành).
Các chương trình Shell có nhiệm vụ nhận và thông dịch các lệnh được nhập từ người dùng và chuyển đến nhân của hệ điều hành để thực thi. Có thể nói, Shell là cầu nối giữa con người và máy tính.
SH là gì ?
Sh – ngôn ngữ dòng lệnh (Shell Command Language) là một ngôn ngữ lập trình thông dịch được mô tả theo chuẩn POSIX standard. Nó là ngôn ngữ đầu tiên được sử dụng cho các chương trình Shell và có mặt trên hầu hết các hệ thống Unix/Linux.
Sh thích hợp cho việc lập trình shell vì lợi thế nhỏ gọn và tốc độ xử lý. Nhưng nó cũng có các nhược điểm như thiếu các tính năng tương tác (vd: tính năng gọi lại các lệnh trước đó – history), không có các tính năng tích hợp số học cũng như xử lý logic.
Bash là gì ?
Bash bắt đầu như là một bản triển khai tương thích với Sh (sh-compatible implementation), nó kế thừa những gì mà Sh đã có và phát huy những gì mà Sh chưa có. Mặc dù nó có trước chuẩn POSIX vài năm, nhưng với thời gian nó đã có được rất nhiều tiện ích mở rộng, một số tiện ích mở rộng của nó đã thay đổi hành vi của chuẩn POSIX shell scripts.
Bash có hổ trợ chuyển đổi –posix, giúp cho nó tuân thủ theo chuẩn POSIX hơn (more POSIX-compliant).
Vậy SH = Bash ?
Trong một khoản thời gian dài, symlink /bin/sh được sử dụng để trỏ về /bin/bash như là mặc định trên hầu hết các hệ thống Unix/Linux. Vì vậy, gần như có thể bỏ qua sự khác biệt giữa cả hai.
Nhưng hiện nay, trên các hệ thống Unix/Linux thông dụng, symlink /bin/sh không còn được mặc định trỏ về /bin/bash nữa:
- Trên các hệ điều hành Debian và Ubuntu, /bin/sh được trỏ mặc định đến (symlink) đến /bin/dash.
- Busybox, thường được thực thi trong quá trình khởi động của hệ thống LINUX như là 1 phần của initramfs (bao gồm các chương trình và file nhị phân thực hiện tất cả các hoạt động cần thiết để khởi tạo – mount root filesystem như cung cấp chức năng kernel hay cung cấp trình điều khiển Mass Storage Controller). Nó sử dụng /bin/ash là mặc định.
- Trên các máy macbook chạy hệ điều hành macOS, /bin/zsh được sử dụng là mặc định.
Vậy làm thế nào để ta kiểm tra được hệ thống của mình đang sử dụng bản triển khai shell nào. Ta sử dụng lệnh printenv để kiểm tra.
Một số điểm khác nhau giữa Sh và Bash:
- “[[” không khả dụng trong SH.
- Trong sh không có kiểu dữ liệu mảng.
- Bash có nhiều phần mở rộng cú pháp theo giống C như vòng lặp với 3 biến số for(i = 0; i <= 3; i++) các phép gán tăng, giảm như +=, -=, *=, /=.
- Bash có hổ trợ *.{jpg, png} và {0..12}
- Ngoài ra còn có nhiều phần mở rộng khác.
Shebang
Shebang (hay sha-bang, hashbang, pound-bang, hash-pling) là kí tự “!#” , nó luôn được đặt ở dòng đầu tiên trong mỗi script. Trong hệ thống UNIX/LINUX, mỗi khi 1 script được chạy, đầu tiên program loader sẽ dựa vào Shebang để xác định script sẽ được thực thi bởi trình biên dịch nào. Nếu 1 script không có Shebang thì mặc định nó sẽ được thực thi bởi Sh.
Trong trường hợp trong hệ thống ta có nhiều version của 1 trình biên dịch /usr/bin/python, /usr/local/bin/python thì hệ thống sẽ không tìm được trình biên dịch của script này bằng Shebang. Ta có thể sử dụng env – run a program in a modified environment để xử lý vấn đề trên.
Qua các khái niệm trên, các bạn đã có thể trả lời được các câu hỏi ở đầu bài viết rồi phải không. Ngoài Bash ra còn có rất nhiều bản tương thích với Sh như Dash, zsh, ash…Vì vậy, có thể trên cùng 1 hệ điều hành, cùng phiên bản nhưng tuỳ vào sở thích và thói quen của người dùng mà có thể lựa chọn các bản tương thích khác nhau, dẫn đến việc các cấu trúc lệnh có thể khác nhau. Trong series này, mình sẽ đi sâu vào bản tương thích Bash để giải thích về cấu trúc và các sử dụng của nó.