Sự khác biệt giữa sh và bash


1304

Khi viết chương trình shell, chúng ta thường sử dụng /bin/sh/bin/bash. Tôi thường sử dụng bash, nhưng tôi không biết sự khác biệt giữa chúng là gì.

Sự khác biệt chính giữa bashvà là shgì?

Những gì chúng ta cần phải nhận thức khi lập trình trong bashsh?


21
Để biết danh sách bashism hữu ích và mã tương ứng hoạt động trên shell Bourne, hãy xem mywiki.wooledge.org/Bashism
StackExchange saddens dancek

1
Bạn có thể muốn xem tiêu chuẩn POSIX cho sh và ngôn ngữ lệnh của nó: * sh * Shell Command Language
Maurício C Antunes

7
như một quy tắc chung, tất cả các tập lệnh sh sẽ chạy theo bash nhờ khả năng tương thích posix của nó, nhưng không phải tất cả các tập lệnh bash đều có thể chạy theo sh, sự khác biệt chính mà bạn nhận thấy là những thứ như [[]] thay vì [] so sánh cho phép không gian không được trích dẫn, $ (()) thay vì $ [] biểu thức số học và những thứ khác như "nó quá lớn và quá chậm" trực tiếp từ các tài liệu bash .. Nhưng các nhà viết kịch bản mới không cần giới hạn bản thân với các tập lệnh tương thích sh trừ khi họ đang quay một số khả năng tương thích ngược, mà thường xuyên hơn không phải là trường hợp ngày nay, sau tất cả, đó là (hoặc là ...) năm 2014 phải không ??
osirisgothra

Câu trả lời:


1140

Sh là gì

sh(hoặc Ngôn ngữ lệnh Shell) là ngôn ngữ lập trình được mô tả theo tiêu chuẩn POSIX . Nó có nhiều triển khai ( ksh88, dash, ...). bashcũng có thể được coi là một thực hiện sh(xem bên dưới).

Bởi vì shlà một đặc tả, không phải là một triển khai, /bin/shlà một liên kết tượng trưng (hoặc một liên kết cứng) với một triển khai thực tế trên hầu hết các hệ thống POSIX.

Bash là gì

bashbắt đầu như một shtriển khai tương thích (mặc dù nó có trước tiêu chuẩn POSIX vài năm), nhưng khi thời gian trôi qua, nó đã có được nhiều phần mở rộng. Nhiều tiện ích mở rộng này có thể thay đổi hành vi của tập lệnh shell POSIX hợp lệ, do đó, bản thân nó bashkhông phải là trình bao POSIX hợp lệ. Thay vào đó, nó là một phương ngữ của ngôn ngữ shell POSIX.

bashhỗ trợ một --posixcông tắc, làm cho nó phù hợp hơn với POSIX. Nó cũng cố gắng bắt chước POSIX nếu được gọi là sh.

sh = bash?

Trong một thời gian dài, /bin/shđược sử dụng để trỏ đến /bin/bashhầu hết các hệ thống GNU / Linux. Kết quả là, nó gần như trở nên an toàn khi bỏ qua sự khác biệt giữa hai người. Nhưng điều đó đã bắt đầu thay đổi gần đây.

Một số ví dụ phổ biến về các hệ thống /bin/shkhông trỏ đến /bin/bash(và trên một số trong đó /bin/bashcó thể không tồn tại) là:

  1. Các hệ thống Debian và Ubuntu hiện đại, theo mặc định symlink shđến dash;
  2. Busybox , thường được chạy trong thời gian khởi động hệ thống Linux như là một phần của initramfs. Nó sử dụng ashthực hiện shell.
  3. BSD và nói chung bất kỳ hệ thống không phải Linux nào. OpenBSD sử dụng pdksh, hậu duệ của vỏ Korn. FreeBSD shlà hậu duệ của vỏ UNIX Bourne ban đầu. Solaris có cái riêng shmà trong một thời gian dài không tuân thủ POSIX; một triển khai miễn phí có sẵn từ dự án Gia truyền .

Làm thế nào bạn có thể tìm ra những /bin/shđiểm trên hệ thống của bạn?

Sự phức tạp là đó /bin/shcó thể là một liên kết tượng trưng hoặc một liên kết cứng. Nếu đó là một liên kết tượng trưng, ​​một cách di động để giải quyết nó là:

