Điểm của sh được liên kết với dấu gạch ngang là gì?


36

Tôi tự hỏi những điểm shđược liên kết tượng trưng dashlà gì? Tôi hiểu rằng nó dashđược cho là nhanh hơn bash, nhưng tôi không chắc tại sao shvỏ ban đầu không có mặt sh.

Hoặc nếu có bất cứ điều gì tại sao không shđược liên kết đến bash?

Câu trả lời:


72

Câu trả lời ngắn gọn cho câu hỏi tại sao lớp vỏ sh ban đầu không có trong trò chơi shlà không có sh gốc.

Chà, ok, có: đó là vỏ của Thompson . Phiên bản 1 có một số tính năng mà chúng ta biết ngày nay, đặc biệt là chuyển hướng và đường ống (đọc bài viết của Dennis Ritchie về lịch sử Unix đầu tiên ). Các phiên bản sau này đã thêm các tính năng như thực thi nền với &, globalbing (được triển khai với một chương trình bên ngoài) và một số hình thức trích dẫn, nhưng nó không có các biến hoặc cấu trúc điều khiển lồng nhau. Các điều kiện và vòng lặp được cung cấp thông qua các chương trình bên ngoài if(lấy một điều kiện và một lệnh làm đối số) và goto(hoạt động bằng cách thay đổi vị trí tệp của cha mẹ trong tệp tập lệnh).

Vào năm 1979, trong Unix V7 , lớp vỏ của Thompson đã được thay thế /bin/shbằng vỏ Bourne . Bản phát hành đầu tiên đã có nhiều tính năng hiện diện trong dấu gạch ngang ngày hôm nay và các phiên bản tiếp theo được giới thiệu nhiều tính năng khác . Vài năm sau, vỏ Korn xuất hiện, với bộ tính năng ngày càng tăng; nhiều biến thể Unix đã cài đặt nó dưới tên ksh.

Năm 1992, POSIX đã mã hóa một bộ shtính năng tối thiểu về cơ bản là Bourne cộng với một vài thứ. Bất kỳ hệ thống nào tự gọi mình là Unix Unix phải thực hiện ít nhất các tính năng này. Các hệ thống Unix thương mại thường sử dụng ksh làm POSIX sh, nhưng một số ít (ví dụ OSF / 1 ) có cái riêng.

