Shell là gì ? Sự khác nhau giữa SH và Bash

Khi nhắc đến Bash Shell, đa số mọi người thường sẽ nghĩ đến nó là ngôn ngữ dòng lệnh trên các hệ thống Unix. Nhưng bạn có thắc mắc vì sao đôi khi bạn sử dụng các hệ thống Unix khác nhau sẽ xuất hiện hiện tượng các dòng lệnh thường sử dụng trên hệ điều hành này không thể thực thi trên hệ điều hành khác? Hoặc thậm chí cùng một hệ điều hành nhưng các viết dòng lệnh của máy tính này lại khác với máy tính khác? Để làm rõ vấn đề này, ta hãy tìm hiểu về một số các khái niệm cơ bản nhé.

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ó.

 

Các cấu trúc điều khiển, xử lý chuỗi đơn giản và Dictionaries trong Bash

Các hàm xử lý chuỗi nâng cao trong Bash (Phần 1)

Các hàm xử lý chuỗi nâng cao trong Bash (Phần 2)

Hướng dẫn thực hiện cấu hình chuyển hướng toàn bộ truy cập tên miền bằng file .htaccess

Nên chọn LiteSpeed Web Server hay OpenLiteSpeed ?

Khởi đầu với Python

Hướng dẫn tạo tài khoản email trên dịch vụ Email Hosting

Hướng dẫn bảo vệ wp-admin|wp-login.php tránh bị tấn công dò mật khẩu (brute-force) cho website WordPress