Chuyển đến nội dung chính

Shell là gì?

Tìm hiểu Shell là gì và vì sao học Shell có thể giúp bạn trở thành nhà khoa học dữ liệu hiệu quả và linh hoạt hơn.
Wendy Gittleson
Wendy Gittleson

Tạo tài khoản miễn phí của bạn

Luyện tập và Lộ trình tiến trình của bạn.

Tiếp tục với GoogleBằng cách tiếp tục, bạn chấp nhận Điều khoản sử dụng, Chính sách quyền riêng tư và việc dữ liệu của bạn được lưu trữ tại Hoa Kỳ.

Đồ họa Script máy tính

Nếu bạn đang làm việc trên hệ điều hành (OS) của Microsoft, Apple hoặc Linux, rất có thể bạn đang sử dụng shell script mà không hề hay biết. Thực tế, bạn tương tác với shell mỗi lần khởi động hệ điều hành Linux của mình. 

Shell script giúp lập trình viên, nhà khoa học dữ liệu và người dùng phổ thông tiết kiệm thời gian và tránh các tác vụ lặp đi lặp lại nhờ tự động hóa. Ví dụ, script có thể thực hiện sao lưu hằng ngày, cài đặt bản vá, giám sát hệ thống và hoạt động, và tiến hành các kiểm tra định kỳ. 

Shell đọc các lệnh tương đối trực quan, dễ hiểu với con người và chuyển chúng thành thứ mà hệ thống có thể hiểu được. 

Shell là gì?

Shell là một loại chương trình máy tính gọi là bộ thông dịch dòng lệnh (command-line interpreter), cho phép người dùng Linux và Unix điều khiển hệ điều hành của họ bằng giao diện dòng lệnh. Shell giúp người dùng giao tiếp hiệu quả và trực tiếp với hệ điều hành. 

Shell scripting không phải là một ngôn ngữ duy nhất, nhưng vì dùng một số lệnh gần với ngôn ngữ tự nhiên nên khá dễ học, kể cả khi bạn không có nền tảng lập trình. Tuy nhiên, mỗi “phương ngữ” shell scripting được xem là một ngôn ngữ, và nếu bạn định làm những việc phức tạp hơn, shell đòi hỏi nhiều luyện tập. 

Shell scripting là một trong những cách đơn giản nhất để thiết lập tự động hóa. Sử dụng các lệnh Linux hoặc Unix, shell scripting cung cấp cho nhà khoa học dữ liệu, DevOps và TechOps các cấu trúc điều kiện và vòng lặp để lặp lại lệnh.

Shell script không phải lúc nào cũng được gọi cùng một tên. Sh, Bash (phổ biến nhất), csh, và tesh đều là shell script. Còn trong hệ điều hành VM của IBM, chúng được gọi là EXEC; trong DOS, shell script được gọi là batch file. 

Shell có hai nhóm: shell dòng lệnh và shell đồ họa. Shell dòng lệnh được truy cập qua giao diện dòng lệnh, nơi hệ thống nhận đầu vào là các lệnh dễ đọc với con người và sau đó dùng giao diện dòng lệnh để hiển thị đầu ra. 

Shell đồ họa dùng giao diện đồ họa người dùng (GUI) để thực hiện các tương tác và thao tác cơ bản như mở, đóng và lưu tệp. 

Dưới đây là một số lệnh shell mẫu: 

Để biết bạn đang ở thư mục nào: pwd

Để tìm một lệnh trong sổ tay hướng dẫn: man command 

Để cuộn xem nội dung tệp văn bản: less file 1 hoặc more file 1 

Các loại shell khác nhau

Bourne Shell

Dù cái tên nghe “ngầu”, Bourne shell không liên quan gì đến điệp viên hay các màn rượt đuổi tốc độ cao. Bourne shell, trình shell Unix phổ biến thứ hai, được tạo năm 1979 bởi Stephen Bourne tại Bell Labs. Giống tiền nhiệm của nó là Thompson shell, tên tệp thực thi của Bourne là sh.

Bourne shell là shell mặc định của hệ điều hành Solaris. Dù đã cũ, Bourne shell vẫn phổ biến đến ngày nay nhờ tốc độ và sự gọn nhẹ. Tuy nhiên, Bourne shell không tương tác tốt và không thể gọi lại command history. Nó cũng thiếu các biểu thức logic và số học. 

