Shell (điện toán)

Trong điện toán, **shell** là chương trình máy tính trình bày các dịch vụ của một hệ điều hành tới người dùng hoặc các chương trình khác. Nói chung, các shell hệ điều hành thường sử dụng giao diện dòng lệnh (CLI) hoặc giao diện người dùng đồ họa (GUI), tùy vào vai trò và hoạt động cụ thể của máy tính. Nó được gọi là shell (vỏ ngoài) bởi đây là lớp ngoài cùng của hệ điều hành.

## Tổng quan
Các hệ điều hành cung cấp nhiều dịch vụ tới người dùng, bao gồm quản lý tập tin, quản lý tiến trình (chạy và ngừng các ứng dụng), xử lý hàng loạt, giám sát và cấu hình hệ điều hành.

Hầu hết các hệ điều hành không phải là các giao diện *trực tiếp* tới hạt nhân bên dưới, kể cả khi một shell tương tác với người dùng thông qua các thiết bị ngoại vi được gắn trực tiếp vào máy tính. Shell thực chất là các ứng dụng đặc biệt sử dụng API hạt nhân giống như cách mà các chương trình ứng dụng khác vẫn làm. Shell quản lý tương tác người dùng&ndash;hệ thống bằng cách yêu cầu nhập liệu từ người dùng, diễn dịch dữ liệu đầu vào của họ, và xử lý đầu ra từ hệ điều hành bên dưới (khá giống với vòng lặp đọc–đánh giá–in, REPL).  Bởi shell hệ điều hành thực chất là một ứng dụng, nó có thể dễ dàng được thay thế bằng một ứng dụng tương tự khác, trên hầu hết các hệ điều hành.

Ngoài các shell chạy trên hệ thống cục bộ, có nhiều cách khác nhau để người dùng cục bộ có thể truy cập các hệ thống từ xa; những cách tiếp cận như vậy thường được gọi là truy cập từ xa ("remote access") hoặc quản trị từ xa ("remote administration"). Ban đầu xuất hiện trên các máy tính lớn đa người dùng, nhằm cung cấp các giao diện người dùng dựa trên văn bản cho mỗi người dùng hoạt động *cùng lúc* thông qua thiết bị đầu cuối văn bản kết nối với máy tính lớn qua đường nối tiếp hoặc modem, truy cập từ xa đã được mở rộng sang các hệ thống tương tự Unix và Microsoft Windows. Trên hệ thống tương tự Unix, giao thức Secure Shell (SSH) thường được sử dụng cho các shell dựa trên văn bản, trong khi đường hầm SSH có thể được sử dụng cho các giao diện người dùng đồ họa (GUI) dựa trên Hệ thống X Window. Trên Microsoft Windows, Remote Desktop Protocol có thể được sử dụng để cung cấp truy cập từ xa GUI, và kể từ Windows Vista, PowerShell Remote có thể được sử dụng dành cho truy cập từ xa dựa trên văn bản thông qua WMI, RPC, và WS-Management.

Hầu hết các shell hệ điều hành thuộc một trong hai phân loại dòng lệnh và đồ họa. Shell dòng lệnh cung cấp giao diện dòng lệnh (CLI) cho hệ điều hành, còn shell đồ họa cung cấp giao diện người dùng đồ họa (GUI). Các phân loại khác ít phổ biến hơn bao gồm giao diện người dùng giọng nói và các cách triển khai khác nhau của giao diện người dùng dựa trên văn bản (TUI) nhưng không phải CLI, ví dụ như các hệ thống menu dựa trên văn bản. Những ưu điểm của shell dựa trên CLI và GUI là chủ đề thường xuyên được bàn luận. Nhiều người dùng máy tính sử dụng cả hai tùy theo tác vụ cần thực hiện.

