Câu trả lời:
Bash ( bash
) là một trong nhiều shell Unix có sẵn (nhưng được sử dụng phổ biến nhất). Bash là viết tắt của " B ourne A gain SH ell" và là sự thay thế / cải tiến của vỏ Bourne ban đầu ( sh
).
Shell scripting là scripting trong bất kỳ shell, trong khi script Bash là kịch bản đặc biệt cho Bash. Tuy nhiên, trong thực tế, "shell script" và "bash script" thường được sử dụng thay thế cho nhau, trừ khi shell trong câu hỏi không phải là Bash.
EDIT: Trên thực tế, shell script mặc định trong Ubuntu là dash, trong khi shell tương tác mặc định (những gì bạn nhận được nếu bạn kéo lên một terminal) là Bash. Tuy nhiên, hai thuật ngữ vẫn chủ yếu có thể thay thế cho nhau.
/bin/sh
là symlink để /bin/dash
tạo hệ thống mặc định , nhưng nó không phải là shell script mặc định , tức là không có quy tắc bằng văn bản mà bạn hoàn toàn phải sử dụng /bin/sh
. Khi một người sử dụng /bin/sh
nó chủ yếu vì lý do tính di động, khi bạn mong đợi tập lệnh của mình sẽ được sử dụng trên nhiều nền tảng HĐH giống Unix, hầu hết đều có /bin/sh
lớp vỏ Bourne, tuân thủ POSIX.
Giới thiệu
Shell scripting và Bash
scripting không giống nhau, vì các shell khác tồn tại như vậy sh
có thể được sử dụng để thực thi một script; một tập lệnh dự định được thực thi bởi Bash
nên được dán nhãn là Bash
tập lệnh. Các thuật ngữ thường được sử dụng thay thế cho nhau bởi vì Bash
, với chức năng mở rộng so với sh
, là thuật ngữ được sử dụng phổ biến nhất để thực thi các tập lệnh người dùng trong nhiều bản phân phối. Tuy nhiên, có các shell khác như Korn (ksh)
, C shell (csh)
và Z shell (zsh)
, nhưng chúng tôi sẽ không đi sâu vào chúng ở đây như một cuộc thảo luận sh
và bash
có liên quan nhất đến Ubuntu. Một bài viết tuyệt vời của IBM ở đây đi sâu vào chi tiết hơn về sự phát triển của shell trong Linux và mô tả tốt kiến trúc shell và cách shell khác nhau.
Shell Scripting
Sh
là vỏ Unix ban đầu được phát triển bởi Stephen Bourne; tuy nhiên các hệ thống dựa trên Debian và Ubuntu coi dash
là sh
vỏ của chúng ( sh
thực sự được liên kết với nhau dash
). Trong Debian và Ubuntu, vì tốc độ của sh
nó, nó thường được sử dụng cho các thủ tục hệ thống quan trọng và để thực thi các tập lệnh chính khi khởi động; để biết thêm chi tiết, xem wiki Ubuntu . Bash
là viết tắt của Bourne Again SHell và được phát triển sau đó bởi Brian Fox và mở rộng nhiều bản gốc sh
. Sự phát triển của Fox và những người khác Bash
là một phần quan trọng của dự án GNU. Xem cuộc thảo luận tuyệt vời này về lịch sử Bash
để biết thêm thông tin.
Điều quan trọng cần lưu ý là cả hai sh
và Bash
, như được sử dụng trong Ubuntu và các bản phân phối khác, đều POSIX
tuân thủ, có nghĩa là chúng đăng ký một số tiêu chuẩn về cách các lệnh được thực thi trong Shell. Điều này là để đảm bảo rằng kết quả của các tập lệnh được sử dụng trong HĐH có thể được dự đoán một cách đáng tin cậy và hành vi của trình bao có thể được giữ trong các POSIX
tham số đó, vì điều đó đặc biệt quan trọng đối với các nhà phát triển. Để biết thêm thông tin về các tiêu chuẩn, xem tài liệu chính thức .
Thông thường các tập lệnh shell có hậu tố .sh
, mặc dù chúng được dự định sẽ được thực thi dưới dạng bash
tập lệnh và có #!/bin/bash
ở đầu tập lệnh. Nó thực sự không quan trọng cho dù tập lệnh được gọi là script.sh hay my.script , điều quan trọng là liệu cuộc gọi đến trình thông dịch là /bin/sh
hay /bin/bash
. Shell script cũng có thể được gọi trên dòng lệnh với sh
hoặc bash
.
Tuy nhiên, điều quan trọng cần lưu ý là các kết quả có thể khác nhau tùy thuộc vào trình thông dịch nào được gọi, vì không phải tất cả bash
các lệnh sẽ hoạt động sh
, trong khi hầu hết sh
các lệnh sẽ hoạt động bash
. Nói chung, hầu hết người dùng sẽ muốn sử dụng /bin/bash
cho tập lệnh của họ để họ có thể tận dụng bộ tính năng mở rộng; kịch bản hệ thống có thể được thực thi /bin/sh
nếu được yêu cầu.
Tài nguyên cho kịch bản Bash Shell
Đôi khi rất khó tìm thấy các tài nguyên hữu ích trực tuyến tuân theo thông lệ tốt và đưa ra lời khuyên sẽ cho phép bạn tạo các tập lệnh hữu ích. Sau đó man bash
, một số tài nguyên quan trọng nhất là wiki của Greg , tin tặc Bash và cuốn sách gần đây của Steve Park về kịch bản Shell tập trung chủ yếu vào Bash
và được xuất bản bởi O'Reilly. Một lời giới thiệu tốt cũng được thực hiện bởi Hướng dẫn cho người mới bắt đầu Bash .
Có rất nhiều vỏ sẵn cho Ubuntu, giống như bash
, zsh
, ksh
, tcsh
và csh
.
Vì vậy, bất cứ khi nào ai đó nói vỏ , anh ấy đang nói về một trong những người đó. Tuy nhiên, những cái vỏ đó khác nhau một chút. Vì vậy, khi ai đó nói về bash
kịch bản, anh ta đang sử dụng shell, nhưng khi ai đó đang nói về kịch bản shell, anh ta sẽ không sử dụng bash
. Nhưng như bash
thường được sử dụng trong kịch bản cho Ubuntu, anh ấy thường như vậy. Hơn nữa, các vỏ khác nhau giống nhau về nhiều khía cạnh, vì vậy nó thường không thành vấn đề.
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 29 11:53 /bin/sh -> dash*
$ ls -l /bin/dash
-rwxr-xr-x 1 root root 109768 Mar 29 11:53 /bin/dash*
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 955024 Apr 3 08:58 /bin/bash*
Điều này cho thấy 'sh' là một liên kết tượng trưng cho 'dash' và / bin / bash, là vỏ tương tác mặc định trên Ubuntu, là một tệp thực thi lớn hơn / bin / sh gần gấp 9 lần.
Thật vậy, 'man sh' (1590 dòng) so với 'man bash' (5459 dòng) tiết lộ rằng bash là một superset lớn của 'sh' truyền thống.
Đọc thêm tại đây:
Shell script sẽ được định nghĩa là một kịch bản hướng theo tính di động , có thể được chạy bởi một hệ thống hệ điều hành tương thích POSIX. Cú pháp sẽ giống hệt hoặc tương tự với cú pháp ngôn ngữ kịch bản lệnh shell được xác định bởi tiêu chuẩn POSIX. Đó là tiêu chuẩn cho hầu hết các HĐH tương thích POSIX, như Linux / Unix / * BSD, v.v. POSIX là nền tảng phổ biến nhất cho khả năng tương thích trên các Hệ điều hành.
Các hệ điều hành khác nhau đã nói ở trên đã triển khai các trình bao khác nhau cho việc sử dụng không tương tác (ví dụ: để thực thi các tập lệnh hệ thống hoặc tập lệnh sử dụng #! /bin/sh
shebang) bên cạnh việc thực hiện các lệnh và cú pháp POSIX, có các phần mở rộng riêng hoặc có thể bị loại bỏ khỏi một số tính năng ít hữu ích hơn vì lý do hiệu suất, nhưng nền tảng POSIX cho phép mức độ di động rất cao của các tập lệnh được thiết kế cho các Oss tuân thủ POSIX khác nhau.
Hầu hết các hệ điều hành đã nói ở trên có vỏ tương tác riêng biệt thường là bash đầy đủ tính năng . Bash là phần lớn tuân thủ POSIX, nhưng cũng có một nhóm lớn các lệnh bổ sung và hỗ trợ cú pháp khác nhau. Bắt đầu Bash với tùy chọn dòng lệnh --poseix hoặc thực thi 'set -o posix' trong khi Bash đang chạy sẽ khiến Bash tuân thủ chặt chẽ hơn với tiêu chuẩn POSIX bằng cách thay đổi hành vi để khớp với POSIX được chỉ định trong các khu vực có mặc định Bash khác nhau, xem: https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html
Nhờ các quy tắc thống nhất về việc đặt các tệp thực thi cho shell (chúng thường nằm trong thư mục '/ bin /'), chúng ta có thể có các quy tắc thống nhất để tạo các tập lệnh shell, cụ thể hơn, chúng ta rõ ràng đường dẫn nào để đưa vào biểu thức shebang để chỉ vào một shell thực thi thích hợp để chạy script. Các hệ thống tệp Unix / Linux / * BSD về bản chất không hỗ trợ các phần mở rộng, vì vậy các phần mở rộng tệp chỉ phục vụ như một gợi ý bổ sung hoặc cho mục đích lập chỉ mục.
Trên Debian / Ubuntu cụ thể, bin/sh
là một liên kết tượng trưng chỉ đến bin/dash
một tệp thực thi của vỏ dash . Điều đó làm cho dash hệ vỏ, được ước tính là nhanh hơn gấp 4 lần và có kích thước ~ 1/10 so với bash nhiều chức năng hơn. nguồn: https://unix.stackexchange.com/questions/148035/is-dash-or-some-other-shell-faster-than-bash
Thiết bị đầu cuối tương tác Debian / Ubuntu theo mặc định, như trong nhiều hệ điều hành giống như Unix khác, bash, mà đường dẫn cũng thống nhất : /bin/bash
.
Tiêu chuẩn POSIX.1-2017: http://pub.opengroup.org/onlinepub/9699919799/xrat/V4_xcu_chap02.html
Nếu một lệnh hoặc tùy chọn không được xác định bởi POSIX, thì đừng đặt nó vào
#! /bin/sh
tập lệnh ở vị trí đầu tiên.
Để chuyển đổi tập lệnh của bạn từ bash sang dạng POSIX, bạn có thể muốn tự động kiểm tra các lỗi trong tập lệnh shell của mình hoặc xem những thay đổi trong tập lệnh bash mà bạn nên thực hiện để làm cho nó tương thích POSIX: