Tại sao không ai sử dụng shell Bourne thực sự là / bin / sh?


55

Tôi đã nhận thấy rằng về cơ bản không có hệ thống nào tôi từng làm việc có /bin/shkhả năng thực thi. Đây luôn là một liên kết tượng trưng đến dash, bashtrong chế độ POSIX hoặc một cái gì đó tương tự.

Tại sao? Những bất lợi của việc sử dụng đúng, bản gốc là /bin/shgì? (Tốc độ? Cấp phép?)


3
Bạn đã từng sử dụng Linux, phải không? Tôi chỉ từng thấy "sh as symlink" trên Linux.
Greg Hewgill

@GregHewgill Các phiên bản gần đây của Solaris có liên shkết với nhau kshkhông?
Gilles 'SO- ngừng trở nên xấu xa'

1
@Gilles theo một trong những câu trả lời, vâng, kể từ Solaris 11. nó được liên kết đến ksh.
strugee

1
@GregHewgill Tôi cũng đã sử dụng Darwin, được liên kết với bash, IIRC.
strugee

6
Bạn có ý nghĩa gì bởi bản gốc / bin / sh ? Vỏ Thomson từ Unix V1? Shell Bourne từ Unix V7 không có chức năng không bình luận ...? Một trong SysIII, SysV, Solaris, HP / UX, sự tái hiện tro trên BSD? Ngày nay shdựa trên một tiêu chuẩn có nghĩa là chúng ta có thể có một số triển khai sẽ hành xử theo cách được chỉ định rõ ràng miễn là bạn sử dụng cú pháp tiêu chuẩn trong tập lệnh của mình.
Stéphane Chazelas

Câu trả lời:


38

Tôi đoán thiếu tính năng - không có lịch sử lệnh, không chuyển hướng ưa thích, không chỉnh sửa dòng lệnh. BSD đã giới thiệu cshshell C vì những lý do đó. Một yếu tố khác là Shell Bourne chính hãng chỉ mới xuất hiện gần đây ở dạng nguồn mở . Trừ khi bạn cấp phép cho nó, bạn không thể phân phối nó. Điều đó đặt nó ngoài tầm với của các bản phát hành miễn phí và khiến nó không có ý thức hệ đối với các bản phân phối khác và * BSD.

Nhưng mã có sẵn bây giờ. Bạn có thể xem, biên dịch nó, cho nó một spin.


50
Và sau đó nhanh chóng chuyển trở lại bất cứ thứ gì bạn đang sử dụng trước đó.
Ignacio Vazquez-Abrams

24
@strugee "" thiếu tính năng "- tại sao điều này sẽ là một vấn đề?" Vâng, điểm tốt ... tại sao các lập trình viên sử dụng những thứ vô dụng như lắp ráp / C / ngôn ngữ cấp cao khi bất cứ điều gì bạn có thể làm với họ bạn có thể viết Ngôn ngữ máy trực tiếp? Thực tế là: tính năng = tăng tốc độ phát triển + tăng khả năng bảo trì = ít chi phí = tốt hơn Sử dụng shchính xác như sử dụng bashngoại trừ đó là: chậm hơn, các chương trình dài hơn và khó bảo trì hơn.
Bakuriu

10
Nó không thực sự thiếu các tính năng nhưng thực tế POSIX bắt buộc shlệnh phải chạy shell tương thích POSIX, điều mà shell Bourne kế thừa không có. Mặc dù POSIX không yêu cầu shphải có /bin/sh, đó là thư mục hợp lý nhất cho nó.
jlliagre

4
Lịch sử lệnh @Bakuriu và chỉnh sửa dòng lệnh là cả hai thứ mà bạn không thực sự cần cho một kịch bản.
strugee

4
@strugee Đó không phải là sự khác biệt duy nhất . Ví dụ: shkhông có mở rộng dấu ngã và dấu ngoặc, một số phần tử tích hợp bị thiếu (ví dụ pushdpopd, select) không có phần mở rộng số học. Rất nhiều biến bị thiếu, ví dụ PIPESTATUS.
Bakuriu

23

Các tuyên bố trong câu hỏi của bạn là không chính xác. Solaris lên đến phiên bản 10 đang cung cấp vỏ Bourne thật như cũ /bin/sh. Điều này được thực hiện để không phá vỡ tính tương thích với các tập lệnh cũ có thể thất bại với trình bao khác. Sự lựa chọn này là rất bực bội khác mặc dù.

Hầu hết nếu không phải tất cả các phiên bản Unix và Unix còn lại, kể cả Solaris 11, đều cung cấp lớp vỏ tương thích /bin/shPOSIX vì POSIX bắt buộc shlệnh khởi chạy trình bao POSIX, không phải trình bao Bourne kế thừa không tuân thủ. /bin/shnói chung là :

  • ksh88hoặc ksh93trên các triển khai Unix thương mại
  • một sửa đổi bashtrên OS/X(mặc dù trước đây zsh)
  • một ashhoặc pdkshphái sinh trên khácBSDs
  • bashhoặc dashtrên các bản phân phối Gnu / Linux.

