Làm cách nào tôi có thể chạy một ứng dụng với các đối số dòng lệnh trong Mac OS


60

Có cách nào dễ dàng để nối các đối số dòng lệnh vào một ứng dụng trên máy Mac không? Ví dụ: để chạy Opera ở chế độ kiosk hoặc sử dụng cấu hình khác trong Firefox, tôi có thể nhập

$ /Applications/Opera.app/Contents/MacOS/Opera -kioskmode
$ /Applications/Firefox.app/Contents/MacOS/firefox -P profilename -no-remote

Trong Windows, tôi có thể nối các đối số vào các thuộc tính phím tắt, nhưng vì máy Mac không sử dụng phím tắt mỗi lần và chạy các ứng dụng trực tiếp, nên điều này là không thể.

Tôi đã thấy rằng việc khởi chạy các ứng dụng thông qua bash hoặc Applescript hoạt động một phần:

# Bash
#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote

# Applescript    
do shell script "exec /Applications/Opera.app/Contents/MacOS/Opera -kioskmode"

Tôi có thể làm cho các tệp thực thi này và gán một biểu tượng và mọi thứ đều hoạt động tốt ngoại trừ khi tôi chạy một trong các chương trình giả này, cửa sổ đầu cuối hoặc biểu tượng Applescript vẫn mở miễn là ứng dụng được mở. Có lẽ, sử dụng lệnh Applescript opensẽ tránh được điều này, nhưng vì tôi không chạy ứng dụng vì nó được đóng gói (chỉ /Applications/Firefox), nên nó không hoạt động.

Vì vậy, có cách nào tốt hơn để chạy các ứng dụng với các đối số dòng lệnh? Nếu không, có cách nào để ngăn phiên cuối liên tục hoặc biểu tượng Applescript không mở trong khi ứng dụng đang mở không?

Biên tập

Theo trang Mozilla Wiki , tốt nhất nên sử dụng tập lệnh để chạy ứng dụng với các đối số. Thêm một &vào cuối tập lệnh sẽ giết chết cửa sổ Terminal liên tục. Điều khó chịu duy nhất bây giờ là nó mở một cửa sổ Terminal đã chết, đã đăng xuất (tốt hơn cửa sổ liên tục, nhưng vẫn ...)

#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote &

2
Tôi vẫn hy vọng câu trả lời tốt hơn cho câu hỏi này ...
cregox

Khi bạn chạy một công việc với &nó vẫn thuộc về Terminal, bạn có thể khắc phục điều đó bằng cách thêm dòng disown %/Applications/Firefox.app/Contents/MacOS/firefox sau khi bạn chạy nó, sau đó bạn có thể đóng Terminal một cách an toàn, sử dụng AppleScript.
ocodo

hãy tìm câu trả lời của Daniel - nó hoàn chỉnh và hoàn hảo nhất cho ngày hôm nay (OSX 10.6.2 +).
cregox

Câu trả lời:


17

Đây là giải pháp tốt nhất của tôi: Tạo một Applescript với:

do shell script "/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote & killall Firefox.app"

lưu nó dưới dạng một ứng dụng .

Bạn có thể đặt bất cứ ứng dụng nào với bất kỳ đối số nào trong phần đầu tiên. Phần sau khi &cần phải giết bất cứ thứ gì bạn đã đặt tên cho tập lệnh của mình + .app. Bạn sẽ thấy ứng dụng tập lệnh bật lên trong dock, nhưng sau đó nó sẽ biến mất.

Lưu ý: Tập lệnh sẽ không hoạt động chính xác khi chạy từ Trình chỉnh sửa tập lệnh, chỉ khi chạy từ ứng dụng tập lệnh mà bạn đã tạo.


Nó gần như hoạt động. Nó vẫn đang chờ phiên bản Firefox được thực hiện cho đến khi nó chạy killall, vì vậy nó gọi trình gỡ lỗi khi tôi đóng Firefox và ứng dụng tập lệnh vẫn không biến mất. Hmmm ...
Andrew

Lạ nhỉ. Bạn đang lưu nó dưới dạng Ứng dụng rồi nhấp đúp vào Ứng dụng? Nó sẽ không hoạt động khi chạy từ Script Editor.
MJeffryes

Ngoài ra, tôi nhận thấy tôi đặt một dòng mới trước &. Xóa dòng mới nếu bạn có nó
MJeffryes

không cần & killall ở đây tại Snow Leopard 10.6.x - nhưng cũng không thể tìm ra cách nào để làm cho ứng dụng tự hủy ngay khi thực thi.
cregox

1
@Pacerier Kiểm tra ngày trên câu trả lời này.
MJeffryes

28

Bắt đầu trong OS X 10.6.2, lệnh mở có thể truyền các đối số cho ứng dụng mà nó mở bằng cờ --args. Một AppleScript để sử dụng nó trông như thế này:

do shell script "open -a /Applications/Firefox.app --args -P default -no-remote"

Điều đó sẽ cung cấp cho bạn tất cả các hành vi bạn muốn.