## Lịch sử
Các hệ thống tương tác ban đầu cung cấp một trình thông dịch dòng lệnh đơn giản như một phần của trình giám sát thường trực ("resident monitor"). Trình thông dịch này có thể có những tên gọi khác nhau khác nhau, ví dụ như `COMCON` trên các hệ thống DEC TOPS-10. Trình thông dịch sẽ thực thi một số lệnh được định nghĩa trước, trong đó có một lệnh chạy chương trình người dùng. Các lệnh thường sử dụng bao gồm đăng nhập và đăng xuất người dùng khỏi hệ thống, cấp phát, giải phóng và sửa đổi các thiết bị và tập tin, và truy vấn thông tin về hệ thống hoặc một tiến trình người dùng.

Vào năm 1964, Louis Pouzin đã nghĩ ra ý tưởng "sử dụng các lệnh như một ngôn ngữ lập trình" cho hệ điều hành Multics, và sử dụng thuật ngữ *shell* để mô tả nó. Trong một tài liệu viết năm 1965, shell được định nghĩa là "một quy trình thường sử dụng được gọi tự động bởi trình giám sát khi người dùng nhập một thông điệp nào đó vào thiết bị đầu cuối, khi mà người dùng đó không có tiến trình nào khác đang hoạt động nằm dưới quyền kiểm soát của thiết bị đầu cuối. Quy trình này hoạt động như một giao diện giữa các thông điệp từ thiết bị đầu cuối và chương trình con [trong trình giám sát]." Hệ thống này được triển khai lần đầu tiên bởi Glenda Schroeder và một nhân vật khác không được nêu tên từ General Electric.

Multics cũng giới thiệu *hàm hoạt động* ("active function"), một khái niệm quan trọng trong tất cả các shell về sau. This is defined as 

Vào năm 1971, Ken Thompson đã phát triển shell Thompson trong phiên bản đầu tiên của Unix. Mặc dù đơn giản hơn shell Multics, shell Thompson lại đi cùng với một số tính năng đột phá mới vẫn còn tiếp tục được sử dụng trong các shell hiện đại, trong đó có việc sử dụng các ký tự &lt; và &gt; cho mục đích chuyển hướng đầu vào và đầu ra.

Shell đồ họa lần đầu xuất hiện trên hệ thống NLS của Douglas Engelbart, được trình diễn vào tháng 12 năm 1968 tại Fall Joint Computer Conference ở San Francisco, trong một sự kiện mà sau này được nhiều người gọi là *[[Mẹ của mọi buổi thuyết trình]]* ("Mother of All Demos"). Các đồng nghiệp của Engelbart tại Viện Nghiên cứu Stanford đã trình bày ý tưởng này lên Trung tâm Nghiên cứu Palo Alto (PARC) thuộc tập đoàn Xerox; công ty này đã triển khai ý tưởng trên mẫu máy tính Alto, được giới thiệu vào năm 1973. Kể từ đó, khái niệm này tiếp tục được phát triển và lan rộng lên những mẫu máy tính khác như Lilith của Niklaus Wirth vào năm 1980, và Apple Lisa vào năm 1983, sau đó xuất hiện ở mọi nơi.

## Shell dòng lệnh

Giao diện dòng lệnh (CLI) là một shell hệ điều hành sử dụng các ký tự chữ-số được nhập từ bàn phím để cung cấp chỉ dẫn và dữ liệu tới hệ điều hành. Ví dụ, một chiếc máy đánh chữ từ xa ("teletypewriter") có thể gửi các mã đại diện cho các phím gõ tới một chương trình thông dịch lệnh chạy trên máy tính; trình thông dịch mã sẽ phân tích cú pháp chuỗi gõ phím đó và phản hồi bằng thông báo lỗi nếu không thể nhận dạng được chuỗi ký tự, hoặc nó có thể thực hiện một số hành động khác như tải chương trình ứng dụng, liệt kê các tập tin, đăng nhập tài khoản người dùng, v.v. Các hệ điều hành như UNIX có rất nhiều chương trình shell với các lệnh, cú pháp và chức năng khác nhau, trong đó shell POSIX được coi là tiêu chuẩn cơ bản. Một số hệ điều hành chỉ có một kiểu giao diện lệnh; các hệ điều hành thông dụng như MS-DOS đi kèm với một giao diện lệnh tiêu chuẩn (COMMAND.COM) nhưng các giao diện bên thư ba vẫn thường có sẵn, cung cấp thêm những tính năng hoặc chức năng như menu điều hướng hay chạy chương trình từ xa.