Các prompt của Bourne gồm:

  • Đường dẫn đầy đủ của lệnh:  /bin/sh và /sbin/sh
  • Mặc định cho người dùng không phải root:  $
  • Mặc định cho người dùng root: #

command-line

C shell, tên tệp csh, và tiền nhiệm của nó tên tệp tcsh, là một shell Unix khác từ cuối thập niên 70. Nó do Bill Joy tạo ra khi ông còn là nghiên cứu sinh tại Đại học California, Berkeley. 

Không giống Bourne shell, C shell mang tính tương tác và nhận biết command history và aliases. C shell cũng có cú pháp biểu thức giống C và số học tích hợp sẵn.

Các prompt của command-line gồm: 

  • Đường dẫn đầy đủ của lệnh:  /bin/csh
  • Mặc định hostname cho người dùng không phải root: %
  • Mặc định hostname cho người dùng root: #

KornShell

KornShell, tên tệp ksh, được phát triển đầu thập niên 1980 bởi David Korn tại Bell Labs. KornShell bao gồm nhiều tính năng của C shell, và là một siêu tập (super-set) nên tương thích ngược với Bourne shell. 

KornShell chạy nhanh hơn C shell. Nó chạy được script của Bourne shell và có mảng, hàm, và khả năng xử lý chuỗi kiểu C. Ngoài ra, nó có số học tích hợp. 

Các prompt của KornShell gồm:

  • Đường dẫn đầy đủ của lệnh: /bin/ksh
  • Mặc định cho người dùng không phải root: $
  • Mặc định cho người dùng root: #

GNU Bourne-Again shell

GNU Bourne-Again, hay Bash, là một lựa chọn mã nguồn mở thay thế Bourne shell. Nó do Brian Fox thiết kế cho Dự án GNU và phát hành năm 1989. Không chỉ tương thích hoàn toàn với Bourne shell, nó còn lấy nhiều tính năng tốt nhất từ KornShell và C shell. GNU Bourne-Again shell có sẵn ánh xạ phím mũi tên để chỉnh sửa và gọi lại lệnh. 

Các prompt của GNU Bourne-Again gồm:

  • Đường dẫn đầy đủ của lệnh: /bin/bash
  • Prompt mặc định cho người dùng không phải root: bash-x.xx$ 
  • Mặc định cho người dùng root: bash-x.xx#

Shell scripting làm gì

Ví von này hơi đơn giản, nhưng hãy hình dung shell script như tính năng tự điền cho lập trình viên. Thay vì gõ từng lệnh một, shell dùng các chuỗi lệnh trong một script duy nhất mà người dùng có thể khởi chạy chỉ bằng tên tệp trong dòng lệnh. Shell script thực hiện chạy chương trình, bọc văn bản và thao tác tệp. 

Shell scripting có thể đảm nhiệm nhiều việc, gồm các tác vụ giám sát như sử dụng đĩa, thực hiện sao lưu, tạo công cụ lệnh, thao tác tệp, chạy chương trình, liên kết các chương trình với nhau, hoàn thành lô (batch), v.v.

Các lựa chọn thay thế chính cho shell

Trong hệ điều hành VM của IBM, chúng được gọi là EXEC; trong DOS, shell script được gọi là batch file. Dù vậy, chúng vẫn là shell script. Các ngôn ngữ kịch bản khác như Javascript, Python, Perl và TCL cũng là ngôn ngữ kịch bản. Không ngạc nhiên khi dân CNTT đều có “món tủ” riêng, và chúng ta sẽ bàn về ưu, nhược của shell ngay sau đây. 

Vì sao Shell phổ biến?

Shell có mặt trên gần như mọi hệ điều hành vì hiệu quả và dễ cập nhật. Nó giám sát hệ thống của bạn và thực hiện sao lưu định kỳ mà bạn không phải bận tâm. 

Không cần đổi cú pháp vì cú pháp và lệnh của shell giống hệt những gì bạn nhập trong dòng lệnh. Thêm nữa, viết shell script nhanh và dễ: khởi chạy nhanh và dễ gỡ lỗi. 

Những nhược điểm của Shell script là gì?