Nó không nhất thiết phải là một liên kết nhưng có thể là một thực thi thực sự trên nhiều hệ thống, ngoại trừ Gnu / Linux.

Thật thú vị, mặc dù câu trả lời được nêu lên nhiều nhất cho câu hỏi của bạn, không phải là thiếu các tính năng khiến các nhà phát triển phân phối cài đặt một cái gì đó khác với vỏ Bourne kế thừa /bin/shmà là mong muốn được tuân thủ POSIX nhất có thể, nghĩa là hành xử như một Unix giống như hệ điều hành. Thực tế, vỏ POSIX có nhiều tính năng hơn so với vỏ Bourne cũ chỉ là tác dụng phụ của mục tiêu tuân thủ tiêu chuẩn này.

Nó cũng là một thực tế một số vỏ, đáng chú ý bash, hành xử khác nhau khi được gọi sh, và điều này chủ yếu loại bỏ các tính năng từ vỏ, không phải cách khác.


16

Theo như tôi biết thì vỏ Bourne ban đầu không thể được sử dụng bởi BSD và dự án GNU, vì giấy phép của nó.

Trước đó, Unix ban đầu không có giấy phép và dự án GNU cần một lớp vỏ nằm dưới GPL để họ sử dụng bash.

Điều tương tự cũng đúng với BSD4, cha mẹ của tất cả các BSD. Nhờ vụ kiện AT & T, họ cần viết lại tất cả các nguồn từ Unix gốc bao gồm cả vỏ Bourne.

Trong dòng BSD truyền thống, vỏ Bourne đã được vận chuyển cho đến 4.3BSD-Reno (nhưng không còn nữa với Net / 2 và 4.4BSD sau). Vì lý do giấy phép, sau đó nó đã được thay thế bằng sh tương thích bourne, giống như svr4 của Kenneth Almquist (thường được gọi là tro).

Từ FreeBSDs man sh

Một lệnh sh, shell Thompson, đã xuất hiện trong Phiên bản 1 AT & T UNIX. Nó được thay thế trong phiên bản 7 AT & T UNIX bởi vỏ Bourne, kế thừa tên sh.

Phiên bản sh này đã được viết lại vào năm 1989 theo giấy phép BSD sau khi vỏ Bourne từ AT & T System V Release 4 UNIX

Vì vậy, cả hai dự án đã buộc phải không sử dụng shell Bourne và giải quyết cho một shell nguồn mở thực sự.


7

Đã có những vấn đề khác. Shell Bourne đã sử dụng sbrk () thay vì malloc () và điều này khiến nó không dễ mang theo.

Sau khi Bourne Shell trở thành OpenSource thông qua OpenSolaris, tôi đã tạo ra một phiên bản di động hafway và sau đó là phiên bản di động thực sự bằng cách thay thế sbrk () bằng malloc () với sự trợ giúp từ Geoff Collyer (cùng một người đã giúp tránh sbrk () trong Vỏ Korn).

Lý do ban đầu, tại sao tôi tạo phiên bản di động của Bourne Shell là vì tôi thích làm cho Trình chỉnh sửa Lịch sử tôi đã viết cho "bsh" của mình từ năm 1982 đến 1984 cũng có sẵn trong Bourne Shell. Trong khi đó, tôi đã chuyển hầu hết các đặc điểm độc đáo mà tôi đã viết cho "bsh" sang Bourne Shell.

Đây là một trong những người khác:

  • Biên dịch và hoạt động gần như ở mọi nơi bao gồm Cygwin (nhanh hơn gần 2 lần so với bash)
  • Trình chỉnh sửa lịch sử với bộ đệm vòng LRU
  • dựng sẵn TERMCAP
  • Các bí danh nâng cao (bí danh toàn cầu, bí danh cục bộ, ....) và cùng với nội dung "dosh", Bourne Shell là triển khai tương tự Bourne Shell cho phép các bí danh có thể tham số hóa.
  • Hỗ trợ chỉnh sửa các bí danh phức tạp trong trình chỉnh sửa lịch sử ở chế độ thô.
  • Truy cập tất cả 32 bit của mã thoát (2) thông qua các biến .sh. *.
  • thời gian tự động nâng cao với độ phân giải 6 chữ số
  • đẩy / popd / dirs
  • dựng sẵn "tìm"
  • Ống từ stderr
  • Sử dụng vfork () để có hiệu suất tốt hơn.
  • cuối cùng đã sửa tất cả các lỗi được ghi lại từ SVr4 Bourne Shell, ví dụ như đình chỉ luôn hoạt động trong chế độ kiểm soát công việc. ...