"Người đàn ông mở", và nó đây! làm việc như người ở. --args cờ và sau đó là đối số của bạn.
Michael Dimmitt

1
Tôi đã thử --argsvới Chrome và nó không hoạt động. Nó sẽ chỉ hoạt động cho ví dụ đầu tiên . Nếu bạn cố gắng chạy hai --user-data-dirđồng thời, bạn không thể thực hiện được openmà phải chạy theo /applications...phương thức cũ . Bất cứ ai cũng biết tại sao quái --args không hoạt động?
Pacerier

1
@Pacerier, "open -n"
Simon Wright

Để thêm vào điều này, bạn có thể tạo tập lệnh trong Script Editor và sau đó lưu dưới dạng ứng dụng.
Kevin C.

11

Mở Automator và tạo một Ứng dụng chỉ với một hành động Run Shell Script :

 /Applications/Firefox.app/Contents/MacOS/firefox-bin -here-some-args &

Ứng dụng này sẽ khởi chạy Firefox và thoát ngay lập tức, chỉ còn Firefox chạy.


Hoặc, tạo một ứng dụng bằng AppleScript Editor với mã AppleScript sau:

do shell script "open -a '/Users/danielbeck/Applications/Firefox.app' --args -ProfileManager"

Cả hai đều hoạt động tốt và không giữ cho Terminal hoặc ứng dụng tập lệnh chạy quá một giây hoặc lâu hơn. Sử dụng Automator, bạn thậm chí có thể tạo Dịch vụ nếu bạn chọn như vậy.


1
Chỉ cần ghi nhớ open --argsđã được thực hiện trong 10.6.2, như Bob đã đề cập.
cregox

Sử dụng nó cho: open eclipse.app -nđể mở một không gian làm việc Eclipse thứ hai. Rất tiện dụng. Cảm ơn!
jonalv

Không thể làm cho nó hoạt động trong Automator với hành động "Run Shell Script" trong MacOS 10.14. Tôi cuối cùng đã thành công với AppleScript.
Kevin C.

8

Đây là một cuộc thảo luận cũ, nhưng vẫn xuất hiện trên các tìm kiếm của Google, vì vậy tôi nghĩ rằng tôi đã thêm một vài.

Có lẽ tốt hơn là sử dụng "định danh gói" thay vì đường dẫn tuyệt đối đến tệp thực thi:

open -b com.google.Chrome --args --profile-directory="Profile 1"

Hoặc trong Tập lệnh Apple:

do shell script "open -b com.google.Chrome --args --profile-directory='Profile 1'"

