Nó có nghĩa là gì


63

Tôi đã thấy cụm từ "sh tương thích" thường được sử dụng để chỉ vỏ. Tôi không chắc nếu nó cũng áp dụng cho các chương trình có thể được chạy từ trong shell.

Nó có nghĩa là gì đối với hệ vỏ hoặc chương trình khác là "sh tương thích"? "Sh không tương thích" nghĩa là gì?

Chỉnh sửa: Câu hỏi này hỏi sự khác biệt giữa bash và sh rất phù hợp: Sự khác biệt giữa sh và bash

Tôi vẫn muốn có một câu trả lời trực tiếp cho ý nghĩa của việc "tương thích sh". Một kỳ vọng hợp lý có thể là "sh tương thích" có nghĩa là "thực hiện Ngôn ngữ lệnh Shell" nhưng tại sao lại có nhiều shell "tương thích sh" và tại sao chúng lại khác nhau?


1
Đối với tập lệnh shell, nó đề cập đến việc tập lệnh đó có sử dụng cú pháp tương thích (có thể chạy được) với Bourne Shell ( sh) hay không. Đối với một shell khác, nó đề cập đến việc shell đó có thể chạy các kịch bản shell Bourne hay không.
HalosGhost

Nếu bạn muốn tìm hiểu người phát minh ra đạn pháo, bạn có thể truy cập câu trả lời của tôi tại unix.stackexchange.com/questions/45684/iêu
Ba TưGulf

Câu trả lời:


116

Tại sao có nhiều vỏ "sh tương thích"?

Các Bourne shell lần đầu tiên được công khai phát hành vào năm 1979 như một phần của Unix V7 . Vì hầu như mọi hệ thống giống Unix và Unix đều xuất phát từ V7 Unix - ngay cả khi chỉ là về mặt tâm linh - vỏ Bourne đã ở bên chúng tôi "mãi mãi." ¹

Lớp vỏ Bourne thực sự đã thay thế lớp vỏ trước đó, được viết lại là lớp vỏ của Thompson , nhưng nó đã xảy ra quá sớm trong lịch sử của Unix đến nỗi ngày nay nó đã bị lãng quên. Vỏ Bourne là một superset của vỏ Thompson

Cả hai vỏ Bourne và Thompson đều được gọi sh. Các vỏ theo quy định của POSIX cũng được gọi sh. Vì vậy, khi ai đó nói - shtương thích, họ đang tham khảo một cách khéo léo về loạt vỏ này. Nếu họ muốn cụ thể, họ sẽ nói "Vỏ POSIX" hoặc "Vỏ Bourne."

Vỏ POSIX được dựa trên phiên bản năm 1988 của KornShell , mà lần lượt có nghĩa là để thay thế các Bourne shell trên AT & T Unix, nhảy cóc các vỏ C BSD về features.⁴ Trong phạm vi mà kshlà tổ tiên của vỏ POSIX, hầu hết Các hệ thống tương tự Unix và Unix bao gồm một số biến thể của vỏ Korn ngày nay. Các ngoại lệ nói chung là các hệ thống nhúng nhỏ, không đủ khả năng cung cấp cho không gian vỏ POSIX hoàn chỉnh.

Điều đó nói rằng, vỏ Korn - như một thứ khác biệt với vỏ POSIX - chưa bao giờ thực sự trở nên phổ biến bên ngoài thế giới Unix thương mại. Điều này là do sự gia tăng của nó tương ứng với những năm đầu thương mại hóa Unix, vì vậy nó đã bị cuốn vào cuộc chiến Unix . BSD Unixes đã sử dụng nó để thay thế cho vỏ C và mã nguồn của nó không có sẵn để sử dụng trong Linux khi nó bắt đầu. Vì vậy, khi các nhà phân phối Linux đầu tiên tìm kiếm một vỏ lệnh để đi với nhân Linux của họ, họ thường chọn GNU Bash , một trong những người shbạn đang nói về.

Đó là sự kết hợp đầu tiên giữa Linux và Bash khá nhiều kín số phận của nhiều tiện ích khác, bao gồm ksh, cshtcsh. Ngày nay vẫn có những người khó tính vẫn sử dụng những chiếc vỏ đó, nhưng họ rất ít ở thiểu số .⁷

Tất cả lịch sử này giải thích lý do tại sao những người tạo ra các nhà khai thác tương đối thích bash, zshyashchọn làm cho chúng shtương thích: Khả năng tương thích Bourne / POSIX là lớp vỏ tối thiểu cho các hệ thống giống Unix phải cung cấp để có được sự chấp nhận rộng rãi.

Trong nhiều hệ thống, shell lệnh tương tác mặc định và /bin/shlà những thứ khác nhau. /bin/shcó lẽ:

  • Vỏ Bourne ban đầu. Điều này là phổ biến trong các hệ thống UNIX® cũ hơn, như Solaris 10 (phát hành năm 2005) và các phiên bản trước của nó.

  • Một vỏ được chứng nhận POSIX. Điều này là phổ biến trong các hệ thống UNIX® mới hơn, như Solaris 11 (2010).

  • Các Almquist vỏ . Đây là bản sao vỏ Bourne / POSIX mã nguồn mở ban đầu được phát hành trên Usenet vào năm 1989 , sau đó được đóng góp cho CSRG của Berkeley để đưa vào bản phát hành BSD đầu tiên không chứa mã nguồn AT & T, 4.4BSD-Lite . Shell Almquist thường được gọi ash, ngay cả khi được cài đặt như /bin/sh.

    Lần lượt 4.4BSD-Lite trở thành cơ sở cho tất cả các công cụ phái sinh BSD hiện đại, với /bin/shphần còn lại là một công cụ phái sinh toàn phần trong số đó, với một ngoại lệ chính được ghi chú bên dưới. Bạn có thể thấy sự giảm dần trực tiếp này trong kho lưu trữ mã nguồn cho NetBSDFreeBSD : họ đã vận chuyển một dẫn xuất vỏ Almquist từ ngày 1.

    Có hai ashnhánh quan trọng bên ngoài thế giới BSD:

    1. dash, được Debian và Ubuntu áp dụng nổi tiếng vào năm 2006 như là cách /bin/shtriển khai mặc định . (Bash vẫn là vỏ lệnh tương tác mặc định trong các dẫn xuất Debian.)

    2. Các ashlệnh trong BusyBox , mà thường được sử dụng trong Linuxes nhúng và có thể được sử dụng để thực hiện /bin/sh. Vì nó bị hoãn dashvà nó được lấy từ ashgói cũ của Debian , tôi đã chọn coi nó là một dẫn xuất dashthay vì ash, mặc dù tên lệnh của nó trong BusyBox.

      (BusyBox cũng bao gồm một lựa chọn ít featureful để ashgọi hush. Thông thường chỉ có một trong hai sẽ được xây dựng vào bất kỳ trao BusyBox nhị phân: ashtheo mặc định, nhưng hush. Khi không gian thực sự chặt chẽ Như vậy, /bin/shtrên các hệ thống BusyBox dựa trên không phải lúc nào dash. -Like)

  • GNU Bash , vô hiệu hóa hầu hết các phần mở rộng không phải POSIX của nó khi được gọi làsh .

    Lựa chọn này là điển hình trên các biến thể máy tính để bàn và máy chủ của Linux, ngoại trừ Debian và các dẫn xuất của nó. Mac OS X cũng đã làm điều này kể từ Panther, phát hành năm 2003.

  • Một shell có ksh93phần mở rộng POSIX , như trong OpenBSD . Mặc dù trình bao OpenBSD thay đổi hành vi để tránh cú pháp và sự không tương thích về ngữ nghĩa với các trình bao Bourne và POSIX khi được gọi là sh, nhưng nó không vô hiệu hóa bất kỳ tiện ích mở rộng thuần túy nào, là những phần mở rộng không xung đột với các trình bao cũ hơn.

    Điều này không phổ biến; bạn không nên mong đợi ksh93các tính năng trong /bin/sh.

Tôi đã sử dụng "shell script" ở trên như một thuật ngữ chung có nghĩa là kịch bản shell Bourne / POSIX. Điều này là do sự phổ biến của vỏ gia đình Bourne. Để nói về kịch bản trên các trình bao khác, bạn cần đưa ra một vòng loại, như "tập lệnh trình bao C". Ngay cả trên các hệ thống có vỏ họ C là vỏ tương tác mặc định, tốt hơn là sử dụng vỏ Bourne để tạo kịch bản.

Người ta nói rằng khi Wikipedia phân loại shell Unix , họ nhóm chúng thành shell Bourne tương thích, tương thích shell C và "khác".

Sơ đồ này có thể giúp:

Các Shell Unix: Bourne, Korn, POSIX, C và RC Shell Family

(Nhấp vào phiên bản SVG, 31 kB hoặc xem phiên bản PNG kích thước đầy đủ , 218 kB.)

"Sh không tương thích" nghĩa là gì?

Ai đó nói về một shthứ tương thích thường có nghĩa là một trong ba điều sau:

  1. Họ đang đề cập đến một trong những "vỏ" khác.

  2. Họ đang phân biệt giữa gia đình vỏ Bourne và C.

  3. Họ đang nói về một số tính năng cụ thể trong một vỏ gia đình Bourne không có trong tất cả các vỏ gia đình Bourne khác. ksh93, bashzshđặc biệt có nhiều tính năng không tồn tại trong các vỏ "tiêu chuẩn" cũ hơn. Cả ba cũng không tương thích lẫn nhau theo nhiều cách, một khi bạn vượt ra khỏi POSIX / ksh88cơ sở được chia sẻ .

Đó là một lỗi cổ điển khi viết tập lệnh shell với #!/bin/sh dòng shebang ở đầu nhưng sử dụng phần mở rộng shell Bash hoặc Korn bên trong. Vì /bin/shlà một trong các hệ vỏ trong sơ đồ họ Korn / POSIX ở trên trên rất nhiều hệ thống hiện nay, các tập lệnh như vậy sẽ hoạt động trên hệ thống mà chúng được viết trên đó, nhưng sau đó thất bại trên các hệ thống có /bin/shvỏ của họ Bourne rộng hơn. Thực hành tốt nhất là sử dụng #!/bin/bashhoặc #!/bin/kshcác dòng shebang nếu tập lệnh sử dụng các phần mở rộng như vậy.

Có nhiều cách để kiểm tra xem tập lệnh shell Bourne đã cho có khả dụng hay không:

  • Chạy checkbashismstrên nó, một công cụ từ dự án Debian kiểm tra tập lệnh cho " bashism ".

  • Chạy nó bên dưới posh, một vỏ trong kho lưu trữ gói Debian chỉ thực hiện các tính năng được chỉ định bởi SUS3 , cộng với một vài tính năng nhỏ khác .

  • Điều hành nó oshtừ dự án Schily Tools , một phiên bản cải tiến của vỏ Bourne được Sun khai thác như một phần của OpenSolaris vào năm 2005, biến nó thành một trong những cách dễ nhất để có được vỏ Bourne kiểu 1979 trên máy tính hiện đại.

    Phân phối Schily Tools cũng bao gồm bosh, loại vỏ POSIX với nhiều tính năng không đạt tiêu chuẩn , nhưng có thể hữu ích để kiểm tra tính tương thích của các tập lệnh shell dự định chạy trên tất cả các vỏ gia đình POSIX. Nó có xu hướng bảo thủ hơn trong bộ tính năng của nó so với bash, zshvà các phiên bản nâng cao của ksh93.

    Schily Tools cũng bao gồm một vỏ được gọi bsh, nhưng đó là một sự kỳ lạ trong lịch sử hoàn toàn không phải là vỏ của gia đình Bourne.

  • Đi qua chương Lập trình Shell di động trong hướng dẫn GNU Autoconf . Bạn có thể nhận ra một số cấu trúc có vấn đề mà nó nói về các tập lệnh của bạn.

Tại sao chúng khác nhau?

Vì những lý do tương tự, tất cả "Mới & Cải tiến!" mọi thứ đều khác nhau:

  • Phiên bản cải tiến chỉ có thể được cải thiện bằng cách phá vỡ tính tương thích ngược.

  • Ai đó nghĩ ra một cách khác để làm việc gì đó, thứ họ thích hơn, nhưng không giống với cách cũ.

  • Ai đó đã cố gắng thực hiện lại một tiêu chuẩn cũ mà không hoàn toàn hiểu nó, vì vậy họ đã nhầm lẫn và tạo ra một sự khác biệt không chủ ý.


Chú thích và chú thích :

  1. Các phiên bản ban đầu của BSD Unix chỉ là các bộ sưu tập phần mềm bổ sung cho Unix Unix. Vì shell Bourne không được thêm vào AT & T Unix cho đến V7, BSD về mặt kỹ thuật không bắt đầu có vỏ Bourne. Câu trả lời của BSD với bản chất nguyên thủy của vỏ Thompson là vỏ C .

    Tuy nhiên, phiên bản độc lập đầu tiên của BSD (2.9BSD và 3BSD) được dựa trên V7 hoặc người thừa kế di động của UNIX / 32V , vì vậy họ đã bao gồm vỏ Bourne.

    (Dòng 2BSD biến thành một ngã ba song song của BSD cho kỹ thuật số của máy tính mini PDP , trong khi 3BSD và 4BSD dòng tiếp tục tận dụng lợi thế của các loại máy tính mới hơn như VaxenUnix máy trạm 2.9BSD về cơ bản là phiên bản PDP của 4.1cBSD;. Họ đương thời, và mã chia sẻ . PDPs không chỉ biến mất khi VAX đến, do đó, dòng 2BSD được vẫn shambling cùng .)

    Có thể nói rằng vỏ Bourne có mặt ở khắp mọi nơi trong thế giới Unix vào năm 1983. Đó là một sự gần đúng tốt cho "mãi mãi" trong ngành công nghiệp điện toán. MS-DOS đã có một hệ thống tập tin phân cấp vào năm đó (awww, cách thức hoạt động!) Và Macintosh 24 bit đầu tiên với màn hình 9 "B & W - không phải thang độ xám, nghĩa đentrắng - sẽ không xuất hiện cho đến đầu năm sau.

  2. Vỏ của Thompson khá nguyên thủy theo tiêu chuẩn ngày nay. Nó chỉ là một vỏ lệnh tương tác, chứ không phải là môi trường lập trình tập lệnh mà chúng ta mong đợi ngày hôm nay. Nó đã có những thứ như ống dẫn và chuyển hướng I / O, mà chúng ta nghĩ là một phần nguyên mẫu của "vỏ Unix", do đó chúng ta nghĩ về vỏ lệnh MS-DOS khi lấy chúng từ Unix.

    The Bourne shell cũng thay vỏ PWB , mà thêm vào những điều quan trọng để vỏ Thompson như lập trình ( if, switchwhile) và một hình thức đầu của các biến môi trường. Shell PWB thậm chí còn ít được nhớ đến hơn so với shell Thompson vì nó không phải là một phần của mọi phiên bản Unix.

  3. Khi ai đó không cụ thể về khả năng tương thích vỏ POSIX và Bourne, có rất nhiều điều họ có thể muốn nói.

    Ở một thái cực, họ có thể sử dụng vỏ Bourne 1979 làm đường cơ sở. Một " shkịch bản -tương thích" theo nghĩa này có nghĩa là nó được dự kiến để chạy hoàn hảo trên vỏ Bourne đúng hay bất kỳ kế thừa và nhân bản của nó: ash, bash, ksh, zsh,, vv

    Một người ở thái cực khác giả định vỏ được chỉ định bởi POSIX làm đường cơ sở thay thế. Ngày nay, chúng ta lấy quá nhiều tính năng của vỏ POSIX là "tiêu chuẩn" đến nỗi chúng ta thường quên rằng chúng không thực sự có trong vỏ Bourne: số học tích hợp, kiểm soát công việc, lịch sử lệnh, bí danh, chỉnh sửa dòng lệnh, $()hình thức lệnh thay thế, vv

  4. Mặc dù trình bao Korn bắt nguồn từ đầu những năm 1980, AT & T đã không phát hành nó trong Unix cho đến khi System V Release 4 vào năm 1988. Vì rất nhiều Unix thương mại dựa trên SVR4, điều này đã đưa kshvào khá nhiều Unix thương mại có liên quan từ cuối những năm 1980 trở đi.

    (Một vài hương vị Unix kỳ lạ dựa trên SVR3 và trước đó đã nắm giữ các phần của thị trường trước khi phát hành SVR4, nhưng chúng là sản phẩm đầu tiên chống lại bức tường khi cuộc cách mạng đến.)

    Năm 1988 cũng là năm tiêu chuẩn POSIX đầu tiên xuất hiện, với lớp vỏ Korn dựa trên "vỏ POSIX". Sau đó, vào năm 1993, một phiên bản cải tiến của vỏ Korn đã xuất hiện. Vì POSIX đã đóng đinh một cách hiệu quả bản gốc tại chỗ, được kshchia thành hai phiên bản chính: ksh88ksh93, được đặt tên theo những năm liên quan đến việc chia tách của chúng.

    ksh88không hoàn toàn tương thích với POSIX, mặc dù sự khác biệt là nhỏ, do đó một số phiên bản của ksh88vỏ đã được vá để tương thích với POSIX. (Điều này từ một cuộc phỏng vấn thú vị trên Slashdot với Tiến sĩ David G. Korn . Vâng, anh chàng đã viết vỏ.)

    ksh93một superset tương thích hoàn toàn của vỏ POSIX . Phát triển trên ksh93đã không thường xuyên kể từ khi kho lưu trữ nguồn chính chuyển từ AT & T sang GitHub với bản phát hành mới nhất khoảng 3 năm khi tôi viết bài này, ksh93v. (Tên cơ sở của dự án vẫn còn ksh93các hậu tố được thêm vào để biểu thị các phiên bản phát hành sau năm 1993.)

    Các hệ thống bao gồm vỏ Korn như một thứ riêng biệt với vỏ POSIX thường làm cho nó có sẵn /bin/ksh, mặc dù đôi khi nó được ẩn ở nơi khác.

    Khi chúng ta nói về kshhoặc vỏ Korn theo tên, chúng ta đang nói về ksh93các tính năng phân biệt nó với các tập hợp vỏ Bourne và POSIX tương thích ngược của nó. Bạn hiếm khi chạy qua sự tinh khiết ksh88ngày hôm nay.

  5. AT & T giữ độc quyền mã nguồn vỏ Korn cho đến tháng 3 năm 2000 . Vào thời điểm đó, sự liên kết của Linux với GNU Bash rất mạnh mẽ. Bash và ksh93 mỗi người đều có lợi thế hơn nhau , nhưng tại thời điểm này, quán tính giữ cho Linux liên kết chặt chẽ với Bash.

    Là tại sao các nhà cung cấp Linux đầu phổ biến nhất là chọn GNU Bash qua pdksh, mà có sẵn tại thời Linux đã bắt đầu, tôi đoán đó là vì quá nhiều phần còn lại của Userland cũng đến từ dự án GNU . Bash cũng có phần tiến bộ hơn pdksh, vì các nhà phát triển Bash không giới hạn bản thân trong việc sao chép các tính năng của Korn shell.

    Công việc pdkshđã dừng lại về thời gian AT & T phát hành mã nguồn cho trình bao Korn thực sự. Tuy nhiên, có hai nhánh chính vẫn được duy trì: OpenBSD pdkshMirBSD Korn Shell ,mksh .

    Tôi thấy thú vị khi đó mkshlà triển khai vỏ Korn duy nhất hiện được đóng gói cho Cygwin.

  6. GNU Bash vượt xa POSIX theo nhiều cách, nhưng bạn có thể yêu cầu nó chạy ở chế độ POSIX thuần túy hơn .

  7. csh/ tcshthường là lớp vỏ tương tác mặc định trên BSD Unixes cho đến đầu những năm 1990.

    Là một biến thể BSD , các phiên bản đầu tiên của Mac OS X là như vậy, thông qua Mac OS X 10.2 "Jaguar" . OS X đã chuyển lớp vỏ mặc định từ tcshBash sang OS X 10.3 "Panther" . Thay đổi này không ảnh hưởng đến các hệ thống được nâng cấp từ 10.2 trở về trước. Người dùng hiện có trên các hệ thống được chuyển đổi giữ tcshvỏ của họ .

    FreeBSD tuyên bố vẫn sử dụng tcshlàm vỏ mặc định , nhưng trên FreeBSD 10 VM tôi có ở đây, vỏ mặc định dường như là một trong các biến thể vỏ Almquist tương thích POSIX . Điều này cũng đúng trên NetBSD.

    pdkshThay vào đó, OpenBSD sử dụng một ngã ba làm vỏ mặc định.

    Mức độ phổ biến cao hơn của Linux và OS X khiến một số người mong muốn FreeBSD cũng sẽ chuyển sang Bash, nhưng họ sẽ không làm điều đó sớm bất cứ lúc nào vì lý do triết học . Thật dễ dàng để chuyển đổi nó , nếu điều này làm phiền bạn.

  8. Rất hiếm khi tìm thấy một hệ thống có vỏ Bourne thực sự như /bin/shngày nay. Bạn phải đi ra ngoài để tìm thứ gì đó đủ gần với nó để kiểm tra khả năng tương thích.

    Tôi chỉ biết một cách duy nhất để chạy vỏ Bourne cổ điển chính hãng năm 1979 trên máy tính hiện đại: sử dụng hình ảnh đĩa Unix V7 cổ đại với trình giả lập SIMH PDP-11 từ Dự án mô phỏng lịch sử máy tính . SIMH chạy trên hầu hết mọi máy tính hiện đại , không chỉ các máy tính giống Unix. SIMH thậm chí chạy trên Androidtrên iOS .

    Với OpenSolaris , Sun lần đầu tiên mở phiên bản SVR4 của vỏ Bourne. Trước đó, mã nguồn cho các phiên bản hậu V7 của vỏ Bourne chỉ có sẵn cho những người có giấy phép mã nguồn Unix.

    Mã đó hiện có sẵn tách biệt với phần còn lại của dự án OpenSolaris không còn tồn tại từ một số nguồn khác nhau.

    Nguồn trực tiếp nhất là dự án vỏ Heirloom Bourne . Điều này đã trở nên khả dụng ngay sau khi phiên bản OpenSolaris ban đầu năm 2005. Một số công việc về tính di động và sửa lỗi đã được thực hiện trong vài tháng tới, nhưng sau đó việc phát triển dự án bị dừng lại.

    Jörg Schilling đã thực hiện tốt hơn việc duy trì một phiên bản của mã này như oshtrong gói Schily Tools của mình . Xem ở trên để biết thêm về điều này.

    Hãy nhớ rằng các shell này có nguồn gốc từ bản phát hành mã nguồn năm 2005 có chứa hỗ trợ bộ ký tự nhiều byte , điều khiển công việc, các hàm shell và các tính năng khác không có trong shell Bourne 1979 gốc.

    Một cách để biết bạn có đang sử dụng trình bao Bourne ban đầu hay không là xem liệu nó có hỗ trợ một tính năng không có giấy tờ được thêm vào để dễ dàng chuyển đổi từ trình bao của Thompson hay không: ^như một bí danh |. Điều đó có nghĩa là, một lệnh như ls ^ moresẽ đưa ra lỗi trên lớp vỏ Korn hoặc POSIX, nhưng nó sẽ hoạt động giống như ls | moretrên vỏ Bourne thực sự.

  9. Đôi khi bạn gặp phải một fish, scshhoặc rc/esbám chặt, nhưng chúng còn khan hiếm hơn fan vỏ C.

    Họ rcshell không được sử dụng phổ biến trên các hệ thống Unix / Linux, nhưng họ là quan trọng trong lịch sử, đó là cách nó giành được một vị trí trong sơ đồ trên. rclà lớp vỏ tiêu chuẩn của Kế hoạch 9 từ hệ điều hành Bell Labs , một loại kế thừa cho phiên bản thứ 10 Unix , được tạo ra như một phần của nghiên cứu tiếp tục của Bell Labs về thiết kế hệ điều hành. Nó không tương thích với cả Bourne và C shell ở cấp độ lập trình; Có lẽ có một bài học trong đó.

    Biến thể hoạt động mạnh nhất rcdường như là biến thể được duy trì bởi Toby Goodwin , dựa trên rcbản sao Unix của Byron Rakitzis.


Nếu bạn muốn biết nhiều mối quan hệ hơn, ví dụ như với "lệnh" của UNOS, "bsh" và Bourne Shell gần đây, hãy gửi cho tôi một ghi chú. Như một gợi ý: Lệnh UNOS có lệnh dựng sẵn "làm" hoạt động như một tập lệnh shell một dòng với các đối số. Ý tưởng này đã được chuyển vào Bourne Shell dưới dạng "dosh" và cho phép các bí danh có thể tham số hóa, một cái gì đó bạn không thể nhận được từ ksh hoặc bash.
schily

Có thể đáng chú ý rằng chính pdksh dựa trên vỏ Forsyth. Hầu hết bị lãng quên ngày nay nhưng có một số ý nghĩa lịch sử trong di sản pdksh nhưng cũng là vỏ của một số phiên bản của minix và đã được chuyển sang msdos.
Stéphane Chazelas

25

"Sh tương thích" đề cập đến POSIXsh , lớp vỏ cơ bản được yêu cầu tồn tại trên tất cả các hệ thống tương thích. Tập lệnh tương thích sh sẽ hoạt động trên mọi máy tương thích POSIX.

Lý do đó là cần thiết để nói như vậy là thường /bin/shlà một liên kết tượng trưng đến /bin/bash, mà đã cho phép một số bashisms rơi vào kịch bản mà tuyên bố mình để sử dụng shvới #!/bin/sh. Các tập lệnh này không hoạt động trên các hệ thống không sử dụng bashnhư /bin/sh, bao gồm một số Unice thương mại mãi mãi và Debiancác công cụ phái sinh gần đây.

Đặc biệt, đã có một xu hướng sử dụng dash, Debian Almquish Shell, như mặc định shgần đây, vì nó nhỏ hơn và có nghĩa là nhanh hơn. Xu hướng đó đã làm nổi bật rất nhiều những Bashism trong shcác kịch bản được cho là . Mô tả một cái gì đó là "tương thích sh" chỉ ra rằng nó rõ ràng có ý định làm việc với các hệ thống này bằng cách hoàn toàn nằm trong ngôn ngữ được chỉ định POSIX - tất cả các trình bao sẽ thực hiện thay thế chức năng đó, vì vậy nó được đảm bảo hoạt động ở mọi nơi, nhưng các tiện ích mở rộng của chúng không tương thích với nhau.

Các shell khác nhau có lịch sử phát triển riêng và được chuyển hướng theo các hướng khác nhau theo thời gian, khi chúng thêm các chức năng để giúp sử dụng tương tác cho người dùng của chúng hoặc mở rộng tập lệnh như mảng kết hợp. Một tập lệnh "không tương thích" sẽ sử dụng một số tính năng mở rộng không chuẩn này, như các [[điều kiện của Bash .

Các tính năng không phải POSIX trong bashtcshzshtất cả các shell hiện tại khác đều hữu ích và có rất nhiều dịp bạn có thể muốn hoặc cần chúng. Chúng không nên được sử dụng trong một tập lệnh tuyên bố chính nó hoạt động /bin/sh, bởi vì bạn không thể dựa vào các tính năng đó trong shtriển khai cơ sở trên hệ thống bạn đang chạy.

Một tập lệnh không cần sử dụng, giả sử, các mảng kết hợp, phải đảm bảo nó chạy với bashchứ không phải sh:

#!/bin/bash
declare -A array

Điều đó sẽ làm việc bất cứ nơi nào với bash. Các tập lệnh không cần chức năng mở rộng và có nghĩa là có thể mang theo được nên tuyên bố rằng chúng sử dụng shvà tuân theo ngôn ngữ lệnh shell cơ sở.

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.