Shell script có thể dễ mắc lỗi và khó chẩn đoán khi có sự cố. Shell không thiết kế cho các tác vụ phức tạp hoặc lớn, và tốc độ thực thi chậm. Ngoài ra, shell không cung cấp nhiều cấu trúc dữ liệu, và có thể có lỗi cú pháp hoặc thiết kế. 

Shell được tạo khi nào?

Shell script đầu tiên được tạo đầu thập niên 1960 bởi Louis Pouzin, nhân viên máy tính tại MIT. Dòng lệnh đầu tiên của ông là RUNCOM, giúp giải phóng các nhà khoa học máy tính khỏi những tác vụ lặp lại như biên dịch, cập nhật, đổi tên và di chuyển. 

Dù Pouzin không phải chuyên gia ngôn ngữ máy tính, hay có lẽ chính vì thế, ông tin rằng dòng lệnh có thể là một ngôn ngữ tự thân. 

Giữa thập niên 1960, Pouzin hợp tác với nhà khoa học người Anh Christopher Strachey. Strachey thiết kế một bộ sinh macro làm nền tảng cho ngôn ngữ lệnh của Pouzin, chạy trên hệ điều hành Multics vốn là hiện đại nhất thời bấy giờ. 

Nguồn gốc tên gọi Shell

Pouzin đặt tên ngôn ngữ mới là “shell” vì nó là lớp ngoài cùng của hệ điều hành. 

Tính năng của Shell

Shell được ưa chuộng trong giới lập trình vì súc tích. Tuy vậy, không có nghĩa là nó “cơ bản”. Shell cung cấp nhiều tính năng, bao gồm:

Xử lý nền

Một trong những lợi ích lớn nhất của shell script là có thể chạy ở nền. Tùy theo lệnh, shell có thể chạy ở tiền cảnh hoặc nền. Tiến trình tiền cảnh hiển thị trên màn hình và chỉ chạy tuần tự. 

Tiến trình chạy nền không xuất hiện trên màn hình và có thể chạy không tuần tự. Để chạy shell script ở nền, người dùng chỉ cần thêm dấu & ở cuối script. 

Thay thế ký tự đại diện

Ký tự đại diện (wildcard) cho phép hệ thống xử lý hơn một lệnh cùng lúc hoặc tìm các đoạn cụm từ trong tệp văn bản. Ví dụ, * bảo hệ thống khớp với mọi chuỗi, kể cả chuỗi rỗng. ? khớp một ký tự, [example] khớp bất kỳ ký tự nào (“example” chỉ là ví dụ) và [1-9] (một ví dụ khác) yêu cầu shell khớp ký tự trong phạm vi đó. 

Bí danh lệnh

Alias trong shell là các lệnh rút gọn. Có alias là một từ, có alias chỉ một chữ cái. Để xem danh sách alias, người dùng chỉ cần nhập ·alias.

Lịch sử lệnh

Có nhiều cách shell tiết kiệm thời gian và công sức, nhưng một tính năng đặc biệt tiện lợi là lịch sử lệnh. Thay vì gõ lại, lệnh history hiển thị tất cả lệnh đã dùng trong phiên làm việc đó.

Thay thế tên tệp