Các chương trình ứng dụng cũng có thể triển khai giao diện dòng lệnh. Ví dụ, trong các hệ thống tương tự Unix, chương trình telnet có một số lệnh để điều khiển liên kết tới hệ thống máy tính từ xa. Bởi các lệnh trong chương trình cũng được nhập từ các phím giống như khi gửi dữ liệu tới máy tính từ xa, chương trình cần có cách thức để phân biệt giữa hai kiểu nhập liệu trên. Một chuỗi thoát có thể được định nghĩa, sử dụng một phím đặc biệt không bao giờ được truyền đi nhưng luôn được hệ thống cục bộ thông dịch. Chương trình chuyển đổi qua lại giữa hai chế độ: thông dịch các lệnh được nhập từ bàn phím, hoặc truyền các phím đã nhập dưới dạng dữ liệu để xử lý.

Một tính năng xuất hiện trong nhiều shell dòng lệnh là khả năng lưu lại các chuỗi lệnh để tái sử dụng. Người dùng có thể lưu một chuỗi các lệnh trong tập tin dữ liệu, sau đó yêu cầu CLI đọc tập tin và thực thi các lệnh trong đó giống như khi người dùng nhập lệnh một cách thủ công. Các tính năng đặc biệt trong CLI có thể được áp dụng khi thực hiện những chỉ dẫn được lưu sẵn như vậy. Những tập tin batch (tập tin kịch bản) này có thể được sử dụng nhiều lần để tự động hóa các thao tác thường thực hiện như khởi tạo các chương trình khi hệ thống được khởi động lại. Chế độ sử dụng hàng loạt của các shell thường bao gồm các cấu trúc, điều kiện, biến và nhiều yếu tố khác của những ngôn ngữ lập trình; một số chỉ chứa những thành phần tối thiểu cho mục đích này, số khác lại mang bản chất của những ngôn ngữ lập trình rất phức tạp. Ngược lại, một số ngôn ngữ lập trình có thể được sử dụng để tương tác với hệ thống từ shell hệ điều hành hoặc một chương trình chuyên dụng.

Một số shell dòng lệnh như Xonsh, Bash, và Z shell cung cấp tính năng hoàn thành dòng lệnh, cho phép trình thông dịch tự động điền hoặc gợi ý toàn bộ câu lệnh dựa vào một vài ký tự ban đầu mà người dùng nhập vào.

Trình thông dịch dòng lệnh có thể cung cấp chức năng lịch sử để người dùng gọi, sửa đổi và chạy lại các lệnh đã từng ra trước đó cho hệ thống. Do tất cả câu lệnh tới hệ điều hành đều phải được người dùng nhập bằng tay, tên của các lệnh thường được đặt ngắn gọn và hệ thống trình bày các tùy chọn trong chương trình cũng được thiết kế nhỏ gọn. Tên gọi ngắn có thể khiến người dùng khó nhớ lệnh, trong khi các hệ thống ban đầu lại thiếu nguồn tài nguyên lưu trữ để cung cấp hướng dẫn sử dụng trực tuyến chi tiết cho người dùng.

## Shell đồ họa

Một giao diện người dùng đồ họa (GUI) cung cấp các phương tiện đồ họa để người dùng điều khiển chương trình, thông qua các thao tác như mở, đóng, di chuyển và thay đổi kích cỡ các cửa sổ, cũng như thay đổi focus giữa các cửa sổ. Các shell đồ họa có thể đi kèm với môi trường desktop hoặc tách rời, kể cả dưới dạng các tiện ích có liên kết lỏng lẻo với nhau.