% file -h /bin/sh
/bin/sh: symbolic link to bash

Nếu đó là một liên kết cứng, hãy thử

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

Trên thực tế, -Lcờ bao gồm cả liên kết tượng trưng và liên kết cứng, nhưng nhược điểm của phương pháp này là nó không khả dụng - POSIX không yêu cầu find hỗ trợ -samefiletùy chọn, mặc dù cả GNU findFreeBSD đều hỗ trợ.

Dòng Shebang

Cuối cùng, tùy bạn quyết định sử dụng cái nào, bằng cách viết dòng «shebang» là dòng đầu tiên của tập lệnh.

Ví dụ

#!/bin/sh

sẽ sử dụng sh(và bất cứ điều gì xảy ra để chỉ đến),

#!/bin/bash

sẽ sử dụng /bin/bashnếu nó khả dụng (và không thành công với thông báo lỗi nếu không có). Tất nhiên, bạn cũng có thể chỉ định thực hiện khác, ví dụ:

#!/bin/dash

Cái nào dùng

Đối với các tập lệnh của riêng tôi, tôi thích shvì những lý do sau:

  • nó được chuẩn hóa
  • nó đơn giản và dễ học hơn nhiều
  • nó có thể di động trên các hệ thống POSIX - ngay cả khi chúng không có bash, chúng bắt buộc phải cósh

Có những lợi thế để sử dụng bashlà tốt. Các tính năng của nó làm cho lập trình thuận tiện hơn và tương tự như lập trình trong các ngôn ngữ lập trình hiện đại khác. Chúng bao gồm những thứ như các biến cục bộ và mảng. Plain shlà một ngôn ngữ lập trình rất tối giản.


Nếu bạn chạy một tập lệnh với bashcách hiển thị các thông báo lỗi hữu ích hơn trong trường hợp lỗi cú pháp. Bạn chỉ có thể tiết kiệm thời gian bằng cách sử dụng bash.
PHP

%nghĩa là gì ở đầu dòng lệnh của bạn?
JosephHarriott

@JosephHarriott đó là một dấu nhắc: một ký tự được in bởi chính shell sau đó lệnh của bạn tuân theo. Một số vỏ sử dụng $thay cho %, hoặc #cho vỏ gốc.
Roman Cheplyaka

@RomanCheplyaka vỏ nào? Tôi chỉ từng thấy $#...
JosephHarriott

@RomanCheplyaka Tôi chắc chắn shđã tồn tại trước khi bash (viết tắt của bourne-again shell). Nhưng nó rất nguyên thủy và không đáp ứng với các sự kiện cuối cùng, như các ESCnhân vật. Sau đó kshđến (cũng trước khi bash), sau đó bash bắt đầu bởi những người yêu thích ý tưởng về một vỏ tốt hơn, nhưng ghét ksh. :-)
raminr

145

sh: http://man.cx/sh
bash : http://man.cx/bash

TL; DR : bashlà một superset shvới cú pháp thanh lịch hơn và nhiều chức năng hơn. Sử dụng một dòng bash shebang trong hầu hết các trường hợp là an toàn vì nó khá phổ biến trên các nền tảng hiện đại.

NB: trong một số môi trường, sh bash . Kiểm tra sh --version.


31
nếu bash được gọi là sh, nó hoạt động hơi khác một chút. Xem gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files ("Được gọi với tên sh") và gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode . Ví dụ, không có quá trình thay thế.
glenn jackman

11
Vì bash là siêu bộ của sh và một số HĐH như FreeBSD không được cài đặt bash theo mặc định, tập lệnh trong sh sẽ mang lại tính di động cao hơn.
dùng674062

1
Vì không có cách nào có thể tạo tập lệnh di động để lấy shell POSIX cho một tập lệnh cụ thể, tập lệnh di động không thể đảm nhận nhiều hơn các tính năng của Bourne Shell.
schily

83

Câu hỏi này thường xuyên được đề cử là kinh điển cho những người cố gắng sử dụng shvà ngạc nhiên rằng nó không hoạt động giống như bash. Dưới đây là một bản tóm tắt nhanh chóng của những hiểu lầm và cạm bẫy phổ biến.

Trước hết, bạn nên hiểu những gì mong đợi.

  • Nếu bạn chạy tập lệnh của mình với sh scriptnamehoặc chạy tập lệnh đó scriptnamevà có #!/bin/shtrong dòng shebang , bạn nên mong đợi shhành vi POSIX .
  • Nếu bạn chạy tập lệnh của bạn với bash scriptname, hoặc chạy nó với scriptnamevà có #!/bin/bash(hoặc tương đương cục bộ) trong dòng shebang, bạn sẽ mong đợi hành vi của Bash.

Có một shebang chính xác và chạy tập lệnh bằng cách chỉ nhập tên tập lệnh (có thể có đường dẫn tương đối hoặc đầy đủ ) nói chung là giải pháp ưa thích. Ngoài một shebang chính xác, điều này đòi hỏi tệp script phải có quyền thực thi ( chmod a+x scriptname).

Vì vậy, làm thế nào để họ thực sự khác nhau?

Tài liệu tham khảo Bash có một phần cố gắng liệt kê sự khác biệt nhưng một số nguồn gây nhầm lẫn phổ biến bao gồm

  • [[không có sẵn trong sh(chỉ [có nhiều hơn và hạn chế hơn).
  • sh không có mảng.
  • Một số từ khóa Bash thích local, source, function, shopt, let, declare, và selectkhông phải là cầm tay để sh. (Một số shhỗ trợ triển khai, ví dụ local.)
  • Bash có nhiều phần mở rộng cú pháp kiểu C như for((i=0;i<=3;i++))vòng lặp ba đối số , +=gán tăng, v.v. $'string\nwith\tC\aescapes'Tính năng này được chấp nhận tạm thời cho POSIX (có nghĩa là nó hoạt động trong Bash ngay bây giờ, nhưng sẽ không được hỗ trợ bởi shcác hệ thống chỉ tuân thủ hiện tại Đặc điểm kỹ thuật POSIX, và có thể sẽ không đến một lúc nào đó).
  • Bash hỗ trợ <<<'here strings'.
  • Bash có *.{png,jpg}{0..12}mở rộng cú đúp.
  • ~chỉ đề cập đến $HOMEBash (và nói chung ~usernamelà thư mục chính của username).Đây là trong POSIX, nhưng có thể thiếu trong một số /bin/shtriển khai trước POSIX .
  • Bash có quá trình thay thế bằng <(cmd)>(cmd).
  • Bash có các bí danh chuyển hướng thuận tiện theo kiểu Csh như &|cho 2>&1 |&>cho> ... 2>&1
  • Bash hỗ trợ đồng xử lý với <>chuyển hướng.
  • Bash có một tập hợp mở rộng tham số không chuẩn mở rộng, chẳng hạn như ${substring:1:2}, ${variable/pattern/replacement}chuyển đổi trường hợp, v.v.
  • Bash đã mở rộng đáng kể các phương tiện cho số học shell (mặc dù vẫn không hỗ trợ dấu phẩy động). Có một $[expression]cú pháp kế thừa lỗi thời , tuy nhiên nên được thay thế bằng $((expression))cú pháp số học POSIX . (Tuy nhiên, một số shtriển khai tiền POSIX cũ có thể không hỗ trợ điều đó.)
  • Biến ma thuật giống như $RANDOM, $SECONDS, $PIPESTATUS[@]$FUNCNAMElà Bash phần mở rộng.
  • Sự khác biệt về cú pháp như export variable=value[ "x" == "y" ]không thể di động ( export variablenên tách biệt với gán biến và so sánh chuỗi di động trong [ ... ]sử dụng một dấu bằng duy nhất).
  • Nhiều, nhiều phần mở rộng chỉ dành cho Bash để bật hoặc tắt hành vi tùy chọn và hiển thị trạng thái bên trong của trình bao.
  • Nhiều, nhiều tính năng tiện lợi cho việc sử dụng tương tác, tuy nhiên không ảnh hưởng đến hành vi tập lệnh.

Hãy nhớ rằng, đây là một danh sách rút gọn. Tham khảo hướng dẫn tham khảo cho toàn bộ tin sốt dẻo và http://mywiki.wooledge.org/Bashism để biết nhiều cách giải quyết tốt; và / hoặc thử http://shellcheck.net/ để cảnh báo cho nhiều tính năng chỉ có Bash.

Một lỗi phổ biến là có một #!/bin/bashdòng shebang, nhưng sau đó vẫn sử dụng sh scriptnameđể thực sự chạy tập lệnh. Điều này về cơ bản vô hiệu hóa bất kỳ chức năng nào chỉ có Bash, do đó bạn gặp lỗi cú pháp, ví dụ như khi cố gắng sử dụng mảng. (Dòng shebang về mặt cú pháp là một nhận xét, vì vậy nó chỉ bị bỏ qua trong kịch bản này.)

Thật không may, Bash sẽ không cảnh báo khi bạn cố gắng sử dụng các cấu trúc này khi nó được gọi là sh. Nó cũng không hoàn toàn vô hiệu hóa tất cả các chức năng chỉ dành cho Bash, vì vậy, chạy Bash bằng cách gọi nó shlà không phải là cách tốt để kiểm tra xem tập lệnh của bạn có di động đúng với ash/ dash/ POSIX shhoặc các biến thể như Heirloom khôngsh



4
shellcheck.net là tất cả những gì tôi cần. cảm ơn nhiều.
Josh Habdas

FWIW, export variable=valueđược ủy quyền bởi POSIX: pubs.opengroup.org/onlinepub/009695399/utilities/export.html . Có lẽ nó không có sẵn trong một số vỏ cổ đại, nhưng nó chắc chắn không phải là một bashism.
Roman Cheplyaka

53

Đăng từ UNIX.COM

Tính năng vỏ

Bảng này dưới đây liệt kê hầu hết các tính năng mà tôi nghĩ sẽ khiến bạn chọn một lớp vỏ khác. Nó không có ý định là một danh sách dứt khoát và không bao gồm mọi tính năng có thể có cho mọi vỏ có thể. Một tính năng chỉ được coi là trong một vỏ nếu trong phiên bản đi kèm với hệ điều hành hoặc nếu nó có sẵn như được biên dịch trực tiếp từ bản phân phối tiêu chuẩn. Cụ thể, vỏ C được chỉ định bên dưới là có sẵn trên SUNOS 4. *, một số lượng đáng kể các nhà cung cấp hiện đang vận chuyển tcsh hoặc vỏ C nâng cao của riêng họ (họ không luôn luôn thấy rõ rằng họ đang vận chuyển tcsh.

Mã số:

                                     sh   csh  ksh  bash tcsh zsh  rc   es
Job control                          N    Y    Y    Y    Y    Y    N    N
Aliases                              N    Y    Y    Y    Y    Y    N    N
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y
Directory stack                      N    Y    Y    Y    Y    Y    F    F
Command history                      N    Y    Y    Y    Y    Y    L    L
Command line editing                 N    N    Y    Y    Y    Y    L    L
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L
User name look up                    N    Y    Y    Y    Y    Y    L    L
Login/Logout watching                N    N    N    N    Y    Y    F    F
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L
Username completion                  N    Y(2) Y    Y    Y    Y    L    L
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L
History completion                   N    N    N    Y    Y    Y    L    L
Fully programmable Completion        N    N    N    N    Y    Y    N    N
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N
Co Processes                         N    N    Y    N    N    Y    N    N
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N
Periodic command execution           N    N    N    N    Y    Y    N    N
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N
Spelling Correction                  N    N    N    N    Y    Y    N    N
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y
Can specify startup file             N    N    Y    Y    N    N    N    N
Low level command redefinition       N    N    N    N    N    N    N    Y
Has anonymous functions              N    N    N    N    N    N    Y    Y
List Variables                       N    Y    Y    N    Y    Y    Y    Y
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y
File no clobber ability              N    Y    Y    Y    Y    Y    N    F
Local variables                      N    N    Y    Y    N    Y    Y    Y
Lexically scoped variables           N    N    N    N    N    N    N    Y
Exceptions                           N    N    N    N    N    N    N    Y

Chìa khóa vào bảng trên.

Tính năng Y có thể được thực hiện bằng cách sử dụng shell này.

N Tính năng không có trong vỏ.

Tính năng F chỉ có thể được thực hiện bằng cách sử dụng cơ chế chức năng shell.

L Thư viện readline phải được liên kết vào trình bao để bật Tính năng này.

Ghi chú vào bảng trên

1. This feature was not in the original version, but has since become
   almost standard.
2. This feature is fairly new and so is often not found on many
   versions of the shell, it is gradually making its way into
   standard distribution.
3. The Vi emulation of this shell is thought by many to be
   incomplete.
4. This feature is not standard but unofficial patches exist to
   perform this.
5. A version called 'pdksh' is freely available, but does not have
   the full functionality of the AT&T version.
6. This can be done via the shells programmable completion mechanism.
7. Only by specifying a file via the ENV environment variable.

Bảng của bạn không hữu ích với tôi vì nó cố gắng so sánh các tính năng của Bourne Shell và các tính năng từ ksh từ trước năm 1988. Nếu bạn thực sự tạo một bảng cho năm 1988, bạn sẽ cần xóa hầu hết các shell khác khỏi bảng đó - bao gồm cả bash , sh và RC. Bạn có thể giải thích bạn đã lấy các giá trị cho bảng của mình từ đâu không?
schily

1
Hãy để tôi đưa ra một số gợi ý: Kiểm soát công việc đã được thêm vào Bourne Shell vào năm 1989 và Bourne Shell được tạo ra OpenSource vào năm 2005. Shell Korn đã thay thế quy trình từ ít nhất là 1988 và đó là OpenSource từ năm 1997. BTW: các tuyên bố của bạn về $ ENV không chính xác, $ ENV chỉ được đọc / thực thi cho các shell tương tác.
schily

3
@schily Bài đăng này đã được chụp từ cs.virginia.edu/helpnet/Computer_OS/unix/shells/shelldiff.html
SriniV

@schily Nếu bạn cảm thấy nó không chính xác ở bất cứ đâu, xin vui lòng chỉnh sửa nó một cách thích hợp.
SriniV

8
Dựa trên những gì được đưa ra một cách khéo léo, có vẻ như sẽ tốt hơn nếu loại bỏ câu trả lời này, vì về cơ bản nó là lừa đảo và OP không thực sự bác bỏ thông tin mà anh ấy đã dán.
danno

53

Shell là giao diện giữa người dùng và HĐH để truy cập các dịch vụ của hệ điều hành. Nó có thể là GUI hoặc CLI (Giao diện dòng lệnh).

sh (Bourne sh ell) là trình thông dịch dòng lệnh shell, dành cho các hệ điều hành giống Unix / Unix. Nó cung cấp một số lệnh tích hợp. Trong ngôn ngữ kịch bản, chúng tôi biểu thị thông dịch viên là #!/bin/sh. Nó được hỗ trợ rộng rãi nhất bởi các shell khác như bash (miễn phí / mở), kash (không miễn phí).

Bash ( B ourne a gain s hell) là sự thay thế vỏ cho vỏ Bourne. Bash là superset của sh. Bash hỗ trợ sh. POSIX là một bộ tiêu chuẩn xác định cách các hệ thống tuân thủ POSIX nên hoạt động. Bash không thực sự là một vỏ tuân thủ POSIX. Trong một ngôn ngữ kịch bản, chúng tôi biểu thị thông dịch viên là #!/bin/bash.

Sự giống nhau:

  • Shell giống như một giao diện hoặc thông số kỹ thuật hoặc API.
  • sh là một lớp thực hiện giao diện Shell.
  • Bash là một lớp con của sh.

nhập mô tả hình ảnh ở đây


3
Tôi không hiểu Bạn đã đề cập đến cả "Bash là superset of sh" và "Bash là một lớp con của sh", phải chăng chúng trái ngược nhau? Bạn có thể vui lòng làm rõ?
Keerthana Mitchhakaran

11
Tôi nghĩ rằng điều này đang cố gắng nói Bash kế thừa từ sh(vì vậy nó là một "lớp con" theo nghĩa OOP) và mở rộng nó (vì vậy có một siêu bộ chức năng).
tripleee

24

THIẾT BỊ ĐẦU CUỐI

  • (các) chương trình đặt một cửa sổ lên
  • xterm, rxvt, konsole, kvt, gnome-terminal, nxterm và eterm.

CHIA SẺ

  • Là một chương trình chạy trong thiết bị đầu cuối
  • Shell vừa là trình thông dịch lệnh vừa là ngôn ngữ lập trình
  • Shell chỉ đơn giản là một bộ xử lý macro thực thi các lệnh.
  • Bộ xử lý macro có nghĩa là chức năng nơi văn bản và ký hiệu được mở rộng để tạo các biểu thức lớn hơn.

SH Vs. BASH

SH

  • (Bán)
  • Là một vỏ cụ thể
  • một trình thông dịch lệnh và một ngôn ngữ lập trình
  • Tiền thân của BASH

BASH

  • (Bourne-Again SHell)
  • Là một vỏ cụ thể
  • một trình thông dịch lệnh và một ngôn ngữ lập trình
  • Có chức năng sh và hơn thế nữa
  • Người kế vị của SH
  • BASH là SHELL mặc định

TÀI LIỆU THAM KHẢO:

SHELL gnu.org:

Ở cơ sở của nó, shell chỉ đơn giản là một bộ xử lý macro thực thi các lệnh. Thuật ngữ bộ xử lý macro có nghĩa là chức năng trong đó văn bản và ký hiệu được mở rộng để tạo các biểu thức lớn hơn.

Một shell Unix vừa là trình thông dịch lệnh vừa là ngôn ngữ lập trình. Là một trình thông dịch lệnh, shell cung cấp giao diện người dùng cho bộ tiện ích GNU phong phú. Các tính năng ngôn ngữ lập trình cho phép các tiện ích này được kết hợp. Các tập tin chứa các lệnh có thể được tạo và tự trở thành các lệnh. Các lệnh mới này có trạng thái giống như các lệnh hệ thống trong các thư mục như / bin, cho phép người dùng hoặc nhóm thiết lập môi trường tùy chỉnh để tự động hóa các tác vụ chung của chúng.

Vỏ có thể được sử dụng tương tác hoặc không tương tác. Trong chế độ tương tác, họ chấp nhận nhập liệu từ bàn phím. Khi thực thi không tương tác, shell thực thi các lệnh được đọc từ một tệp.

Một shell cho phép thực thi các lệnh GNU, cả đồng bộ và không đồng bộ. Shell chờ các lệnh đồng bộ hoàn thành trước khi chấp nhận thêm đầu vào; Các lệnh không đồng bộ tiếp tục thực thi song song với shell trong khi nó đọc và thực thi các lệnh bổ sung. Các cấu trúc chuyển hướng cho phép kiểm soát chi tiết đầu vào và đầu ra của các lệnh đó. Hơn nữa, shell cho phép kiểm soát nội dung của môi trường lệnh.

Shell cũng cung cấp một tập hợp nhỏ các lệnh tích hợp (dựng sẵn) thực hiện chức năng không thể hoặc bất tiện để có được thông qua các tiện ích riêng biệt . Ví dụ, cd, break, continue và exec không thể được thực hiện bên ngoài shell vì chúng trực tiếp thao tác với shell. Lịch sử, getopts, kill hoặc pwd, trong số những thứ khác, có thể được triển khai trong các tiện ích riêng biệt, nhưng chúng thuận tiện hơn để sử dụng như các lệnh dựng sẵn. Tất cả các nội dung shell được mô tả trong các phần tiếp theo.

Mặc dù thực thi các lệnh là rất cần thiết, hầu hết sức mạnh (và độ phức tạp) của shell là do ngôn ngữ lập trình nhúng của chúng. Giống như bất kỳ ngôn ngữ cấp cao nào, shell cung cấp các biến, cấu trúc điều khiển luồng, trích dẫn và hàm.

Shell cung cấp các tính năng dành riêng cho sử dụng tương tác thay vì làm tăng ngôn ngữ lập trình. Các tính năng tương tác này bao gồm kiểm soát công việc, chỉnh sửa dòng lệnh, lịch sử lệnh và bí danh. Mỗi tính năng này được mô tả trong hướng dẫn này.

BASH gnu.org:

Bash là trình bao, hoặc trình thông dịch ngôn ngữ lệnh, cho hệ điều hành GNU. Tên này là từ viết tắt của 'Bourne-Again SHell', một cách chơi chữ của Stephen Bourne, tác giả của tổ tiên trực tiếp của shell shell Unix hiện tại, xuất hiện trong phiên bản thứ bảy của Phòng thí nghiệm Bell của Bell.

Bash phần lớn tương thích với sh và kết hợp các tính năng hữu ích từ ksh shell Ksh và csh shell C. Nó được dự định là một triển khai phù hợp của phần Công cụ và Vỏ của POS POSIX của đặc tả kỹ thuật của POS POSIX (Tiêu chuẩn IEEE 1003.1). Nó cung cấp các cải tiến chức năng trên sh cho cả sử dụng tương tác và lập trình.

Trong khi hệ điều hành GNU cung cấp các shell khác, bao gồm cả phiên bản của csh, Bash là shell mặc định . Giống như các phần mềm GNU khác, Bash khá di động. Nó hiện đang chạy trên gần như mọi phiên bản Unix và một vài hệ điều hành khác - các cổng được hỗ trợ độc lập tồn tại cho các nền tảng MS-DOS, OS / 2 và Windows.


14

Các câu trả lời khác thường chỉ ra sự khác biệt giữa Bash và tiêu chuẩn vỏ POSIX. Tuy nhiên, khi viết các tập lệnh shell di động và được sử dụng theo cú pháp Bash, một danh sách các bashism điển hình và các giải pháp POSIX thuần tương ứng rất tiện dụng. Danh sách như vậy đã được tổng hợp khi Ubuntu chuyển từ Bash sang Dash thành hệ thống mặc định và có thể tìm thấy ở đây: https : //wiki.ub Ubuntu.com/DashAsBinSh

Hơn nữa, có một công cụ tuyệt vời gọi là checkbashism để kiểm tra bashism trong tập lệnh của bạn và có ích khi bạn muốn đảm bảo rằng tập lệnh của bạn có thể mang theo được.


Đây là những gì câu trả lời của tôi bây giờ thực sự sôi nổi. +1
tripleee

7

Chúng gần giống nhau nhưng bashcó nhiều tính năng hơn - shlà (ít nhiều) một tập hợp con cũ hơn bash.

shthường có nghĩa là bản gốc Bourne shell, có trước bash( Bourne *again* shell) và được tạo ra vào năm 1977. Nhưng, trong thực tế, có thể tốt hơn khi nghĩ về nó như một lớp vỏ tương thích chéo phù hợp với tiêu chuẩn POSIX từ năm 1992.

Các tập lệnh bắt đầu bằng #!/bin/shhoặc sử dụng trình shbao thường làm như vậy để tương thích ngược. Bất kỳ hệ điều hành unix / linux sẽ có shvỏ. Trên Ubuntu shthường gọi dashvà trên MacOS, đó là phiên bản POSIX đặc biệt bash. Các shell này có thể được ưu tiên cho hành vi tuân thủ tiêu chuẩn, tương thích tốc độ hoặc ngược.

bashlà mới hơn so với bản gốc sh, thêm nhiều tính năng hơn và tìm cách tương thích ngược với sh. Về lý thuyết, shcác chương trình nên chạy trong bash. bashcó sẵn trên hầu hết các máy linux / unix và thường được sử dụng theo mặc định - ngoại trừ đáng chú ý là mặc định MacOS zshlà của Catalina (10.15). FreeBSD, theo mặc định, không đi kèm với bashcài đặt.


shvượt xa POSIX. Ngày nay, bạn sẽ hy vọng rằng bất kỳ thứ gì shbạn tìm thấy đều tương thích với POSIX; nhưng trên các hệ thống cũ, điều này không có nghĩa là nhất định. POSIX làm mờ hơn nhiều so với vỏ; trong thực tế, bạn có thể lập luận rằng việc tiêu chuẩn hóa các cuộc gọi hệ điều hành và các chức năng thư viện là quan trọng hơn.
tripleee

Tôi đã xóa nội dung về POSIX để làm cho nó bớt khó hiểu hơn
Ryan Taylor

3

/bin/shcó thể hoặc không thể gọi cùng một chương trình như /bin/bash.

shhỗ trợ ít nhất các tính năng theo yêu cầu của POSIX (giả sử thực hiện đúng). Nó cũng có thể hỗ trợ các phần mở rộng.

bash, "Bourne Again Shell", thực hiện các tính năng cần thiết cho sh cộng với các tiện ích mở rộng dành riêng cho bash. Toàn bộ phần mở rộng quá dài để mô tả ở đây và nó thay đổi theo các bản phát hành mới. Sự khác biệt được ghi lại trong hướng dẫn sử dụng bash. Nhập info bashvà đọc phần "Tính năng Bash" (phần 6 trong phiên bản hiện tại) hoặc đọc tài liệu hiện tại trực tuyến .


shchỉ cung cấp cho bạn một vỏ POSIX, nếu bạn có quyền PATHthiết lập trong vỏ hiện tại của mình. Không có tên PATH được xác định cung cấp cho bạn trình bao POSIX.
schily

Trong một thời gian dài, shchẳng hạn, thậm chí không nhất thiết phải cung cấp cho bạn vỏ POSIX, trên Solaris.
tripleee

3

bash và sh là hai vỏ khác nhau. Về cơ bản bash là sh, với nhiều tính năng hơn và cú pháp tốt hơn. Hầu hết các lệnh đều hoạt động giống nhau, nhưng chúng khác nhau. 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 "Bourne Again SHell", 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 nào, trong khi script Bash là scripting dành riêng 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.

Đã nói rằng, bạn nên nhận ra / bin / sh trên hầu hết các hệ thống sẽ là một liên kết tượng trưng và sẽ không gọi sh. Trong Ubuntu / bin / sh được sử dụng để liên kết đến bash, hành vi điển hình trên các bản phân phối Linux, nhưng giờ đã thay đổi thành liên kết với một shell khác gọi là dash. Tôi sẽ sử dụng bash, vì đó là khá nhiều tiêu chuẩn (hoặc ít nhất là phổ biến nhất, từ kinh nghiệm của tôi). Trong thực tế, các vấn đề phát sinh khi tập lệnh bash sẽ sử dụng #! / Bin / sh vì nhà sản xuất tập lệnh giả định liên kết là bash khi không cần phải có.


0

Sự khác biệt càng dễ càng tốt: Sau khi có một sự hiểu biết cơ bản, các ý kiến ​​khác được đăng ở trên sẽ dễ nắm bắt hơn.

Shell - "Shell" là một chương trình, tạo điều kiện cho sự tương tác giữa người dùng và hệ điều hành (kernel). Có nhiều triển khai shell có sẵn, như sh, bash, csh, zsh ... vv.

Sử dụng bất kỳ chương trình Shell nào, chúng tôi sẽ có thể thực thi các lệnh được chương trình shell đó hỗ trợ.

Bash - Nó bắt nguồn từ B ourne- a gain Sh ell. Sử dụng chương trình này, chúng tôi sẽ có thể thực thi tất cả các lệnh được chỉ định bởi Shell. Ngoài ra, chúng tôi sẽ có thể thực thi một số lệnh được thêm vào chương trình này. Bash có khả năng tương thích ngược với sh.

Sh - Nó bắt nguồn từ Bourne Sh ell. "sh" hỗ trợ tất cả các lệnh được chỉ định trong trình bao. Có nghĩa là, Sử dụng chương trình này, chúng tôi sẽ có thể thực thi tất cả các lệnh được chỉ định bởi Shell.

Để biết thêm thông tin, hãy làm: - https://man.cx/sh - https://man.cx/bash


Để hiểu POSIX, hãy đọc phản hồi từ Alex Vui lòng kiểm tra: stackoverflow.com/a/1780614/1261003
Raihanhbh

Tôi không cố hiểu POSIX. Tôi đang xem lại Câu trả lời của bạn và như vậy tôi cần xem Câu trả lời của bạn tăng thêm giá trị. Tôi không nghĩ rằng nó làm.
Scratte

Tôi tin rằng những làm rõ nhỏ này sẽ giúp một người mới hiểu được biệt ngữ được sử dụng trong các cuộc thảo luận ở trên một cách thoải mái hơn. @Scratte
Raihanhbh

-1

Hệ điều hành Linux cung cấp các loại shell khác nhau. Mặc dù shell có nhiều lệnh chung, mỗi loại có các tính năng độc đáo. Chúng ta hãy nghiên cứu các loại vỏ chủ yếu được sử dụng.

Vỏ Sh:

Vỏ Sh còn được gọi là Vỏ Bourne. Sh shell là lớp vỏ đầu tiên được phát triển cho máy tính Unix bởi Stephen Bourne tại Phòng thí nghiệm Bell của AT & T năm 1977. Nó bao gồm nhiều công cụ viết kịch bản.

Vỏ Bash:

Bash shell là viết tắt của Bourne Again Shell. Bash shell là shell mặc định trong hầu hết các bản phân phối linux và thay thế cho Sh Shell (Sh shell cũng sẽ chạy trong shell Bash). Bash Shell có thể thực thi phần lớn các tập lệnh shell Sh mà không cần sửa đổi và cũng cung cấp tính năng chỉnh sửa dòng lệnh.


Có một vỏ trước đó của Ken Thompson. Shell Bourne được giới thiệu chính thức trong v7 Unix (1979).
tripleee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.