Scripting shell là kỷ luật thiết yếu cho bất kỳ ai trong vai trò sysadmin, và shell chiếm ưu thế mà mọi người viết script ngày nay là Bash. Bash đi kèm mặc định trên hầu hết bản phân phối Linux và phiên bản MacOS hiện đại và dự kiến sẽ trở thành phần gốc của Windows Terminal sớm thôi. Có thể nói, Bash ở khắp nơi.
Vậy nó đến được lúc này như thế nào? Podcast Command Line Heroes tuần này đào sâu câu hỏi đó bằng cách hỏi chính những người viết code.
Bắt đầu từ Unix
Giống mọi thứ lập trình, phải quay về Unix. Chút lịch sử shell: Năm 1971, Ken Thompson phát hành shell Unix đầu tiên—Thompson shell. Nhưng có hạn chế nghiêm trọng về khả năng scripting của người dùng. Và đó nghĩa là hạn chế nghiêm trọng cho tự động hóa và, do đó, cho toàn bộ lĩnh vực vận hành IT.
Nghiên cứu tuyệt vời này phác thảo thách thức cho các nỗ lực scripting sớm (in đậm để nhấn mạnh lệnh):
Tương tự tiền thân trong Multics, shell này (/bin/sh) là chương trình người dùng độc lập thực thi bên ngoài kernel. Khái niệm như globbing (khớp mẫu cho mở rộng tham số, như *.txt) được triển khai trong tiện ích riêng gọi là glob, cũng như lệnh if đánh giá biểu thức điều kiện. Sự tách biệt này giữ shell nhỏ, dưới 900 dòng C source.
Shell giới thiệu cú pháp gọn gàng cho redirection (< > và >>) và piping (| hoặc ^) tồn tại đến shell hiện đại. Bạn cũng tìm thấy hỗ trợ gọi lệnh tuần tự (với ;) và bất đồng bộ (với &).
Điều Thompson shell thiếu là khả năng scripting. Mục đích duy nhất là shell tương tác (trình thông dịch lệnh) để gọi lệnh và xem kết quả.
Khi quyền truy cập terminal tăng, hứng thú tự động hóa tăng cùng nó.
Bourne shell: Bước tiến quan trọng
Sáu năm sau phát hành Thompson, năm 1977, Stephen Bourne phát hành Bourne shell, nhằm giải quyết hạn chế scripting của Thompson shell. (Chet Ramey, người duy trì chính ngôn ngữ Bash từ 1990, thảo luận về nó trong tập Command-Line Heroes này). Đó là tiến hóa tự nhiên của công nghệ từ Bell Labs như một phần của hệ thống Unix.
Bourne định định làm gì khác biệt? Nhà nghiên cứu M. Jones phác thảo tốt:
Bourne shell có hai mục tiêu chính: phục vụ như trình thông dịch lệnh để thực thi lệnh tương tác cho hệ điều hành và cho scripting (viết script tái sử dụng có thể gọi qua shell). Ngoài việc thay thế Thompson shell, Bourne shell cung cấp vài ưu điểm so với tiền thân. Bourne đưa luồng điều khiển, vòng lặp, và biến vào script, cung cấp ngôn ngữ chức năng hơn để tương tác với hệ điều hành (cả tương tác và không tương tác). Shell cũng cho phép dùng shell script như filter, cung cấp hỗ trợ tích hợp xử lý signal, nhưng thiếu khả năng định nghĩa hàm. Cuối cùng, nó kết hợp nhiều tính năng dùng ngày nay, bao gồm command substitution (dùng back quote) và HERE documents để nhúng chuỗi literal bảo toàn trong script.
Bourne, trong phỏng vấn trước, mô tả như sau:
Shell gốc không thực sự là ngôn ngữ; nó là bản ghi—cách thực thi chuỗi lệnh tuyến tính từ file, primitive luồng điều khiển duy nhất là GOTO nhãn. Những hạn chế này đối với shell gốc Ken Thompson viết rất đáng kể. Bạn không thể, ví dụ, dễ dàng dùng script lệnh như filter vì file lệnh chính là standard input. Và trong filter, standard input là gì bạn kế thừa từ tiến trình cha, không phải file lệnh.
Shell gốc đơn giản nhưng, khi mọi người bắt đầu dùng Unix cho phát triển ứng dụng và scripting, nó quá hạn chế. Nó không có biến, không có luồng điều khiển, và khả năng quoting rất kém.
Shell mới này là bước tiến lớn cho người viết script, nhưng chỉ nếu bạn có quyền truy cập nó.
Tái tưởng Bourne shell như phần mềm tự do
Cho đến lúc đó, shell chiếm ưu thế là phần mềm độc quyền thuộc sở hữu và vận hành tại Bell Labs. Nếu bạn đủ may mắn, trường đại học có thể truy cập Unix shell. Nhưng truy cập hạn chế đó xa thế giới Free Software Foundation (FSF) muốn đạt được.
Richard Stallman và nhóm nhà phát triển cùng chí hướng viết tất cả tính năng Unix với giấy phép tự do dưới giấy phép GNU. Một nhà phát triển đó được giao làm shell. Nhà phát triển đó là Brian Fox. Cách ông nói về nhiệm vụ thật thú vị. Như ông nói trên podcast:
Lý do nó thách thức là chúng ta phải mô phỏng trung thực mọi hành vi của Bourne shell, đồng thời được phép mở rộng nó để làm công cụ tốt hơn cho mọi người dùng.
Đây cũng là lúc mọi người thảo luận về ý nghĩa là chuẩn shell. Với lịch sử này làm nền và cạnh tranh tiền cảnh, Bourne shell phổ biến được tái tưởng tượng; tái sinh.
Shell, Bourne-Again
Hai chất xúc tác này—sứ mệnh phần mềm tự do và cạnh tranh—đưa Bourne-Again shell (Bash) ra đời. Trong một举动 bất thường cho thời điểm đó, Fox không đặt tên shell theo tên mình, mà tập trung vào sự tiến hóa từ Unix sang phần mềm tự do. (Mặc dù Fox Shell có thể đánh bại Fish shell để có lệnh fsh #missedopportunity). Lựa chọn đặt tên đó dường như phù hợp tính cách ông. Như Fox nói trong tập, ông không quan tâm thậm chí đến cảm giác vinh quang cá nhân; ông cố gắng giúp văn hóa lập trình tiến hóa. Ông không, tuy nhiên, trên một cái chơi chữ hay.
Tốt đấy là Bourne không cảm thấy bị xúc phạm bởi chơi chữ. Bourne kể chuyện khi ai đó đi đến và tặng áo Bash tại hội nghị. Người đó là Brian Fox.
| Shell | Năm phát hành | Người tạo |
|---|---|---|
| Thompson Shell | 1971 | Ken Thompson |
| Bourne Shell | 1977 | Stephen Bourne |
| Bourne-Again Shell | 1989 | Brian Fox |
Theo thời gian, Bash tăng trưởng trong việc áp dụng. Kỹ sư khác bắt đầu dùng và gửi cải tiến thiết kế. Thực tế, nhiều năm sau, Fox kiên quyết rằng học cách nhường quyền kiểm soát Bash là một trong những việc quan trọng nhất ông làm. Khi Unix nhường chỗ cho Linux và phong trào phần mềm mã nguồn mở, Bash trở thành lực lượng scripting chủ chốt trong thế giới mã nguồn mở. Dự án lớn dường như phát triển vượt ra khỏi tầm nhìn của một cá nhân.
Chúng ta học gì từ shell?
Shell là công nghệ thiết yếu đến việc dùng laptop hàng ngày đến mức dễ quên nó cần phát minh. Câu chuyện từ Thompson đến Bourne đến Bash shell rút ra bài học quen thuộc:
- Cá nhân có động lực có thể tiến bộ lớn với sứ mệnh đúng.
- Nhiều thứ chúng ta dựa vào hôm nay xây dựng trên công việc của huyền thoại còn sống trong ngành.
- Phần mềm có xu hướng tồn tại là những cái tiến hóa vượt ra khỏi tầm nhìn người tạo ra ban đầu.
Command Line Heroes đã bao phủ ngôn ngữ lập trình cho toàn bộ Mùa 3 và đang tới finale. Hãy subscribe để học mọi thứ về nguồn gốc ngôn ngữ lập trình, và tôi rất muốn nghe câu chuyện shell của bạn trong bình luận.