Hầu hết giao diện người dùng đồ họa triển khai phép ẩn dụ về một "bàn làm việc điện tử", trong đó các tập tin dữ liệu được trình bày như những tài liệu giấy trên mặt bàn, và tương tự như vậy, các chương trình ứng dụng cũng được trình bày bằng đồ họa thay vì phải gọi bằng tên lệnh.

### Các hệ thống tương tự Unix

Các shell đồ họa thường được xây dựng trên nền tảng của một hệ thống cửa sổ. Trong trường hợp của Hệ thống X Window hay Wayland, shell sẽ bao gồm một chương trình quản lý cửa sổ X hoặc một bộ tổng hợp Wayland, cùng với một hoặc nhiều chương trình cung cấp các chức năng như khởi động các ứng dụng đã cài đặt, quản lý các cửa sổ đang mở và bàn làm việc ảo, hay hỗ trợ cho một engine widget.

Trong trường hợp của macOS, Quartz Compositor hoạt động như một hệ thống cửa sổ, và shell sẽ bao gồm Finder, thanh Dock, SystemUIServer, và Mission Control.

### Microsoft Windows

Các phiên bản hiện đại của hệ điều hành Microsoft Windows sử dụng Windows Shell làm shell cho hệ thống. Windows Shell cung cấp môi trường desktop, menu Start và thanh tác vụ, cũng như một giao diện người dùng đồ họa cho việc truy cập các chức năng quản lý tập tin của hệ điều hành. Các phiên bản cũ hơn cũng đi kèm với Program Manager, chương trình từng đóng vai trò là shell trên phiên bản 3.x của Microsoft Windows, và thực chất vẫn còn được bao gồm trong những phiên bản Windows sau đó (ở cả hai dòng 9x và NT) cho tới tận Windows XP. Hai phiên bản 1 và 2 của Windows sở hữu những giao diện có sự khác biệt đáng kể.

Các ứng dụng desktop cũng được coi là các shell, miễn là chúng sử dụng một engine bên thứ ba. Tương tự như vậy, nhiều cá nhân và nhà phát triển không hài lòng với giao diện của Windows Explorer đã phát triển các phần mềm với hai kiểu mục tiêu: thay đổi chức năng và hình thức của shell, hoặc thay thế nó hoàn toàn. WindowBlinds của StarDock là một ví dụ điển hình về một ứng dụng theo kiểu thứ nhất, trong khi LiteStep và Emerge Desktop là ví dụ về những ứng dụng theo kiểu thứ hai.

## Ý nghĩa khác
"Shell" cũng được sử dụng một cách lỏng lẻo để mô tả các phần mềm ứng dụng được "xây dựng xung quanh" một thành phần cụ thể, ví dụ như trình duyệt web hay ứng dụng khách email, tương tự như những cấu trúc vỏ bọc trong tự nhiên. Định nghĩa shell trong bài cũng có thể được giải thích theo cách này, bởi shell (dòng lệnh) là thành phần bao bọc *hạt nhân* của hệ điều hành. Chúng cũng đôi khi được gọi là "wrapper".

Trong hệ chuyên gia, shell là một phần mềm mang bản chất của một hệ chuyên gia "rỗng", không có cơ sở tri thức cho bất cứ ứng dụng nào.

## Xem thêm

* So sánh các shell lệnh
* Tương tác người–máy
* Shell Internet Explorer
* Tài khoản shell
* Shell builtin
* Siêu người dùng
* Shell Unix
* Trình quản lý cửa sổ cung cấp giao diện quản lý tiến trình thô sơ
* Vòng lặp đọc–đánh giá–in còn gọi là *shell ngôn ngữ*, CLI dành cho một ngôn ngữ lập trình thông dịch

## Tham khảo