Trang người dùng trực tuyến có tại: http://schillix.sourceforge.net/man/man1/bosh.1.html Các nguồn là một phần của hộp công cụ schily tại:

https://sourceforge.net/projects/schilytools/files/

Tôi khuyên bạn nên sử dụng: http://sourceforge.net/projects/schilytools/files/schily-2015-08-18.tar.bz2 hoặc phiên bản mới hơn.

PS tôi quan tâm đến thông tin phản hồi


Xin chào. Tại sao chuyển chúng sang shell Bourne chứ không phải là shell đã được POSIXified như một số BSD sh hoặc pdksh?
Stéphane Chazelas

Việc chuyển Bourne Shell là một thách thức vì nó không sử dụng stdio. Đây là một thách thức tương tự như lấy nguồn csh gốc và làm cho nó được biên dịch bằng cách thay thế printf không phải stdio được viết bằng trình biên dịch VAX. Nhưng tôi đã thêm rất nhiều tính năng POSIX mới hơn vào Bourne Shell và tôi thích ở lại với Bourne Shell trên SchilliX để cho phép nó khởi động với / anr / usr trên các hệ thống tệp riêng biệt không thể có với Korn Shell.
hỏi

Cũng lưu ý rằng tôi muốn xác minh rằng tốc độ của ksh là do sử dụng vfork (). Bây giờ tôi đã chuyển đổi Bourne Shell để sử dụng vfork () hoàn toàn nhanh như các phiên bản ksh gần đây. Đây là một trải nghiệm bạn chỉ có được khi bắt đầu với mã nguồn Bourne Shell ban đầu.
hỏi

OK, nhưng cho đến khi bạn làm cho POSIX phù hợp, nó không có khả năng thu hút nhiều sự quan tâm. Tôi nhớ bạn đã hỏi nhóm austin ML về sự không tương thích với POSIX của vỏ Bourne, đó có phải là thứ bạn đang làm việc không (có nghĩa là phá vỡ khả năng tương thích ngược với vỏ Bourne)? Ngoài ra mọi người (ít nhất là tôi) coi cú pháp POSIX sh là một tiến trình so với trình bao Bourne. Tiếp tục gọi vỏ có nguồn gốc Bourne của bạn, vỏ Bourne có thể gửi ấn tượng sai. Làm thế nào về bimsh (Bourne được cải thiện (ala vi / vim))?
Stéphane Chazelas

Bourne Shell của tôi đã tốt hơn ksh ở một số khía cạnh, ví dụ như triển khai các bí danh tốt hơn, Pushd / popd / dir và hỗ trợ sử dụng tài nguyên dựa trên các tính năng UNIX hiện đại thay vì nếu ksh vẫn dựa trên SVr2. Vì bạn có vẻ thích thú và có kỹ năng về vỏ, tôi muốn có ý tưởng về những gì bạn muốn thấy tiếp theo trong Bourne Shell sau khi đọc: schillix.sourceforge.net/man/man1/bosh.1.html Lưu ý rằng cho đến nay, tôi có tất cả mã mới # ifdef'd và một số tính năng (như ống stderr) cần được bật qua bộ (1).
schily

4

Nó được liên kết với các vỏ cung cấp khả năng tương thích ngược 100% . Bạn không mất bất cứ thứ gì mà vỏ ban đầu có nhưng có được nhiều tính năng hơn trên nó. Không có nhược điểm, vậy tại sao lại bỏ lỡ các tính năng mới? Đây là cùng một lý do tại sao /bin/vithường được liên kết với vim .


5
Nhược điểm là mọi người viết các tập lệnh hoạt động trên một hệ thống của họ, nghĩ rằng tập lệnh của họ tương thích khi không. Tôi đã từng sửa gần một trăm tập lệnh shell Gentoo thực sự cần bash nhưng được gọi là / bin / sh. Tất cả đều vỡ khi tôi thay đổi / bin / sh thành dấu gạch ngang thay vì bash.
Zan Lynx

3
"không có nhược điểm" - tốc độ. ví dụ: bashnhiều, chậm hơn nhiều so vớidash
strugee

@strugee Nếu bạn đang tìm kiếm tốc độ cải thiện phạm vi ms trong một vỏ, có lẽ bạn không sử dụng đúng công cụ cho công việc.
Chris Xuống

1
@ChrisDown định nghĩa "cải tiến phạm vi ms"?
strugee

2
Cú pháp POSIX sh không tương thích hoàn toàn với cú pháp sh Bourne. Chẳng hạn, IFS=,; rm file1,file2,file3sẽ xóa 3 tệp đó trong trình bao Bourne. Tính năng (ngớ ngẩn) đó đã bị xóa trong POSIX sh. Có hàng tá sự khác biệt tinh tế có thể khiến tập lệnh được viết cho trình bao Bourne hoạt động khác với sh POSIX.
Stéphane Chazelas
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.