Bash

Lịch sử

Brian Fox bắt đầu lập trình Bash ngày 10/1/1988 sau khi Richard Stallman trở nên không hài lòng với sự thiếu tiến bộ của nhà phát triển trước đó. Stallman và Free Software Foundation (FSF) xem một shell miễn phí có thể chạy các shell script hiện có nên mang tính chiến lược đối với một hệ thống hoàn toàn tự do được xây dựng từ mã BSD và GNU, đây là một trong số ít các dự án mà họ tự tài trợ, với Fox đảm nhận công việc của một nhân viên của FSF. Fox phát hành bản beta của Bash, phiên bản .99 ngày 8/6/1989 và vẫn là người duy trì chính cho đến khoảng giữa năm 1992 and mid-1994, khi ông ấy bị sa thải khỏi FSF và trách nhiệm của ông đã được chuyển sang một người đóng góp sớm khác, Chet Ramey.
Từ đó, Bash trở thành shell phổ biến nhất trong cộng đồng Linux, trở thành shell tương tác mặc định trên các bản phân phối khác nhau của hệ đièu hành này (mặc dù Almquist shell có thể là scripting shell mặc định) và trên macOS của Apple. Bash cũng được port đến Microsoft Windows được phân phối cùng Cygwin và MinGW, tới DOS bởi dự án DJGPP, đến Novell NetWare và tới Android thông qua các ứng dụng mô phỏng thiết bị đầu cuối khác nhau.
Tháng 9/2014, Stéphane Chazelas, một chuyên gia về Unix/Linux, phát hiện một lỗi bảo mật trong chương trình.  Lỗi này, lần đầu tiên được tiết lộ vào ngày 24 tháng 9, được đặt tên là Shellshock và gán các số CVE-2014-6271, CVE-2014-6277 và CVE-2014-7169. Lỗi này được coi là nghiêm trọng, vì các tập lệnh CGI sử dụng Bash có thể dễ bị tấn công, cho phép thực thi mã tùy ý. Lỗi này có liên quan đến cách Bash định nghĩa hàm cho các lớp con thông qua các biến môi trường.

Tính năng

The Bash command syntax is a superset of the Bourne shell command syntax. Bash supports brace expansion, command line completion, basic debugging and exception handling (using trap) among other features. Bash can execute the vast majority of Bourne shell scripts without modification, with the exception of Bourne shell scripts stumbling into fringe syntax behavior interpreted differently in Bash or attempting to run a system command matching a newer Bash builtin, etc. Bash command syntax includes ideas drawn from the Korn shell (ksh) and the C shell (csh) such as command line editing, command history, the directory stack, the $RANDOM and $PPID variables, and POSIX command substitution syntax $(…).
When a user presses the tab key within an interactive command-shell, Bash automatically uses command line completion, since beta version 2.04, to match partly typed program names, filenames and variable names. The Bash command-line completion system is very flexible and customizable, and is often packaged with functions that complete arguments and filenames for specific programs and tasks.
Bash's syntax has many extensions lacking in the Bourne shell. Bash can perform integer calculations ("arithmetic evaluation") without spawning external processes. It uses the ((…)) command and the $((…)) variable syntax for this purpose. Its syntax simplifies I/O redirection. For example, it can redirect standard output (stdout) and standard error (stderr) at the same time using the &> operator. This is simpler to type than the Bourne shell equivalent 'command > file 2>&1'. Bash supports process substitution using the <(command) and >(command)syntax, which substitutes the output of (or input to) a command where a filename is normally used. (This is implemented through /proc/fd/ unnamed pipes on systems that support that, or via temporary named pipes where necessary).
Khi sử dụng từ khóafunction, các khai báo hàm của Bash không tương thích với các tập lệnh Bourne/Korn/POSIX (Korn shell có cùng một vấn đề khi sử dụng 'function'), nhưng Bash chấp nhận cú pháp khai báo hàm giống như Bourne shell và Korn shell, và phù hợp với  POSIX. Do những điều này và những khác biệt khác, các tập lệnh Bash shell hiếm khi được chạy theo trình thông dịch Bourne shell và Korn shell trừ khi cố tình viết với tính tương thích đó, điều này trở nên ít phổ biến hơn khi Linux trở nên phổ biến hơn. Nhưng trong chế độ POSIX, Bash phù hợp với POSIX chặt chẽ hơn.
Bash hỗ trợ here document. Từ phiên bản 2.05b Bash có thể chuyển hướng đầu vào tiêu chuẩn (stdin) từ một "here string" sử dụng toán tử <<<.
Bash 3.0 hỗ trợ khớp biểu thức chính quy trong quá trình bằng cách sử dụng cú pháp gợi nhớ đến Perl.
Tháng 2/2009, Bash 4.0 đã giới thiệu các hỗ trợ cho các mảng kết hợp. Các mảng kết hợp cho phép giả hỗ trợ cho các mảng đa chiều (được lập chỉ mục), theo cách tương tự như AWK. Bash 4.x chưa được tích hợp trong phiên bản MacOS mới hơn do hạn chế về giấy phép. Ví dụ mảng kết hợp:
$ declare -A aa        # khai báo một mảng kết hợp 'aa' được lập chỉ mục hai chiều$ i=1; j=2             # khởi tạo một vài chỉ số$ aa[$i,$j]=5          # liên kết giá trị "5" với khóa "$ i, $ j" (tức là "1,2")$ echo ${aa[$i,$j]}    # in giá trị được lưu trữ tại khóa "$ i, $ j"5