Thay thế tên tệp còn gọi là “globbing”. Khi một từ chứa các ký tự như ?, *, hoặc [, hoặc bắt đầu bằng ~, shell sẽ xem từ đó là một mẫu và thay bằng danh sách tên tệp theo thứ tự bảng chữ cái khớp mẫu đó. 

Chuyển hướng vào/ra 

Chuyển hướng vào/ra (i/o) cho phép người dùng hoán đổi chuẩn nhập (stdin) và chuẩn xuất (stdout) để gắn với màn hình hiển thị, bàn phím hoặc một tệp. 

Piping

Piping trong shell là một dạng chuyển hướng khác, gửi đầu ra của một lệnh/tiến trình/chương trình sang một lệnh/tiến trình/chương trình khác. Điều này cho phép các lệnh/tiến trình/chương trình hoạt động đồng thời và truyền dữ liệu liên tục mà không cần đi qua màn hình hiển thị hoặc tệp văn bản tạm. 

Thay thế biến trong Shell

Khi shell gặp một biểu thức có chứa ký tự đặc biệt, nó dịch mã thành thứ dễ nhận biết hơn với người dùng. Quá trình đó gọi là thay thế biến, hoặc đơn giản là biến. 

Biến cũng được những lập trình viên dày dạn sử dụng. Nếu, chẳng hạn, một lập trình viên chưa biết giá trị thực trước khi chạy chương trình, họ có thể dùng biến làm chỗ giữ (placeholder) trước khi mã sẵn sàng để thực thi. 

Sự khác nhau giữa các Shell

Có hai loại shell chính, “shell” (sh) và “bash”. Cả hai đều chạy trong hệ điều hành Unix. Shell là tên chung cho việc viết script trong bất kỳ shell nào. Đúng như tên gọi, bash (Bourne Again Shell) là phiên bản shell được cải tiến và mở rộng. 

Bash dùng nâng cấp để có nhiều chức năng hơn, hỗ trợ điều khiển job, dễ dùng hơn sh và hỗ trợ lịch sử lệnh. Sh không hỗ trợ lịch sử lệnh; script của nó chạy được trong mọi shell và tính di động cao hơn.  

Sự phát triển của Shell qua các năm

Qua thời gian, shell vừa tiến hóa vừa giữ gần như nguyên vẹn. Bourne shell là bước tiến lớn so với Thompson shell gốc, nhưng nhiều chức năng ban đầu vẫn còn. Tất nhiên, máy tính và kỳ vọng của chúng ta đã thay đổi. 

Về lý thuyết, có nhiều shell như có nhiều người dùng; nhưng về cơ bản, có hai kiểu shell – dòng lệnh hoặc Bourne. Bất cứ thứ gì khác là một phương ngữ hơn là một ngôn ngữ khác. 

Unix shell

Unix shell là nguyên gốc và vẫn rất bền bỉ. Unix shell hoạt động trên Unix và các hệ điều hành họ Unix, như Mac.  

command-lines

command-lines (csh) là các Unix shell phổ biến nhất. command-lines xuất sắc trong công việc tương tác, bao gồm aliases, cdpath, điều khiển job, path hashing, ngăn xếp thư mục, v.v. Chúng cũng cung cấp tính năng chỉnh sửa và lịch sử.

Tenex command-line

Tenex command-line (tcsh) được phát triển bởi Ken Greer từ Caregia Melo University.  Tenex được xem là cải tiến so với phiên bản command-line ban đầu. Khác với C gốc, Tenex cung cấp tính năng chỉnh sửa và tự hoàn thành dòng lệnh, cùng các tính năng khác. Năm 1981, tsch hợp nhất với csh. 

Korn shell

Korn shell (ksh) là một Unix shell khác nhưng giống kiểu dung hòa giữa C và Bourne shell, với khả năng tương thích ngược với Bourne. Korn shell được phát triển đầu thập niên 1980 bởi David Korn tại Bell Labs. 

Bourne again shell

Bourne Again shell (Bash) là một Unix shell mã nguồn mở được Brian Fox viết vào cuối thập niên 1990 cho dự án GNU như một bản nâng cấp cho Bourne shell. 

Shell “độc lạ”

Dù tất cả đều xây trên C hoặc Bourne shell, lập trình viên đã thiết kế hàng trăm nếu không muốn nói là hàng nghìn phương ngữ khác nhau. Có cái hữu ích, có cái chỉ để vui. 

Ai sử dụng Shell?

Hầu như bất kỳ ai dùng máy tính đều hưởng lợi từ shell, nhưng đặc biệt hữu ích cho quản trị viên hệ thống, người làm DevOps, lập trình viên và nhà khoa học dữ liệu. Shell được dùng để tự động hóa tác vụ và ứng dụng, cài đặt gói, sao lưu hoặc khôi phục dữ liệu, và tất nhiên là để lập trình. 

Ví dụ về Shell

Shell có thể đơn giản hoặc phức tạp tùy nhu cầu người dùng. Một lời chào bash đơn giản, chẳng hạn, là echo “hello $USER”, trong khi shell script phức tạp thì gần như vô hạn.  Dưới đây là một vài ví dụ cơ bản: 

Ví dụ 1: Sử dụng vòng lặp while trong bash

Tạo một tệp trong bash bằng trình soạn thảo phù hợp. Ở đây chúng ta dùng vi.
 
$ vi example.sh
 
Thao tác này mở trình soạn thảo với tệp tên example.sh
Nhấn phím 'i' để bắt đầu chèn mã:
#!/bin/bash
valid=true
count=1
while [ $valid ]
do
echo $count
if [ $count -eq 10 ];
then
break
fi
((count++))
done
Nhấn Escape rồi gõ ':wq' để lưu và quay lại terminal. 
Thực thi bằng bash example.sh 
Ví dụ 2:  Nhận đầu vào từ người dùng qua terminal
 
Tạo một tệp khác trong vi: 
$vi example2.sh
 
Nhập mã trong trình soạn thảo:
#!/bin/bash
echo "Enter first number"
read x
echo "Enter second number"
read y
((sum=x+y))
echo "The result of addition = $sum"
Thực thi bằng bash example2.sh
 
Để học thêm các lệnh shell hữu ích cho khoa học dữ liệu, hãy xem hướng dẫn này về Các lệnh Shell hữu ích.

Nghề nghiệp với Shell

Thay vì là một lộ trình nghề nghiệp riêng, hãy xem shell scripting như một công cụ hữu ích trong “kho vũ khí” của nhà khoa học dữ liệu. Các chuyên gia dữ liệu thuộc mọi vai trò đều cần biết nhiều ngôn ngữ (hoặc ít nhất là nên vậy), và shell script giúp họ dùng các ngôn ngữ hiệu quả hơn. 

Dẫu vậy, một số công ty có những vị trí yêu cầu cụ thể về shell scripting. Mức lương trung bình khoảng 78.000 USD. Dù thế, shell script là nền tảng cho các vai trò như quản trị viên hệ thống, có thể đạt mức sáu con số. 

Kết luận

Shell giống như một sợi dây xuyên suốt mọi ngôn ngữ lập trình. Các lệnh phức tạp được rút gọn thành những dạng ngắn gọn, trực quan. Hiểu shell là một kỹ năng quan trọng với mọi nhà khoa học dữ liệu hay kỹ sư máy tính. Tìm hiểu về shell trong khóa học Introduction to Shell của DataCamp. 

Câu hỏi thường gặp về Shell

Kernel là gì?

Kernel là phần cốt lõi quan trọng nhất của hệ điều hành. Kernel chịu trách nhiệm phân bổ bộ nhớ và thời gian cho các chương trình của máy tính, và quản lý truyền thông cũng như kho lưu trữ tệp để đáp ứng các lời gọi hệ thống. 

Shell là gì?

Shell là giao diện giữa kernel và người dùng. 

Lợi ích của shell là gì?

Chúng ta đã biết shell hiệu quả và xử lý nhiều tác vụ nhàm chán cho người dùng; ngoài ra, shell còn cho phép người dùng tùy biến script để phù hợp với nhu cầu riêng. 

Những điểm bất lợi của shell là gì?

Một lỗi nhỏ cũng có thể gây tốn kém và khó xác định. Thêm vào đó, shell không thật sự linh hoạt giữa các hệ điều hành. 

Sự khác biệt giữa Unix và Linux là gì?

Linux là một bản “nhái” Unix được phát triển bởi Linus Torvalds. Linux tự thân không phải là một hệ điều hành; nó là một kernel. Unix, tuy nhiên, bao gồm kernel, shell và các chương trình. 

Những shell nào thường dùng trên hệ thống Linux và Unix?

Bash, hay Bourne Again shell, là shell được dùng phổ biến nhất, nhưng cả Linux và Unix cũng hỗ trợ command-lines, KornShell và TCSH.

Cú pháp của shell là gì?

Trong ngôn ngữ tự nhiên, cú pháp đề cập đến cách sắp xếp từ và cụm từ. Cú pháp của shell cũng tương tự; nó chỉ thứ tự các phép thao tác.

Interpreter là gì?

Bộ thông dịch (interpreter) diễn dịch từng câu lệnh thành mã máy. 

Compiler là gì?

Trình biên dịch (compiler) dịch các chương trình cấp cao sang ngôn ngữ máy phức tạp hơn. 

Bạn thực thi một tệp shell như thế nào?

Đặt quyền với: chmod+x script-name-here.sh

Sau đó chạy bằng: ./script-name-here.sh hoặc sh script-name-here.sh.

Chủ đề

Liên quan