Sự khác biệt giữa chạy tập lệnh bash bằng sh và ./

Câu hỏi tương tự này có thể nảy sinh khi sử dụng bất kỳ loại tập lệnh nào, không chỉ những loại tập lệnh bash. Có sự khác biệt chính giữa việc chạy tập lệnh thông qua trình thông dịch và chạy trực tiếp không?

Thêm một bí ẩn nữa mà chúng tôi sẽ tiết lộ trong bài đăng thú vị này từ Let's Use Linux (uL).


Khi bạn chạy một tập lệnh bằng cách chuyển tên tệp của tập lệnh tới một trình thông dịch (sh, python, perl, v.v.), bạn thực sự đang thực thi trình thông dịch, truyền chương trình bạn muốn thực thi làm đối số. Ví dụ, chúng tôi chạy trình thông dịch sh bằng cách chuyển cho nó đối số miscript.sh.

sh myscript.sh

Nếu bạn tự chạy tập lệnh, hệ thống sẽ gọi trình thông dịch mà nó cần và sau đó, vâng, nó sẽ thực thi tập lệnh chuyển nó làm đối số cho trình thông dịch, nhưng tất cả đều tự động và không cần người dùng thực thi tập lệnh biết.

./myscript.sh

Để tự chạy một tập lệnh, bạn phải đáp ứng 2 điều kiện:

1) tập lệnh phải bao gồm một "dòng chữ". Đây là dòng đầu tiên của script, phải bắt đầu bằng các ký tự #! và bạn phải chỉ định đường dẫn nơi trình thông dịch được đặt. Điều quan trọng cần lưu ý là điều kiện này đúng với bất kỳ loại tập lệnh nào (python, perl, v.v.), không chỉ những tập lệnh từ bash.

Vì vậy, ví dụ, tập lệnh của chúng tôi phải chứa dòng đầu tiên sau đây:

#! / bin / bash

2) tệp phải có quyền thực thi:

Để cấp quyền thực thi cho tập lệnh của chúng tôi, chúng tôi phải viết:

chmod a + x miscript.sh

Sẵn sàng, bây giờ chỉ cần chạy nó như thế này:

./myscript.sh

Hoặc bằng cách sao chép tập lệnh vào một đường dẫn "đặc biệt" cho phép nó được gọi dễ dàng. Ví dụ: chúng ta có thể sao chép nó vào / usr / sbin và chạy nó từ bất cứ đâu mà không bao gồm đường dẫn đầy đủ nơi nó nằm:

Chúng tôi sao chép:

sudo cp miscript.sh / usr / sbin / miscript

Chúng tôi thực hiện:

viết sai

