Làm cách nào để thực thi một tập lệnh bash trong Terminal?


108

Tôi có một tập lệnh bash như:

#!/bin/bash

echo Hello world!

Làm cách nào để thực hiện điều này trong Terminal?


27
Nó có quyền thực thi không? Hãy thử một chmod +x scriptnamevà sau đó ./scriptname.
dirkgently

Câu trả lời:


49

$prompt: /path/to/scriptvà nhấn enter. Lưu ý rằng bạn cần đảm bảo rằng tập lệnh có quyền thực thi.


1
Nếu bạn đã là trong /path/to thư mục, ví dụ như với các cd /path/tolệnh, bạn có thể nhập ./scriptđể chạy script.Don't bạn quên, trong trường hợp này './' trước khi 'kịch bản'
FrViPofm


26

cd vào thư mục có chứa tập lệnh hoặc đặt nó vào thư mục bin nằm trong $ PATH của bạn

sau đó gõ

./scriptname.sh

nếu trong cùng một thư mục hoặc

scriptname.sh

nếu nó nằm trong thư mục bin.


9
Điều này sẽ chỉ hoạt động nếu tập lệnh có đặt bit thực thi. Điều đó có lẽ cần phải được giải quyết.
Bryan Oakley

./scriptname.shlàm việc cho tôi nhưng scriptname.shcho scriptname.sh: command not found. -rwxr-xr-xlà các quyền của nó.
Spikatrix

1
Lời khuyên cho cdbất cứ nơi nào có thể gây ra một hiểu lầm phổ biến cho người mới bắt đầu. Trừ khi nội bộ tập lệnh có các thành phần phụ thuộc yêu cầu nó chạy trong một thư mục cụ thể (chẳng hạn như cần đọc một tệp dữ liệu mà tập lệnh không thể giải thích một cách khó hiểu là không cung cấp tùy chọn để trỏ đến), bạn sẽ không bao giờ cần phải cdchạy nó ở bất kỳ đâu và rất thường sẽ không muốn.
tripleee

24

Bạn có thể làm:
sh scriptname.sh


6
Phản đối: Điều đó sai nếu nó đúng là một tập lệnh Bash.
tripleee

1
Ủng hộ: Điều này tốt trên Mac OS X nếu tập lệnh bash của bạn nằm trong cùng một thư mục
Karl Taylor

30
@kot "Nó xảy ra để làm việc cho tôi" rất xa so với "đây là một câu trả lời chính xác". Nó có thể hoạt động nếu shlà một liên kết tượng trưng bashhoặc nếu tập lệnh không sử dụng bất kỳ cấu trúc dành riêng cho Bash nào. Trong trường hợp trước đây, sử dụng bashthay thế shlà giải pháp di động, chính xác duy nhất; trong trường hợp thứ hai, nó không phải là câu trả lời chính xác cho câu hỏi cụ thể này, bởi vì OP đã hỏi về lời khuyên cụ thể cho một tập lệnh Bash. Cho câu trả lời sai là vô trách nhiệm; những người dùng không nắm bắt được sự khác biệt thường đăng ở đây và cần được chỉ ra tại sao câu trả lời "phù hợp với tôi" này không phù hợp với họ.
tripleee

@kraftydevil cũng vậy ^ Một trong số các mục tiêu trùng lặp phổ biến về chủ đề này: stackoverflow.com/questions/5725296/…
tripleee

5
@kot Tôi nhắc lại: Có những tình huống mà điều này hoạt động (giống như bạn đã phát hiện ra) nhưng nó không phải là câu trả lời chính xác trong trường hợp chung cho câu hỏi trong tiêu đề. Ít nhất, câu trả lời này nên giải thích các điều kiện mà nó hoạt động; nhưng đề nghị của tôi sẽ chỉ là xóa câu trả lời này.
tripleee

14

Thứ nhất bạn phải làm cho nó thực thi sử dụng: chmod +x name_of_your_file_script.

Sau khi bạn thực thi nó, bạn có thể chạy nó bằng cách sử dụng ./same_name_of_your_file_script


10

Thay đổi thư mục của bạn thành nơi đặt tập lệnh bằng cách sử dụng lệnh cd

Sau đó gõ

bash program-name.sh

6
Không cần phải đi cdđâu cả; bạn có thể chỉ định một tên đường dẫn phức tạp tùy ý làm đối số cho bash; thực sự, bất kỳ chương trình nào có đối số tên tệp đều hoạt động theo cách này (hoặc thật đáng kinh ngạc, tê liệt).
tripleee

10

Đây là một chủ đề cũ, nhưng tôi đã tình cờ xem qua nó và tôi ngạc nhiên là chưa ai đưa ra câu trả lời hoàn chỉnh. Vì vậy, đây là ...

Hướng dẫn thực thi tập lệnh dòng lệnh!

Q: Làm cách nào để thực hiện điều này trong Terminal?

Xung đột và Xung đột:

  • Bạn không cần 'tiện ích mở rộng' (như .sh hoặc .py hoặc bất cứ thứ gì khác), nhưng nó giúp theo dõi mọi thứ. Nó sẽ không đau đâu. Tuy nhiên, nếu tên tập lệnh chứa phần mở rộng, bạn phải sử dụng nó.
  • Bạn không cần phải ở trong bất kỳ thư mục nhất định nào vì bất kỳ lý do gì.
  • Bạn không cần phải gõ ra tên của chương trình chạy tệp (BASH hoặc Python hoặc bất cứ thứ gì) trừ khi bạn muốn. Nó sẽ không đau đâu.
  • Bạn không cần sudophải làm bất kỳ điều này. Lệnh này được dành riêng để chạy lệnh với tư cách người dùng khác hoặc người dùng 'root' (quản trị viên). Bài viết tuyệt vời ở đây .