Điều tôi chưa tìm ra là làm thế nào để mở một cá thể / cửa sổ mới với một cấu hình khác sau khi cái đầu tiên đã được mở. (Nếu tôi chạy AppleScript ở trên, thì một cái khác có "Hồ sơ 2", thì Chrome vẫn sẽ chỉ mở một cửa sổ khác là "Hồ sơ 1"). :(


Là -b có chức năng bằng -a? Họ khác nhau như thế nào?
Pacerier

7

Không cần thiết (như một số câu trả lời khác đã đề xuất) sử dụng killall (hoặc tương tự) để tiêu diệt quy trình ứng dụng AppleScript gốc (trong ứng dụng táo bạo) trong kịch bản này. Nó thậm chí có thể có các tác dụng phụ không lường trước được nếu tên / mẫu được đặt cho killall không chỉ khớp với quá trình applet cha mẹ (ví dụ, các ứng dụng AppleScript chạy đồng thời (nếu sử dụng ứng dụng appletet làm mẫu)).

Một cái gì đó giống như kill $PPIDcó thể hợp lý hơn, nhưng chúng tôi có thể không muốn giả định rằng applet của ứng dụng AppleScript luôn là cha mẹ trực tiếp của shell được bắt đầu bằng cách thực hiện shell script . May mắn thay, có một cách hoàn toàn hợp lý để làm những gì bạn cần.

Theo TN2065 (dưới đây, tôi muốn bắt đầu một quy trình máy chủ nền; làm cách nào để tạo tập lệnh shell không đợi cho đến khi lệnh hoàn thành?,), Phương pháp thích hợp là chuyển hướng stdout và stderr và để shell chạy chương trình trong nền .

Sử dụng Script Editor để lưu chương trình sau dưới dạng ứng dụng AppleScript:

do shell script ¬
    "/Applications/Firefox.app/Contents/MacOS/firefox-bin \\
        -P default -no-remote \\
        >/dev/null 2>&1 &"

(ngắt dòng chức năng bổ sung để giữ cho nó “hẹp”; xóa ¬\\và đặt nó trên cùng một dòng dài nếu bạn thích)

Nó sẽ chạy đủ lâu để khởi động Firefox và sẽ thoát sạch trong khi Firefox tiếp tục chạy.

Việc chuyển hướng là bắt buộc vì không chỉ kịch bản shell chờ cho con ngay lập tức của nó thoát ra mà còn chờ (tất cả các trường hợp) các đầu có thể ghi của các đường ống mà nó tạo ra cho thiết bị xuất chuẩn và stderr của shell được đóng lại . Thiết bị xuất chuẩn và thiết bị xuất chuẩn của shell ( làm cho các tập lệnh shell script ) được kế thừa bởi các chương trình mà nó chạy mà không chuyển hướng (ngay cả các chương trình chạy trong nền với &); chuyển hướng đảm bảo rằng vỏ là cái cuối cùng giữ các đầu có thể ghi của ống. Do đó, tập lệnh shell sẽ quay trở lại ngay sau khi thoát khỏi trình bao, cho phép chính ứng dụng AppleScript thoát ra (vì tập lệnh shell là biểu thức cuối cùng trong chương trình AppleScript).

Các câu trả lời khác sử dụng open bên trong do shell script hoạt động vì open (thực ra là LaunchService) thực hiện công việc tương đương làm nền cho chương trình kết quả và gửi thiết bị xuất chuẩn và thiết bị xuất chuẩn của nó ở nơi khác.


điều này rất thú vị Tôi tự hỏi nếu nó hoạt động trước ngày 10.6.2 ... nhưng tôi vẫn nghĩ sử dụng có open --argsvẻ sạch hơn. Có bất kỳ hạn chế về việc sử dụng bất kỳ trong số họ?
cregox

1
Tôi biết phương pháp này hoạt động trong 10,4. Ấn tượng của tôi là tập lệnh shell luôn hoạt động như thế này (nó đã được thêm vào OSAX bổ sung tiêu chuẩn trong AppleScript 1.7 , đi kèm với Mac OS X 10.1). Nếu bạn sẵn sàng giả định 10.6, thì open --argscó lẽ là ổn.
Chris Johnsen

@ChrisJohnsen, Liên kết xuống ........
Pacerier

4

AppleScript

do shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --incognito & killall applet"

Hai điểm đó.

  1. Không gian được thoát bằng dấu gạch chéo ngược được thoát bằng dấu gạch chéo ngược một lần nữa
  2. applet killall có thể gây rắc rối, bởi vì có thể các applet khác đang chạy
  3. Lưu nó dưới dạng chương trình

Tuy nhiên, nó hoạt động tốt trên 10.6.5


appletđề cập đến?
Pacerier

3

Sau đây sẽ cho phép bạn chỉ định các đối số dòng lệnh cho chính .app:

Nhấp chuột phải vào gói .app, chọn "Hiển thị nội dung gói", điều hướng đến Info.plist, nhấp đúp vào nó, tìm khóa đối số, chỉnh sửa.

Hiện tại tôi không có máy OS X tiện dụng, vì vậy tôi không thể kiểm tra xem bạn cũng có thể làm điều này với bí danh hay không (nếu bạn muốn giữ bản gốc .app không có đối số, et cetera).


Thật không có chìa khóa args trong plist, thật không may. Theo Mozilla, bạn phải sử dụng tập lệnh - wiki.mozilla.org/MailNews:Logging#Mac
Andrew

Cũng lưu ý rằng việc thay đổi nội dung gói (như Info.plist) có thể gây ra sự cố khi ký mã: Bridge.grumpy-troll.org/2011/01/ Kẻ
drevicko

2

Gói ứng dụng của bạn bên trong trình khởi chạy AppleScript.

Dưới đây là các bước.

  1. Tạo một AppleScript có nội dung sau và lưu nó dưới dạng một ứng dụng (trong ví dụ này, nó có tên là "Firefox 3 launcher.app").

    set pathToApp to (POSIX path of (path to me)) & "Firefox 3.app"
    do shell script "open -a \"" & pathToApp & "\" --args -P default -no-remote"
    
  2. Có ứng dụng đó trong Finder, nhấp chuột phải vào nó, hiển thị nội dung gói.

  3. Đặt ứng dụng của bạn vào thư mục gốc của nội dung gói. (Trong ví dụ này, nó sẽ là "Firefox 3.app")

    Kết quả: / Ứng dụng / Firefox 3. launcher.app/Firefox 3.app

  4. Bây giờ bạn có thể mở launcher ứng dụng của bạn.

Ghi chú:

  • Cập nhật tự động của ứng dụng được bao bọc sẽ hoạt động trong hầu hết các trường hợp.
  • Có thể thực hiện bất kỳ thao tác kéo và thả nào đến trình khởi chạy tự động chuyển hướng đến ứng dụng được bao bọc (với kịch bản nhiều hơn một chút).
  • Trình khởi chạy sẽ tự động thoát sau khi ứng dụng được bao bọc được khởi chạy.
  • Một lợi thế của phương pháp này là có ít rủi ro khi mở ứng dụng được gói trực tiếp.

1

Tại sao bạn không sử dụng:

#!/bin/sh
open /Applications/Firefox.app

Đơn giản nhưng nó hoạt động.


2
Thiết bị đầu cuối sẽ mở nếu bạn làm điều đó.
MJeffryes

0

Các openlệnh có một tùy chọn --argstham số đó là giá trị sẽ được chuyển cho các ứng dụng mở như các đối số. Ví dụ:

open /Applications/TextEdit.app --args example.txt
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.