Câu trả lời:
Để chạy sh
tập lệnh không thể thực thi , hãy sử dụng:
sh myscript
Để chạy bash
tập lệnh không thể thực thi , hãy sử dụng:
bash myscript
Để bắt đầu thực thi (đó là bất kỳ tệp nào có quyền thực thi); bạn chỉ cần xác định nó theo đường dẫn của nó:
/foo/bar
/bin/bar
./bar
Để tạo tập lệnh thực thi, hãy cấp cho nó quyền cần thiết:
chmod +x bar
./bar
Khi một tập tin có thể thực thi được, kernel có trách nhiệm tìm ra cách để thực hiện nó. Đối với các tệp không nhị phân, điều này được thực hiện bằng cách nhìn vào dòng đầu tiên của tệp. Nó nên chứa một hashbang
:
#! /usr/bin/env bash
Hàm băm cho hạt nhân biết chương trình nào sẽ chạy (trong trường hợp này lệnh /usr/bin/env
được chạy với đối số bash
). Sau đó, tập lệnh được chuyển đến chương trình (dưới dạng đối số thứ hai) cùng với tất cả các đối số bạn đã đưa tập lệnh làm đối số tiếp theo.
Điều đó có nghĩa là mọi tập lệnh có thể thực thi được nên có hàm băm . Nếu không, bạn không nói với kernel đó là gì và do đó kernel không biết nên sử dụng chương trình nào để giải thích nó. Nó có thể là bash
, perl
, python
, sh
, hay cái gì khác. . trường hợp giữa sh
và bash
).
/usr/bin/env
Thông thường nhất, bạn sẽ thấy tiếng nổ băm như vậy:
#!/bin/bash
Kết quả là kernel sẽ chạy chương trình /bin/bash
để diễn giải kịch bản. Thật không may, bash
không phải lúc nào cũng được vận chuyển theo mặc định và không phải lúc nào cũng có sẵn /bin
. Mặc dù trên các máy Linux thường có, có một loạt các máy POSIX khác có bash
tàu ở nhiều địa điểm khác nhau, chẳng hạn như /usr/xpg/bin/bash
hoặc /usr/local/bin/bash
.
Để viết một tập lệnh bash di động, do đó chúng ta không thể dựa vào mã hóa cứng vị trí của bash
chương trình. POSIX đã có một cơ chế để xử lý việc đó : PATH
. Ý tưởng là bạn cài đặt các chương trình của mình vào một trong những thư mục nằm trong PATH
và hệ thống sẽ có thể tìm thấy chương trình của bạn khi bạn muốn chạy nó theo tên.
Đáng buồn thay, bạn không thể làm điều này:
#!bash
Hạt nhân sẽ không (một số có thể) thực hiện PATH
tìm kiếm cho bạn. Tuy nhiên, có một chương trình có thể thực hiện PATH
tìm kiếm cho bạn env
. May mắn thay, gần như tất cả các hệ thống có một env
chương trình được cài đặt /usr/bin
. Vì vậy, chúng tôi bắt đầu env
sử dụng một đường dẫn được mã hóa cứng, sau đó thực hiện PATH
tìm kiếm bash
và chạy nó để nó có thể diễn giải kịch bản của bạn:
#!/usr/bin/env bash
Cách tiếp cận này có một nhược điểm: Theo POSIX, hashbang có thể có một đối số . Trong trường hợp này, chúng tôi sử dụng bash
làm đối số cho env
chương trình. Điều đó có nghĩa là chúng tôi không còn chỗ trống để truyền đối số bash
. Vì vậy, không có cách nào để chuyển đổi một cái gì đó giống như #!/bin/bash -exu
chương trình này. set -exu
Thay vào đó, bạn sẽ phải đặt sau hashbang.
Cách tiếp cận này cũng có một ưu điểm khác: Một số hệ thống có thể giao hàng với một /bin/bash
, nhưng người dùng có thể không thích nó, có thể thấy nó bị lỗi hoặc lỗi thời và có thể đã cài đặt bash
ở một nơi khác. Đây thường là trường hợp trên OS X (Mac), nơi Apple vận chuyển lỗi thời /bin/bash
và người dùng cài đặt một bản cập nhật /usr/local/bin/bash
bằng cách sử dụng một cái gì đó như Homebrew. Khi bạn sử dụng env
phương pháp PATH
tìm kiếm, bạn sẽ tính đến sở thích của người dùng và sử dụng bash ưa thích của anh ta đối với phương pháp mà hệ thống của anh ta vận chuyển.
zsh
như vỏ của tôi, tôi sẽ sử dụng hashbang
#! /usr/bin/env zsh
?
#! /usr/bin/env zsh
if (và chỉ khi) mã bên trong tập lệnh nên được thực thi bởi trình bao Z.
Đối với vỏ bourne:
sh myscript.sh
Đối với bash:
bash myscript.sh
Nếu bạn muốn tập lệnh chạy trong trình bao hiện tại (ví dụ: bạn muốn tập lệnh có thể ảnh hưởng đến thư mục hoặc môi trường của bạn), bạn nên nói:
. /path/to/script.sh
hoặc là
source /path/to/script.sh
Lưu ý rằng /path/to/script.sh
có thể là tương đối, ví dụ . bin/script.sh
chạy script.sh
trong bin
thư mục trong thư mục hiện tại.
Đầu tiên, cho phép thực hiện: -
chmod +x script_name
sh script_name
bash script_name
./script_name
LƯU Ý : -bạn có thể kiểm tra xem tệp có thực thi được hay không bằng cách sử dụng 'ls -a'
Ngoài ra, để chạy trình thông dịch từ cùng một thư mục, vẫn sử dụng #! Hashbang trong tập lệnh.
Ví dụ, một tệp thực thi php7.2 được sao chép từ / usr / bin nằm trong một thư mục cùng với tập lệnh hello .
#!./php7.2
<?php
echo "Hello!";
Để chạy nó:
./hello
Mà hành xử giống như:
./php7.2 hello