Như bạn có thể thấy, trên thực tế những gì xảy ra ở hậu trường rất giống nhau trong cả hai trường hợp. Tuy nhiên, bằng cách bao gồm một "bang line", các tập lệnh của bạn sẽ dễ phân phối hơn nhiều, vì người dùng sẽ không phải nhớ đường dẫn nơi các trình thông dịch cần thiết được thực thi. Kết luận: về cơ bản nó là một câu hỏi về sự thoải mái.


Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   Oswaldo Villarroel dijo

    Tôi đồng ý với bạn Erpower, cả phiên bản của trình thông dịch và đường dẫn của nó đều có thể thay đổi và không cố định, thậm chí còn hơn thế nữa nếu coi các bản phân phối GNU / Linux không phải là những bản duy nhất sử dụng Bash (còn có: freeBSD, OpenSolaris , Mac) và nhiều người trong số họ có cấu hình hoặc tuyến đường khác nhau.

    Điều quan trọng là phải biết rằng bạn có khả năng linh hoạt (như bạn đã đề cập) để chơi với lệnh gọi tới tập lệnh, với ./ hoặc với sh (hoặc python ... vv)

  2.   he_who_knows@gmail.com dijo

    Bash là một chương trình máy tính có chức năng diễn giải các lệnh.

    Nó dựa trên Unix shell và tuân thủ POSIX.

    thay vào đó sh là một chương trình máy tính có chức năng diễn giải các lệnh.
    Kết hợp các tính năng như kiểm soát quy trình, chuyển hướng
    đầu vào / đầu ra, danh sách tệp và đọc, bảo vệ,
    giao tiếp và một ngôn ngữ lệnh để viết chương trình bằng
    lô hoặc tập lệnh. Nó là trình thông dịch được sử dụng trong các phiên bản đầu tiên của Unix và nó đã trở thành một tiêu chuẩn trên thực tế.

  3.   Diana C. dijo

    Xin chào, tôi là người mới bắt đầu sử dụng script và tôi muốn biết liệu ai đó có thể giúp tôi giải quyết vấn đề mà tôi gặp phải không:

    Tôi đang quản lý một chương trình yêu cầu bao gồm một số dữ liệu ban đầu thông qua bảng điều khiển và tôi phát hiện ra rằng thông qua một tập lệnh, có thể thực thi chương trình với dữ liệu ban đầu, để không phải viết đi viết lại khi tôi cần chạy chương trình.

    Tôi không biết phải làm như thế nào, vì vậy nếu ai đó có thể giúp tôi điều này, tôi sẽ rất biết ơn.

  4.   Hãy sử dụng Linux dijo

    Hãy xem, nó phụ thuộc vào ngôn ngữ lập trình bạn đang viết kịch bản. Tuy nhiên, trong mọi trường hợp điều bạn cần là:

    1) Nếu bạn muốn người dùng phải nhập dữ liệu đó bất cứ khi nào tập lệnh được thực thi, thì thủ tục phổ biến nhất là để một biến lấy các giá trị đã nhập trong đầu vào.

    2) Trong trường hợp các giá trị luôn giống nhau, bạn có thể sử dụng hằng số.

    3) Một tùy chọn khác là khả năng tập lệnh của bạn có thể nhận tham số.

    Chúc mừng! Paul.

  5.   Hãy sử dụng Linux dijo

    Đó là điều thú vị mà bạn đề cập. Nó được gọi là 2 dạng: đường cắt ngang hoặc đường dây trực tiếp. Tôi chuyển cho bạn dữ liệu: http://python.about.com/od/programmingglossary/g/defbangline.htm
    Chúc mừng! Paul.

  6.   @llomellamomario dijo

    Thật thú vị, tôi đã không bao giờ ngừng suy nghĩ về chi tiết đó. Sẽ rất thú vị khi xem thêm các bài viết về chỉnh sửa bộ điều chỉnh, trong số đó có cách biên dịch lại hạt nhân nổi tiếng để loại bỏ hàng kg mã không cần thiết chỉ có ở đó để tương thích và cải thiện tốc độ hệ thống.

  7.   Hãy sử dụng Linux dijo

    ĐƯỢC CHỨ. Tôi sẽ ghi nhớ điều đó.
    Chúc mừng! Paul.

  8.   Hãy sử dụng Linux dijo

    Tôi rất vui vì nó đã hoạt động. Tôi luôn cố gắng đăng những thứ mà tôi nghĩ có thể thú vị và thiết thực.
    Một cái ôm! Paul.

  9.   Felix Manuel Brito Amarante dijo

    Mỗi lập trình viên có thói quen tốt đều thêm một "bang line" vào dòng mã đầu tiên. Trong Python, tôi không bao giờ quên mã hóa và dòng bang.
    #! / usr / bin / python2.7
    # *. * encoding = utf-8 *. *

  10.   diex02 dijo

    Tuyệt vời, tôi hy vọng bạn có thể xuất bản thêm thông tin về dòng lệnh, đặc biệt là khi biên dịch hoặc cài đặt từ các tệp nguồn (tar.gz, v.v.)

  11.   joe di castro dijo

    Tôi chưa bao giờ nghe nói về "bang line", tôi luôn biết nó là Shebang

    http://en.wikipedia.org/wiki/Shebang_%28Unix%29

    Liên quan

  12.   Jonathan dijo

    ghi chú thú vị ... cảm ơn bạn!

  13.   eM Nói eM dijo

    Thật thú vị làm sao, tôi tuyên bố mình hoàn toàn không biết gì về lập trình và mọi thứ liên quan đến script, tôi không biết nó hoạt động như thế nào, nhưng tôi nhận thấy rằng một số có tiêu đề đó.

  14.   Mario raimondi dijo

    Một sự làm rõ đã xảy ra với tôi có liên quan đến bài đăng này: Tôi muốn cài đặt một tiện ích adobe air (một máy tính tỷ lệ cược poker). Những gì trình cài đặt adobe air làm là chạy tập lệnh tương ứng với "su" nhưng ở dạng ./ yêu cầu bạn nhập mật khẩu gốc. Vì tập lệnh không có quyền thực thi, nó đã ném quyền bị từ chối, giải pháp: chạy tập lệnh với sh nếu bạn không muốn thay đổi quyền (nhanh hơn là vào thư mục tmp chmod và tất cả những thứ đó). Ở đó tập lệnh được thực thi, nó gọi trình cài đặt adobe và một thứ khác.

  15.   Ero sennin dijo

    Bài viết rất thú vị! Cảm ơn đã giúp tôi tìm hiểu thêm một chút về bảng điều khiển. Để xem bạn có tiếp tục xuất bản những bài như thế này không nhé ^^.
    Giữ nó lên, chắc chắn đây là blog yêu thích của tôi !!

  16.   năng lực dijo

    Cần lưu ý rằng có thể có sự khác biệt giữa các phiên bản của trình thông dịch được sử dụng. Chạy script trực tiếp theo shebang không có cách nào để chỉ ra phiên bản thông dịch viên sẽ sử dụng, phiên bản này có thể cần thiết. Nếu bạn chạy trình thông dịch thay thế và chuyển tập lệnh dưới dạng tham số, bạn sẽ biết phiên bản của nó đang chạy.

    Ví dụ trong Python, nếu shebang là #! / Usr / bin / python2.4, chương trình sẽ thực thi khác với nếu là #! / Usr / bin / python2.6 hoặc nếu là #! / Usr / bin / python (thường là một liên kết tượng trưng đến phiên bản Python được cài đặt và cấu hình theo mặc định). Điều này xảy ra vì Python 2.6 có chức năng mới không tồn tại trong Python 2.4, do đó, việc viết một tập lệnh sử dụng chức năng đó chỉ ra #! / Usr / bin / python shebang sẽ không thành công nếu hệ thống chỉ cài đặt python 2.4. Thay vào đó, bạn luôn có thể buộc tập lệnh chạy với phiên bản python bạn muốn bằng cách bắt đầu nó bằng "python2.4 /path/al/script.py" hoặc "python2.6 /path/al/script.py /

    Đối với các tập lệnh shell, cũng có sự khác biệt giữa các shell mà bạn sử dụng, vì vậy việc sử dụng #! / Bin / sh và #! / Bin / bash có thể có các kết quả khác nhau tùy thuộc vào tập lệnh. Nếu bạn viết một tập lệnh sử dụng các tính năng chỉ tồn tại trong bash nhưng chỉ ra một shebang #! / Bin / sh, thì tập lệnh của bạn có thể sẽ hoạt động trên Linux (trên hầu hết các bản phân phối / bin / sh là một liên kết tượng trưng để bash) nhưng nó có thể sẽ không thành công trong các UNIX khác, nơi bash không được cài đặt hoặc trong đó / bin / sh không phải là một liên kết tượng trưng đến / bin / bash.

    Cũng liên quan đến tính di động, cần phải lưu ý rằng đường dẫn được chỉ ra trong shebang là tuyệt đối, và đôi khi các trình thông dịch được cài đặt ở những nơi khác. Ví dụ: thông thường, trình thông dịch python được cài đặt trong / usr / local / bin / python nếu bạn đã tải xuống và biên dịch Python thay vì sử dụng một gói từ bản phân phối của mình. Nếu tập lệnh của bạn là #! / Usr / bin / python, thì tập lệnh sẽ không hoạt động trên các hệ thống đó. Để tránh những sự cố này, bạn có thể sử dụng dưới dạng shebang "#! / Usr / bin / env python" (hoặc "#! / Usr / bin / env sh") như được giải thích trong http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   Hãy sử dụng Linux dijo

    Cảm ơn Jonathan! Rất vui khi thấy bạn bình luận!
    Chúc mừng! Paul.

  18.   antonio dijo

    Không có nơi nào tôi muốn biết, hoặc ít nhất tôi không biết cách đưa nó vào công cụ tìm kiếm, tôi muốn tạo một tập lệnh mà vì lý do gì đó xX thực hiện lệnh aptitude hoặc «su» (nó chỉ là một ví dụ nhưng có 2 trường hợp mà tôi có thể nghĩ đến) và trong trường hợp năng khiếu đôi khi nó yêu cầu tôi nhập "yon" hoặc trong "su" nó yêu cầu tôi nhập mật khẩu ... Tôi muốn tập lệnh chọn những tùy chọn tự động bằng cách truyền một tham số hoặc sử dụng một số phương thức mà nó không biết .... Cảm ơn vì đã chú ý

    1.    hãy sử dụng linux dijo

      Xin chào Antonio! Nếu vấn đề của bạn là phải nhập mật khẩu, tôi không nghĩ rằng có một giải pháp. Chính vì nó là một biện pháp bảo mật nên không phải ai cũng có thể cài đặt một chương trình.
      Về năng khiếu và phải đặt là có, tôi nghĩ có thể giải quyết được. Hiện tại tôi không nhớ thông số chính xác để sử dụng, nhưng chỉ cần tìm hiểu trong các trang người đàn ông. Mở một thiết bị đầu cuối và nhập lệnh: man aptitude.
      Ôm! Paul.

  19.   David M.M. dijo

    Bài rất hay.
    Tôi đặc biệt thích -trong bài đăng này- rằng câu hỏi / nghi ngờ nảy sinh được trả lời rất rõ ràng và ngắn gọn.