Trong các tập lệnh, dòng đầu tiên sẽ chỉ định đường dẫn đến trình thông dịch.
Nhưng trên các máy chủ khác nhau Linux, Unix hoặc BSD, đường dẫn này có thể khác nhau.
Điều gì là thích hợp hơn?
#!/usr/bin/env bash
hoặc là
#!/bin/bash
Trong các tập lệnh, dòng đầu tiên sẽ chỉ định đường dẫn đến trình thông dịch.
Nhưng trên các máy chủ khác nhau Linux, Unix hoặc BSD, đường dẫn này có thể khác nhau.
Điều gì là thích hợp hơn?
#!/usr/bin/env bash
hoặc là
#!/bin/bash
Câu trả lời:
Nếu bạn muốn sử dụng phiên bản cài đặt hệ thống của một trình thông dịch đã cho được cài đặt ở một vị trí tiêu chuẩn, hãy sử dụng đường dẫn trực tiếp. Nếu bạn muốn sử dụng bất kỳ phiên bản trình thông dịch nào xuất hiện đầu tiên trong người dùng $PATH
, hãy sử dụng #!/usr/bin/env ...
.
Các env
lệnh gọi một lệnh cụ thể, cho phép bạn thiết lập hoặc biến môi trường unset:
env FOO=BAR do-something
env DISPLAY=:0.0 xterm -ls &
Nếu bạn không chỉ định bất kỳ biến môi trường hoặc các tùy chọn khác, nó sẽ chỉ gọi lệnh được đặt tên. (Sử dụng nó theo cách này được cho là một chút hack.)
Mục đích của việc viết shebang như
#!/usr/bin/env interp
là để gọi bất cứ điều gì interp
xuất hiện đầu tiên trong $PATH
.
Đây có nghĩa là bạn không cần phải biết, khi viết kịch bản, chính xác nơi interp
là (nói, nếu nó có thể là một trong hai /bin
, /usr/bin
hoặc /usr/local/bin
). Tất nhiên bạn phải biết rằng env
là /usr/bin/env
, nhưng điều đó có vẻ là hợp lý phổ quát.
Ưu điểm là nó gọi bất kỳ phiên bản nào của trình thông dịch xuất hiện đầu tiên trong người dùng $PATH
. Các bất lợi là nó gọi bất cứ phiên bản của thông dịch viên xuất hiện đầu tiên trong sử dụng của $PATH
.
Ví dụ: giả sử tôi đã cài đặt bản dựng cá nhân trong perl
thư mục nhà của mình $HOME/bin/perl
, và, tôi có $HOME/bin
ở phía trước $PATH
. Nếu tôi chạy một kịch bản có shebang
#!/usr/bin/env perl
sau đó nó sẽ được chạy với perl
chương trình thực thi được cài đặt của riêng tôi - có thể không phải là một điều tốt. Tác giả của kịch bản có lẽ đã không thử nghiệm nó với Perl cạnh sáng mà tôi đã xây dựng từ nguồn một tháng trước.
Đối với một cái gì đó như Perl hoặc Bash có khả năng được cài đặt ở một vị trí nhất quán trên hầu hết các hệ thống ( /usr/bin/perl
và /bin/bash
, tương ứng), tôi sẽ sử dụng đường dẫn trực tiếp đến lệnh. Đối với một cái gì đó tối nghĩa hơn có thể được cài đặt khác nhau trên các hệ thống khác nhau, tôi sẽ sử dụng /usr/bin/env
thủ thuật hoặc tôi sẽ viết một trình cài đặt điều chỉnh dòng shebang khi tập lệnh đang được cài đặt. (Tôi đã từng phải làm điều đó cho các tập lệnh Perl của mình.)
CẬP NHẬT: Tôi đã đi sâu hơn một chút vào câu trả lời cho câu hỏi này trên trang web Unix & Linux .
#!/usr/bin/perl
và sau đó sử dụng use strict; use warnings;
trong phần thân của tập lệnh chứ không phải #!/usr/bin/perl -w
. Nhưng -T
phải ở trên shebang.
#!
dòng không sử dụng $PATH
. Bạn phải xác định đường dẫn của trình thông dịch. (Tôi mới nhận ra rằng, ít nhất là trên hệ thống của mình, nó có thể là một con đường tương đối, nhưng điều đó hiếm khi hữu ích.)
Thực hành tốt nhất là đây:
#!/usr/bin/env bash
#!/usr/bin/env sh
#!/usr/bin/env python
Và cứ thế ...
Khi Ubuntu lần đầu tiên bắt đầu sử dụng dấu gạch ngang, một số tập lệnh đã bị hỏng. Đã có cuộc thảo luận về nó. Hầu hết các tập lệnh được viết #!/bin/sh
là một liên kết đến / bin / bash. Sự đồng thuận là thế này: người viết kịch bản có trách nhiệm chỉ định người phiên dịch. Do đó, nếu tập lệnh của bạn phải luôn được gọi bằng BASH, hãy chỉ định nó từ môi trường. Điều này giúp bạn không phải đoán đường dẫn, khác với các hệ thống Unix / Linux khác nhau. Ngoài ra, nó sẽ hoạt động nếu ngày mai / bin / sh trở thành một liên kết đến một số shell khác như / bin / wthsh hoặc một số điều vô nghĩa khác.
#!/bin/bash
. Tôi đồng ý rằng người viết kịch bản chịu trách nhiệm chỉ định người phiên dịch, nhưng tất cả điều đó có nghĩa là nếu bạn cần bash, hãy nói bash không sh
FYI nó là một shee-bang #!
, bạn cần #
. Bạn sử dụng dòng này để xác định trình thông dịch nào để chạy tập lệnh.
Theo mặc định, Ubuntu liên kết /bin/sh
đến dấu gạch ngang
Tùy thuộc vào mức độ bạn có thể muốn biết về dấu gạch ngang và tại sao dấu gạch ngang được sử dụng cho hệ thống hoặc vỏ deamon xem:
Bash là shell mặc định được sử dụng bởi hầu hết người dùng Linux và có các tính năng khác nhau sau đó gạch ngang. Một tập lệnh được viết cho bash có thể hoặc không thể chạy đúng nếu chạy bằng dấu gạch ngang, tập lệnh càng phức tạp thì càng ít khả năng nó sẽ chạy.
Kịch bản được viết cho perl, python, v.v. sẽ không chạy hoàn toàn với /bin/sh
hoặc /bin/bash
.
Vì vậy, khi bạn viết một tập lệnh, bạn xác định trình thông dịch nào sẽ được sử dụng với shee-bang
Việc lựa chọn những gì để sử dụng được thực hiện bởi tác giả của kịch bản, và một cái không tốt hơn cái khác, tất cả chúng đều có các tính năng, ưu điểm và nhược điểm khác nhau.