(Một người mới học cách thực thi các tập lệnh không nên sử dụng lệnh này trừ khi có nhu cầu thực sự, chẳng hạn như cài đặt một chương trình mới. Một nơi tốt để đặt các tập lệnh của bạn là trong thư mục ~ / bin. Bạn có thể đến đó bằng cách nhập cd ~/binhoặc cd $HOME/bintừ lời nhắc đầu cuối. Bạn sẽ có toàn quyền trong thư mục đó.)

Để "thực thi tập lệnh này" từ thiết bị đầu cuối trên hệ thống loại Unix / Linux, bạn phải thực hiện ba việc:

  1. Cho hệ thống biết vị trí của script. (chọn một)

    • Nhập đường dẫn đầy đủ với tên tập lệnh (ví dụ /path/to/script.sh:). Bạn có thể xác minh đường dẫn đầy đủ bằng cách nhập pwdhoặc echo $PWDtrong thiết bị đầu cuối.
    • Thực thi từ cùng một thư mục và sử dụng ./cho đường dẫn (ví dụ ./script.sh). Dễ dàng.
    • Đặt tập lệnh vào một thư mục trên hệ thống PATHvà chỉ cần nhập tên (ví dụ script.sh). Bạn có thể xác minh hệ thống PATHbằng cách nhập echo $PATHhoặc echo -e ${PATH//:/\\n}nếu bạn muốn một danh sách gọn gàng hơn.
  2. Cho hệ thống biết rằng tập lệnh có quyền thực thi. (chọn một)

    • Đặt "bit thực thi" bằng cách nhập chmod +x /path/to/script.shvào thiết bị đầu cuối.
    • Bạn cũng có thể sử dụng chmod 755 /path/to/script.shnếu bạn thích số. Có một cuộc thảo luận tuyệt vời với một biểu đồ thú vị ở đây .
  3. Cho hệ thống biết loại tập lệnh. (chọn một)

    • Nhập tên của chương trình trước tập lệnh. (ví dụ BASH /path/to/script.shhoặc PHP /path/to/script.php) Nếu tập lệnh có phần mở rộng, chẳng hạn như .php hoặc .py, thì nó là một phần của tên tập lệnh và bạn phải bao gồm nó.
    • Sử dụng shebang mà tôi thấy bạn có ( #!/bin/bash) trong ví dụ của bạn. Nếu bạn có đó là dòng đầu tiên của tập lệnh, hệ thống sẽ sử dụng chương trình đó để thực thi tập lệnh. Không cần gõ chương trình hoặc sử dụng phần mở rộng.
    • Sử dụng shebang "di động" . Bạn cũng có thể yêu cầu hệ thống chọn phiên bản của chương trình đầu tiên PATHbằng cách sử dụng, #!/usr/bin/envsau đó là tên chương trình (ví dụ #!/usr/bin/env bashhoặc #!/usr/bin/env python3). Có những ưu và khuyết điểm như được thảo luận kỹ lưỡng ở đây .

1
Tóm tắt khá hay. Có thể trong ví dụ cuối cùng nhắc nhở mọi người rằng script.shvà đó script.phplà tên tệp theo nghĩa đen của các tập lệnh này và nếu bạn đặt phần mở rộng vào tên tệp, bạn cần bao gồm nó khi bạn chạy tập lệnh (và ngược lại; nếu tập lệnh không ' t có một phần mở rộng, không đặt một phần mở rộng). Điều này không giống như DOS, nơi bạn có thể bỏ qua .bathoặc .exetừ tên tệp và các tệp cần có phần mở rộng từ một tập hợp nhỏ để được coi là có thể thực thi được.
tripleee

1
Một sai lầm phổ biến mới bắt đầu được hiểu lầm là sự khác biệt giữa path, /path, ./path, và ~/path. Tôi đoán bạn có thể không muốn giải thích nó ở đây, nhưng có thể liên kết đến một lời giải thích chẳng hạn như ... oh dang, tôi đã phải đăng cái này.
tripleee

1

Và một cách nữa

. /path/to/script

Ý nghĩa của dấu chấm là gì?


Điều này thực thi tập lệnh trong trình bao hiện tại, cần được gọi ra. Đây không phải là điều mà hầu hết mọi người mong đợi sẽ xảy ra khi bạn chỉ chạy một tập lệnh. Điều này có thể có tác dụng phụ đối với môi trường hiện tại của bạn.
Kỹ sư phần mềm

-2

Nếu bạn đang ở trong một thư mục hoặc thư mục có sẵn tệp script thì chỉ cần thay đổi quyền đối với tệp trong chế độ thực thi bằng cách

chmod +x your_filename.sh

Sau đó, bạn sẽ chạy tập lệnh bằng cách sử dụng lệnh sau.

$ sudo ./your_filename.sh

Phía trên "." đại diện cho thư mục hiện tại. Ghi chú! Nếu bạn không ở trong thư mục chứa tệp kịch bản bash thì bạn thay đổi thư mục chứa tệp bằng cách sử dụng

cd Directory_name/write the complete path

chỉ huy. Nếu không, tập lệnh của bạn không thể chạy.


Hy vọng đầy đủ tất cả sẽ làm được điều này vì tôi đề cập đến tất cả các khái niệm liên quan về vấn đề cụ thể này.
Hassan Shamshir

Như đã giải thích trong các câu trả lời khác ở đây, sudosai và có khả năng sai khủng khiếp nếu bạn sử dụng nó trên một tập lệnh không đáng tin cậy lạm dụng quyền hạn mà bạn không cần thiết cho nó.
tripleee

Lời khuyên cdở đâu đó thật khó hiểu, nhưng có lẽ cũng sai.
tripleee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.