Làm cách nào để chạy tập lệnh shell trong OS X bằng cách nhấp đúp?


233

Tôi có một tập lệnh shell có quyền thực thi người dùng trên OS X, nhưng khi tôi nhấp đúp vào nó, nó sẽ mở ra trong một trình soạn thảo văn bản. Làm thế nào tôi có thể làm cho nó chạy bằng cách nhấp đúp vào nó?

Câu trả lời:


266
  • Đầu tiên trong terminal làm cho tập lệnh thực thi bằng cách gõ:

    chmod a+x (yourscriptname)
  • Sau đó, trong Finder, nhấp chuột phải vào tệp của bạn và chọn "Mở bằng" và sau đó "Khác ...".

  • Ở đây bạn chọn ứng dụng bạn muốn tập tin thực thi, trong trường hợp này nó sẽ là Terminal. Để có thể chọn thiết bị đầu cuối, bạn cần chuyển từ "Ứng dụng được đề xuất" sang "Tất cả ứng dụng". (Có thể tìm thấy ứng dụng Terminal.app trong thư mục Tiện ích)

  • LƯU Ý rằng trừ khi bạn không muốn liên kết tất cả các tệp với tiện ích mở rộng này để được chạy trong thiết bị đầu cuối, bạn không nên kiểm tra "Luôn mở với".

  • Sau khi nhấp vào OK, bạn sẽ có thể thực thi tập lệnh của mình bằng cách nhấp đúp vào tập lệnh.

cảm ơn tôi đã nhận nó, tôi không biết liên kết với thiết bị đầu cuối, tôi nghĩ cần phải liên kết với / bin / sh
c2h2

22
Tôi không thể tìm thấy Terminal.app trong danh sách cho đến khi tôi nhận ra rằng tôi phải tìm trong thư mục "Tiện ích". Hy vọng điều này sẽ giúp ai đó tiết kiệm thời gian.
Glenn Lawrence

27
Trên OSX 10.8 và cao hơn, một kịch bản thực thi có tên có hoặc không có hậu tố hoặc hậu tố .commandtheo mặc định thực thi từ Finder, mà không cần phải hướng dẫn Finder làm thế nào để mở nó.
mkuity0

1
"Tất cả các ứng dụng" là cài đặt tôi đã thiếu ... có lẽ là những gì Cheruvim đã trải nghiệm. Đối với nhận xét của Glenn: bạn chỉ cần sử dụng tính năng Tìm kiếm tích hợp ở góc trên bên phải của cửa sổ; đảm bảo bạn nhập tên đầy đủ của ứng dụng, tức là Terminal.app.
đàn anh

3
Không phải là cách sạch sẽ để làm điều đó. Đổi tên tập lệnh của bạn thành .commandphần mở rộng tập tin.
Bachsau

227

Bạn đã thử sử dụng .commandphần mở rộng tên tệp?


3
Điều này tốt hơn. Trong câu trả lời @Lus, thư mục làm việc không giống như bạn mở tập lệnh.
Rodrigo

6
Có cách nào để khởi chạy các tác vụ "nền" không có cửa sổ giao diện điều khiển không?
lapo

6
Xin lưu ý rằng thư mục hiện tại có thể không phải là tập lệnh của bạn. Hãy xem câu hỏi này để đặt đúng: stackoverflow.com/questions/59895/ Lỗi
Pavel Alexeev

14
Bạn vẫn cần phải có quyền thực thi ( chmod +x) nhưng .commandtiện ích mở rộng đã được liên kết với Terminal. Giải pháp tuyệt vời, cảm ơn bạn
NorTicUs

Rõ ràng người dùng không thể tương tác với chương trình đầu cuối bằng phương pháp này - trừ khi tôi nhầm?
Demis

153