Cả vỏ Bourne lẫn vỏ Korn đều không phải là nguồn mở cho đến gần đây, vì vậy khi thế giới Linux bắt đầu hình thành vào giữa những năm 1990, chúng không có sẵn. /bin/shphải là một cái gì đó khác. Hầu hết các bản phân phối Linux đã sử dụng bash , một vỏ từ dự án GNU có xu hướng nằm giữa Bourne và Korn về các tính năng tập lệnh và tốt hơn nhiều so với sử dụng tương tác). Sự thay thế khả thi duy nhất là pdksh (miền công cộng Korn shell '), một bản miễn phí (hiện đã ngừng sử dụng, nhưng vẫn hoạt động như mksh , được phát triển tích cực ), nhưng tôi không nhớ bản phân phối Linux sử dụng pdksh như/bin/sh, Tôi không biết tại sao, tôi đoán vì các bản phân phối Linux luôn là bản phân phối GNU / Linux, về cơ bản vận chuyển các phiên bản GNU của bất kỳ công cụ nào tồn tại phiên bản GNU.

Ngoài ra còn có một số triển khai mã nguồn mở có shtên gọi là tro tro, đáng chú ý nhất là vỏ Almquist , nhưng chúng chưa hoàn thiện, thiếu một số tính năng POSIX mà mọi người muốn sử dụng. Một lập trình viên là người bảo trì Debian, Herbert Xu , đã mở rộng tro để làm cho nó tuân thủ POSIX. Cuối cùng, phiên bản của anh đã được đổi tên thành dấu gạch ngang và có một số nỗ lực để đưa nó /bin/shvào Debian thay vì bash. Ubuntu đã khởi động trước khi Debian bắt đầu xử lý một cách có hệ thống các bashism (việc sử dụng chức năng dành riêng cho bash trong #!/bin/shcác tập lệnh) như là các lỗi . Cả hai đã chuyển đổi sau ( Ubuntu 6.10 , Debian chỉ trong năm 2009 ( đó là mục tiêu cho đồng xu nhưng việc chuyển đổi chỉ được thực hiện sau khi phát hành đồng xu, tức là trong vắt)).

Một chính lý do cho việc sử dụng dấu gạch ngang như chứ không phải bash như /bin/shlà nó nhanh hơn đáng kể. Điều này đặc biệt quan trọng đối với Ubuntu, vốn đã cố gắng duy trì thời gian khởi động ngắn kể từ đầu. Dash cũng có xu hướng sử dụng ít bộ nhớ hơn bash, điều này hơi quan trọng đối với các tập lệnh trình bao quanh chỉ để làm một chút dọn dẹp khi chương trình bên dưới thoát ra. Một lợi ích khác của dấu gạch ngang là nó chỉ dựa vào libc (thư viện hệ thống cốt lõi) trong khi bash cũng dựa vào các thư viện hỗ trợ đầu cuối (nó không thể bắt đầu mà không có chúng, thậm chí để chạy tập lệnh); điều này có nghĩa là dấu gạch ngang có cơ hội tốt hơn để tiếp tục làm việc trên một hệ thống bị hỏng.

Tại một số thời điểm trong thế kỷ 21, vỏ Korn đã chuyển sang nguồn mở và các phiên bản nguồn mở của vỏ Bourne đã xuất hiện (các phiên bản cũ, vì sự phát triển đã ngừng từ nhiều năm trước). Nhưng dấu gạch ngang và bash đã quá vững chắc trong thế giới Linux để họ có được bất kỳ sự chấp nhận nào, đặc biệt là vỏ Bourne vì giá trị của nó ngày nay chỉ mang tính lịch sử. Dash thay thế bash vì nó có lợi ích rõ ràng, nhưng không ai trong số các ứng cử viên khác có lợi thế quyết định như /bin/sh.


Tôi cho rằng có những lý do chính đáng để sử dụng ksh93 là / bin / sh - đó là một trong những vỏ POSIX hiệu suất cao nhất hiện có. Đồng ý rằng tính phổ biến của dash là vấn đề thời gian.
Charles Duffy

2
@CharlesDuffy Ksh93 nhanh hơn trong việc thực hiện các công cụ phức tạp, nhưng dấu gạch ngang cho thời gian khởi động và đối với các tập lệnh đơn giản (như tất cả các lệnh gọi system(3) mà các ứng dụng tạo ra) đó là yếu tố chi phối.
Gilles 'SO- ngừng trở nên xấu xa'

21

Tốc độ và tuân thủ POSIX (nói cách khác, tính di động) là những yếu tố chính. Hãy nhớ điều đó /bin/shcó nghĩa là cho các tập lệnh hệ thống, có thể có hoặc không đến từ các phiên bản cũ hơn của Ubuntu và / hoặc các hệ thống khác.

Chắc chắn, các tính năng sáng bóng bashrất tuyệt để sử dụng cho người dùng chúng tôi, nhưng khi nói đến việc chạy trong môi trường mà bạn phải quản lý một số máy chủ / hệ thống khác nhau - việc có vỏ tuân thủ POSIX tạo ra nhiều sự khác biệt. Đặc biệt, nếu bạn là một sysadmin mới và môi trường được kế thừa với nhiều tập lệnh.

Về lý do tại sao vỏ Bourne ban đầu không có mặt, nó rất đơn giản - nó là một sản phẩm độc quyền ban đầu được sở hữu bởi AT & T Bell Labs.

Ngoài ra, thực sự có một lời giải thích rõ ràng trên Ubuntu wiki về điều đó:

Tại sao sự thay đổi này được thực hiện? Lý do chính để chuyển đổi vỏ mặc định là hiệu quả. bash là một vỏ đầy đủ tính năng tuyệt vời thích hợp để sử dụng tương tác; Thật vậy, nó vẫn là shell đăng nhập mặc định. Tuy nhiên, nó khá lớn và chậm để khởi động và vận hành bằng cách so sánh với dấu gạch ngang. Một số lượng lớn các phiên bản shell được bắt đầu như là một phần của quy trình khởi động Ubuntu. Thay vì thay đổi từng cái riêng lẻ để chạy một cách rõ ràng dưới / bin / dash, một thay đổi sẽ cần bảo trì liên tục đáng kể và có thể phải hồi quy nếu không chú ý kỹ, nhóm phát triển lõi Ubuntu cảm thấy rằng tốt nhất là thay đổi vỏ mặc định. Các cải tiến tốc độ khởi động trong Ubuntu 6.10 thường được quy cho Upstart không chính xác, đây là một nền tảng tốt để phát triển hệ thống init trong tương lai nhưng trong Ubuntu 6. 10 chủ yếu chạy trong chế độ tương thích System V chỉ với những thay đổi nhỏ về hành vi. Những cải tiến này trên thực tế phần lớn là do sự thay đổi / bin / sh.

Và đây là một lưu ý về tính di động:

Hướng dẫn chính sách Debian từ lâu đã quy định rằng "tập lệnh shell chỉ định '/ bin / sh' làm trình thông dịch chỉ phải sử dụng các tính năng POSIX"; trên thực tế, yêu cầu này đã được áp dụng ngay từ trước khi bắt đầu dự án Ubuntu. Hơn nữa, bất kỳ tập lệnh shell nào dự kiến ​​sẽ có thể di động tới các hệ thống Unix khác, chẳng hạn như BSD hoặc Solaris, đã đáp ứng yêu cầu này. Do đó, chúng tôi cảm thấy rằng tác động tương thích của thay đổi này sẽ là tối thiểu.

Xem https://wiki.ubfox.com/DashAsBinSh


Không dashhỗ trợ các tính năng không được yêu cầu bởi POSIX?
NerdOfLinux

@NerdOfLinux Không thực sự có vấn đề gì / bin / sh hỗ trợ ngoài POSIX (miễn là những bổ sung đó không phá vỡ tập lệnh POSIX); điều quan trọng là nó hỗ trợ mọi thứ POSIX (và càng nhanh càng tốt). Miễn là dash đáp ứng các yêu cầu này, / bin / sh có thể liên kết với nó.
Guntram Blohm hỗ trợ Monica

9

Trong các bản phân phối GNU / Linux, "bản gốc /bin/sh" thực sự là Bash.

GNU muốn có một lớp vỏ giống như Bourne nằm dưới GPL, vì vậy đó là lý do tại sao họ chọn Bash cho chúng /bin/sh, thay vì Bourne, không được cấp phép GPL. Các bản phân phối Linux hiện đại đã kế thừa quyết định này đến mức nó trở thành một tiêu chuẩn không chính xác /bin/shđể trở thành Bash. Shell Bourne ban đầu ("sh") đã được sử dụng trong các Unix không phải Linux khác, thậm chí gần đây là Solaris 10, nhưng nó chưa bao giờ là sản phẩm chính trong các bản phân phối Linux.

Chuyển /bin/shtừ bash sang dash là một quyết định của Debian (được kế thừa bởi Ubuntu) được thúc đẩy chủ yếu bởi tốc độ - đã đến lúc họ nỗ lực rất nhiều để cải thiện tốc độ khởi động và một phần lớn thời gian CPU khởi động phù hợp với thời gian chạy kịch bản init.

Bash tiếp tục được sử dụng làm vỏ tương tác / đăng nhập mặc định cho người dùng, nhưng Dash là một trong /bin/shvà tại đó được thực thi cho các tập lệnh hệ thống, chẳng hạn như tập lệnh init.

Dash rất nhanh, nhưng cũng rất tương thích với POSIX - một tiêu chuẩn được liên kết chặt chẽ với vỏ Bourne. Vì vậy, theo một cách nào đó, bằng cách chuyển từ Bash sang Dash, chúng ta đang quay trở lại một lớp vỏ được liên kết chặt chẽ hơn với Bourne.


"Dash rất nhanh, nhưng cũng rất tương thích với POSIX - một tiêu chuẩn được liên kết chặt chẽ với vỏ Bourne." Vâng, mặc dù POSIX có liên quan chặt chẽ hơn ksh, tôi nói. Tôi không nhớ shell Bourne có mở rộng số học `$ (())`, đó là POSIX.
Sergiy Kolodyazhnyy

1
Ngoài ra, trong Bourne, ^là một nhân vật ống - vì vậy echo foo ^ catsẽ phát ra foo ^ cattrong POSIX sh, nhưng footrong Bourne; bài kiểm tra cụ thể này là cách Autoconf nói với hai người.
Charles Duffy

Thật thú vị, vậy bởi POSIX sh, ý bạn là Korn?
thomasrutter

0

/bin/shđược liên kết /bin/dashvới những gì tôi tin là lý do tương thích. Nhiều kịch bản chỉ đơn giản là bắt đầu với

#!/bin/sh

vì vậy bằng cách di chuyển đến dashvà không tạo liên kết tượng trưng, ​​rất nhiều tập lệnh sẽ không chạy đúng (hoặc hoàn toàn) nếu /bin/shkhông tồn tại.

Sự thay đổi đã được thực hiện từ bashđể dashvì theo https://wiki.ubuntu.com/DashAsBinSh :

Lý do chính để chuyển đổi vỏ mặc định là hiệu quả. bash là một vỏ đầy đủ tính năng tuyệt vời thích hợp để sử dụng tương tác; Thật vậy, nó vẫn là shell đăng nhập mặc định. Tuy nhiên, nó khá lớn và chậm để khởi động và vận hành bằng cách so sánh với dấu gạch ngang. Một số lượng lớn các phiên bản shell được bắt đầu như là một phần của quy trình khởi động Ubuntu. Thay vì thay đổi từng cái riêng lẻ để chạy một cách rõ ràng dưới / bin / dash, một thay đổi sẽ cần bảo trì liên tục đáng kể và có thể phải hồi quy nếu không chú ý kỹ, nhóm phát triển lõi Ubuntu cảm thấy rằng tốt nhất là thay đổi vỏ mặc định.

shkhông được liên kết đến bash, bởi vì

Hướng dẫn chính sách Debian từ lâu đã bắt buộc rằng "tập lệnh shell chỉ định '/ bin / sh' làm trình thông dịch chỉ phải sử dụng các tính năng POSIX"

Nếu bạn muốn sử dụng bashnhư /bin/sh:

Nếu sự cố lan rộng hơn và bạn muốn thay đổi hệ thống mặc định trở lại, thì bạn có thể ra lệnh cho hệ thống quản lý gói ngừng cài đặt dấu gạch ngang dưới dạng / bin / sh:

sudo dpkg-reconfigure dash

Có một số tính năng dashcung cấp rằng bash không, như:

thậm chí còn có một cơ hội bên ngoài rằng có một vài tập lệnh hiện phụ thuộc vào một số tính năng của dấu gạch ngang mà bash không cung cấp!


Tôi đã hiểu khả năng tương thích có thể là một yếu tố nhưng tôi đang tìm kiếm một câu trả lời không quá rõ ràng và sâu sắc hơn ...
NerdOfCode

2
Vì vậy, nếu tôi được cài đặt vỏ bourne gốc shđể /bin/sh, sẽ vít này lên những kịch bản khởi động?
tráng miệng

Có lẽ tốt nhất nên thử điều này trong một máy ảo trước khi triển khai vào thế giới thực ...
NerdOfCode

2
Bạn nên để lại /bin/shdưới dạng vỏ do phân phối cung cấp vì đó là những gì họ đã nhắm mục tiêu với tập lệnh khởi động của họ và tương tự. Nhưng nếu bạn đã thay thế nó bằng Bourne, nó sẽ hầu như tương thích. Tôi sẽ tưởng tượng sẽ có sự phá vỡ mặc dù, chỉ do sự khác biệt nhỏ so với số lượng mã tuyệt đối. Tất nhiên, bạn có thể tự do sử dụng bất kỳ trình bao nào trong tập lệnh của riêng bạn với hàm băm tùy chỉnh.
thomasrutter

1
@mckenzm /bin/shLiên kết shell nào tách biệt với bất kỳ người dùng cụ thể nào đã đặt làm vỏ đăng nhập ban đầu của họ. Mục tiêu của /bin/shkhông phụ thuộc vào người sử dụng đang tìm kiếm, và bạn làm nhu cầu sử dụng sudo--hoặc một số phương tiện khác hoạt động như người sử dụng root - để thay đổi nó. Ngoài ra, nói chung và cho bất kỳ gói nào, dpkg-reconfigurephải được chạy dưới quyền root. Ngược lại, người dùng thường được phép thay đổi vỏ đăng nhập ban đầu của riêng họ và có thể làm như vậy với chshlệnh. Tên của shell đăng nhập ban đầu cũng $SHELLđược sử dụng và được sử dụng cho một số shell không đăng nhập tương tác.
Eliah Kagan
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.