12/08/2018, 10:52

Difference between sh and bash?

Đây là 1 câu hỏi trên stackoverflow và câu trả lời nằm ở đây What is sh? sh (Shell Command Language - Ngôn ngữ thông dịch lệnh) là một ngôn ngữ lập trình được mô tả bởi chuẩn POSIX. Nó có nhiều phiên bản cài đặt (ví dụ ksh88, dash,…). bash có thể được xem là 1 phiên bản cài đặt của ...

1.0.jpg

Đây là 1 câu hỏi trên stackoverflow và câu trả lời nằm ở đây

What is sh?

sh (Shell Command Language - Ngôn ngữ thông dịch lệnh) là một ngôn ngữ lập trình được mô tả bởi chuẩn POSIX. Nó có nhiều phiên bản cài đặt (ví dụ ksh88, dash,…). bash có thể được xem là 1 phiên bản cài đặt của sh.

Vì sh là một specification, không phải là một implementation, do đó /bin/sh là một symlink (liên kết tượng trưng) tới một chương trình cài đặt cụ thể trên các hệ thống POSIX.

Bạn có thể tìm hiểu symlink, hardlink tại đây.

What is bash?

bash có thể là một thể hiển cài đặt đầu tiên của sh (mặc dù nó có trước chuẩn POSIX vài năm), nhưng qua thời gian thì nó đã có nhiều phần mở rộng. Nhiều phần thay đổi mở rộng có thể xử lý không hợp lệ với chuẩn POSIX, do bản thân bash không là một shell POSIX hợp lệ. Thay vào đó, nó là một phương ngữ của ngôn ngữ shell POSIX.

bash hỗ trợ chuyển đổi sang --posix, làm cho bash hợp lệ và tuân thủ chuẩn POSIX. Nó cũng cố gắng bắt chước POSIX nếu được gọi như sh.

sh == bash?

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

Một vài các ví dụ phổ biến của các hệ thống /bin/sh không trỏ đến /bin/bash (và một số trong đó /bin/bash có thể thậm chí không tồn tại):

  • Các hệ thống Debian và Ubuntu hiện đại, trong đó symlink sh mặc định trỏ đến dash;
  • 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 ash shell.
  • BSDs: OpenBSD sử dụng pdksh, một hậu duệ của Korn shell. sh của FreeBSD là một hậu duệ của UNIX Bourne shell.

Shebang line

Cuối cùng là để bạn quyết định cái nào sẽ được sử dụng, bằng việc viết dòng lệnh Shebang:

#!/bin/sh

Nó sẽ sử dụng chương trình sh mặc định của hệ thống đang trỏ tới.

#!/bin/bash

Nó sẽ sử dụng bash nếu tồn tại (hoặc báo lỗi nếu không). Ngoài ra, bạn còn có thể dùng dash

#!/bin/dash

Bạn có thể kiểm tra hệ thống đang sử dụng shell nào bằng lệnh:

framgia@framgia-Inspiron-3437 ~ $ file /bin/sh
/bin/sh: symbolic link to `dash'

Which one to use?

Trong các scripts cá nhân, tôi thường sử dụng sh vì các lý do sau:

  • Nó là một chuẩn
  • Đơn giản và dễ học
  • Nó dễ dàng di động qua các hệ thống POSIX – ngay cả khi chúng không cài đặt bash, nhưng trên hệ thống vẫn có chương trình sh được cài đặt.

Nhưng có nhiều lợi thể khi sử dụng ngon lành bash. Các tính năng rất thuận tiện cho việc lập trình và giống với các chương trình lập trình hiện đại. Còn sh là một ngôn ngữ lập trình gọn nhẹ.

0