Kể từ OSX 10.10 (Yosemite) và vì ít nhất là OS X 10.8 (Mountain Lion) , hành vi như sau khi bạn mở (nhấp đúp) các tập lệnh thực thi từ Finder :

  • Thực thi các kịch bản [1] với một trong hai NO hậu tố hoặc hậu tố.command :
    • được thực thi theo mặc định - không yêu cầu thiết lập :
      • một cửa sổ Terminal mới mở trong đó tập lệnh chạy.
      • theo mặc định, cửa sổ sẽ vẫn mở sau khi tập lệnh kết thúc để bạn có thể kiểm tra đầu ra (mặc dù tại thời điểm đó, lớp vỏ chạy tập lệnh đã thoát và bạn không thể tương tác với nó nữa ).
        Tuy nhiên, thông qua Terminal, Preferences... > Profilesbạn có thể chọn tự động đóng cửa sổ khi tập lệnh thoát.
    • Hãy cẩn thận : thư mục làm việc luôn luôn thư mục nhà của người dùng hiện tại , KHÔNG phải là thư mục chứa tập lệnh.
      • Để thực hiện thay đổi tập lệnh shell vào thư mục chứa nó, hãy đặt
        • cd -- "$(dirname "$BASH_SOURCE")" ngay sau dòng shebang
        • hoặc, nếu bạn phải duy trì tuân thủ POSIX , cd -- "$(dirname "$0")".
        • Đối với các trường hợp cạnh, chẳng hạn như tìm thư mục nguồn thực sự của tập lệnh symlinked , hãy xem câu trả lời này của tôi.
    • Nếu tập lệnh bất ngờ không thể thực thi :
      • Làm cho nó thực thi được bằng cách chạy chmod +x <script>trong Terminal; nếu không, bạn sẽ thấy các triệu chứng sau:
      • .command: Finder hiển thị thông báo lỗi gây hiểu lầm cho thấy sự cố có thể được khắc phục thông qua File > Get Info, điều này không đúng - sử dụngchmod +x phương pháp được đề xuất ở trên.
      • không có hậu tố:
        • với một dòng shebang (ví dụ, #!/bin/bash): hành vi như thể hậu tố là .sh- xem bên dưới.
        • với không dòng công việc: mở ra trong trình soạn thảo văn bản mặc định của bạn (đó là TextEdit theo mặc định).
  • Các tập lệnh có hậu tố.sh , có thể thực thi được hay không:
    • được mở để chỉnh sửa trong TextEdit.apphoặc, nếu được cài đặt, với Xcode.app.
  • Các tập lệnh có hậu tố.scpt hoặc .applescript(ngay cả khi chính chúng được đánh dấu là có thể thực thi được, điều này thường không xảy ra):
    • mở để chỉnh sửa trong[Apple]Script Editor
    • Lưu ý rằng các tệp mã nguồn JXA dường như không có hậu tố riêng biệt (chưa).
  • Kịch bản với một tùy chỉnh suffix (hậu tố chưa biết đến hệ thống), cho dù thực thi hay không (trên thực tế, áp dụng cho bất kỳ loại tập tin):
    • nhắc bạn cho ứng dụng mở chúng khi bạn mở chúng lần đầu nhớ lựa chọn đó .

[1] Có nghĩa là có thể thực thi : một tập lệnh với (các) bit quyền thực thi được đặt và người dùng gọi - liên quan đến quyền sở hữu đối với tệp - do đó có khả năng được phép thực thi nó.
Nếu bạn sử dụng chmod a+xđể đặt tất cả các bit quyền (thông thường), bất kỳ ai cũng có thể gọi nó (giả sử họ cũng được phép đọc tệp dựa trên (các) bit quyền đọc và quyền sở hữu tệp).


1
Có thể đóng cửa sổ Terminal đã mở khi tập lệnh thoát với một thao tác đơn giản osascriptmà bạn có thể đưa vào trong .commandtệp thay vì làm rối thủ công hồ sơ.
Tôi sẽ là

@ Tôi sẽ: Bạn có nghĩa là thêm một osascript -e '...'lệnh vào cuối tập lệnh của một người? Lệnh cụ thể là gì và nó có đảm bảo rằng tab bên phải được đóng ngay cả khi tập lệnh không chạy trong tab ngoài cùng không?
mkuity0

5
@ mkuity0: Có, tôi đã không thử nó hơn một vài phút, nhưng ý tưởng cơ bản là đưa vào dòng cuối cùng của tập lệnh .command : osascript -e 'tell application "Terminal" to close front window' > /dev/null 2>&1 &... Nó có thể không hoạt động trong mọi kịch bản, mặc dù chuyển hướng tại end thực sự là chìa khóa - osascript có thể được điều chỉnh dễ dàng (ví dụ: cửa sổ có thể cần phải được thay đổi thành tab nếu đó là hành vi mặc định của thiết bị đầu cuối của bạn, v.v.).
Tôi sẽ là

Có thể không để cửa sổ / tab Terminal đóng sau khi .commandtệp script được chạy mặc dù cài đặt cấu hình?
CyberMew

@CyberMew: Nếu bạn có thể sửa đổi tập lệnh, hãy thêm một lệnh chờ gõ phím ở cuối; ví dụ: nếu đó là bashtập lệnh, hãy thêm read -p 'Press Return to close this window.'vào như câu lệnh cuối cùng.
mkuity0

38

Ngoài ra, bạn có thể tạo một ứng dụng Mac OS X thông thường từ tập lệnh của mình bằng Platypus


Đây là một ứng dụng thực sự tuyệt vời. Nhưng tôi có một số vấn đề ở đây. Tôi có một tập lệnh python mà tôi muốn chuyển đổi thành tệp .app. Tập lệnh của tôi bao gồm một dòng mà người dùng phải nhập một số đầu vào (raw_input ()), khi .app đạt đến dòng mã này, nó sẽ xuất hiện lỗi EOF (cuối tệp). Tôi có thể làm gì với nó?

1
Nó không phải là một thiết bị đầu cuối tương tác. Thú mỏ vịt chỉ đơn thuần trình bày đầu ra kịch bản. Không có giao tiếp hai chiều.
svth

4
Hoặc tạo ứng dụng OS X bằng Automator bằng hành động Run Shell Script.
Rangi Keen

15

Cách dễ dàng là thay đổi phần mở rộng thành .command hoặc không có phần mở rộng.

Nhưng điều đó sẽ mở Terminal và bạn sẽ phải đóng nó. Nếu bạn không muốn thấy bất kỳ đầu ra nào, bạn có thể sử dụng Automator để tạo Ứng dụng Mac mà bạn có thể nhấp đúp, thêm vào dock, v.v.

  1. Mở Automator ứng dụng
  2. Chọn loại "Ứng dụng"
  3. Nhập "chạy" trong hộp Tìm kiếm hành động
  4. Nhấp đúp chuột vào "Run Shell Script"
  5. Nhấp vào Runnút ở góc trên bên phải để kiểm tra nó.
  6. File > Save để tạo Ứng dụng.

nhập mô tả hình ảnh ở đây


Tuyệt quá ! Làm thế nào chúng ta có thể tự động hóa quy trình công việc này để chạy hàng ngày lúc 1 giờ chiều?
iAkshay

9

Không cần sử dụng các ứng dụng của bên thứ ba như Thú mỏ vịt.

Chỉ cần tạo Tập lệnh Apple bằng Trình do shell script "shell commands"chỉnh sửa tập lệnh và sử dụng lệnh cho các lệnh gọi trực tiếp hoặc tập tin tập lệnh shell thực thi, giữ tập tin tập lệnh có thể chỉnh sửa an toàn ở đâu đó sau đó xuất tập tin đó để tạo tập lệnh Ứng dụng. tập lệnh ứng dụng có thể khởi chạy bằng cách nhấp đúp hoặc chọn trong thư mục thanh.


3
Thậm chí tốt hơn, sử dụng Automator và sử dụng trực tiếp hành động Run Shell Script thay vì đi qua Apple Script.
Rangi Keen

0

Bạn cũng có thể đặt mặc định theo phần mở rộng tệp bằng RCDefaultApp:

http://www.rubicode.com/Software/RCDefaultApp/

có khả năng bạn có thể đặt .sh để mở trong iTerm / Terminal, v.v. nó sẽ cần quyền thực thi của người dùng, vd

chmod u+x filename.sh

Cửa sổ trước RCDefaultApp


0

chmod 774 filename

Lưu ý : Tệp có tên 'tên tệp' có tập lệnh bash không có phần mở rộng

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.