it-swarm-vi.tech

Làm cách nào để chạy tập lệnh Shell trên bảng điều khiển Unix hoặc thiết bị đầu cuối Mac?

Tôi biết điều đó, quên nó và học lại. Thời gian để viết nó xuống.

483
P-A

Để chạy tập lệnh sh không thể thực thi, hãy sử dụng:

sh myscript

Để chạy tập lệnh bash 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 có thể được thực thi, kernel chịu 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à 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 sẽ 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 hoặc thứ gì khác. (Trong thực tế, kernel thường sẽ sử dụng Shell mặc định của người dùng để giải thích tệp, điều này rất nguy hiểm vì nó có thể không phải là trình thông dịch phù hợp hoặc có thể phân tích một số phần mềm nhưng có sự khác biệt về hành vi tinh vi như trường hợp giữa shbash).

Một ghi chú trên /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 tập lệnh. 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 trong /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 trong đó bash giao hàng ở nhiều địa điểm khác nhau, chẳng hạn như /usr/xpg/bin/bash hoặc /usr/local/bin/bash.

Do đó, để viết một tập lệnh bash di động, chúng ta không thể dựa vào mã hóa cứng vị trí của chương trình bash. POSIX đã có một cơ chế để xử lý vấn đề đó: PATH. Ý tưởng là bạn cài đặt các chương trình của mình vào một trong các 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ạnkhông thểchỉ cần làm điều này:

#!bash

Hạt nhân sẽ không (một số có thể) thực hiện tìm kiếm PATH cho bạn. Tuy nhiên, có một chương trình có thể thực hiện tìm kiếm PATH cho bạn, tuy nhiên, nó được gọi là env. May mắn thay, gần như tất cả các hệ thống đều có chương trình env được cài đặt trong /usr/bin. Vì vậy, chúng tôi bắt đầu env bằng cách sử dụng đường dẫn được mã hóa cứng, sau đó thực hiện tìm kiếm PATH cho bash và chạy nó để nó có thể diễn giải tập lệnh 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 chương trình env. Điều đó có nghĩa là chúng tôi không còn chỗ trống để truyền đối số cho bash. Vì vậy, không có cách nào để chuyển đổi một cái gì đó như #!/bin/bash -exu sang sơ đồ này. Thay vào đó, bạn sẽ phải đặt set -exu 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 /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 của riêng mình ở một nơi khác. Đây thường là trường hợp trên OS X (Mac) khi Apple gửi /bin/bash lỗi thời và người dùng cài đặt /usr/local/bin/bash cập nhật bằng cách sử dụng một cái gì đó như Homebrew. Khi bạn sử dụng phương pháp env thực hiện tìm kiếm PATH, bạn sẽ tính đến tùy chọn của người dùng và sử dụng bash ưa thích của anh ta trên phương thức mà hệ thống của anh ta vận chuyển.

895
lhunath

Để bắt đầu Shell-script 'file.sh':

sh file.sh

bash file.sh

Một tùy chọn khác được đặt quyền thực thi bằng lệnh chmod:

chmod +x file.sh

Bây giờ hãy chạy tệp .sh như sau:

./file.sh
76
P-A

Đối với Shell bourne:

sh myscript.sh

Đối với bash:

bash myscript.sh
13
anon

Nếu bạn muốn tập lệnh chạy trong Shell 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 thư mục bin trong thư mục hiện tại.

10
Chas. Owens

Phần mở rộng tệp .command được gán cho Terminal.app. Bấm đúp vào bất kỳ tệp .command nào sẽ thực thi nó.

0
benwiggy

Đầu tiên, cho phép thực hiện: -
[.__.] chmod +x script_name

  1. Nếu tập lệnh không được thực thi: -
    [.__.] Để chạy tập tin sh script: -
    [.__.] sh script_name
    [.__.] Để chạy tệp bash script: -
    [.__.] bash script_name
  2. Nếu tập lệnh được thực thi: -
    [.__.] ./script_name

NOTE: - 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'

0
Vineet Jain