Khởi chạy ứng dụng trên OS X bằng dòng lệnh


109

Tôi muốn khởi chạy một ứng dụng trên OSX từ một tập lệnh. Tôi cần chuyển nó đối số dòng lệnh. Thật không may, openkhông chấp nhận args dòng lệnh.

Tùy chọn duy nhất tôi có thể nghĩ đến là sử dụng nohup myApp > /dev/null &để khởi chạy ứng dụng của mình để ứng dụng có thể tồn tại độc lập với tập lệnh khởi chạy ứng dụng.

Bất kỳ đề xuất tốt hơn?


Tôi không thể theo dõi câu hỏi. "open" không chấp nhận args dòng lệnh? "Mở" là gì? Đây có phải là AppleScript đang mở không? Làm thế nào để nohup &giải quyết vấn đề?
S.Lott

4
người đàn ông mở (1) - OS X lệnh để các file khởi động hoặc ứng dụng
Ned Deily

3
Điều này nên được về superuser.com
Jeff Meatball Yang

Câu trả lời:


78

Trong OS X 10.6, openlệnh đã được cải tiến để cho phép truyền các đối số vào ứng dụng:

open ./AppName.app --args -AppCommandLineArg

Nhưng đối với các phiên bản Mac OS X cũ hơn và vì các gói ứng dụng không được thiết kế để chuyển đối số dòng lệnh, cơ chế thông thường là sử dụng Sự kiện của Apple cho các tệp như ở đây cho ứng dụng Cocoa hoặc tại đây cho ứng dụng Carbon. Bạn cũng có thể thực hiện một điều gì đó khó hiểu bằng cách chuyển các tham số bằng cách sử dụng các biến môi trường.


Cách tiếp cận kooly của tôi là gọi tệp thực thi trực tiếp với args dòng lệnh bằng cách sử dụng nohup - nếu môi trường-vars-k bùn ít hơn k bùn?
psychotik,

2
Chắc là không. Nếu nó phù hợp với bạn, hãy sử dụng nó. Điểm lớn hơn là open (1) tương đương với những gì xảy ra khi người dùng thực hiện nhấp đúp hoặc "Mở" trong Finder và không có cơ chế nào trong số đó hỗ trợ các đối số dòng lệnh thông thường.
Ned Deily

+1: Bạn không nên sử dụng các đối số dòng lệnh cho các ứng dụng GUI của Mac OS X.
S.Lott

2
yêu cầu google không sử dụng args dòng lệnh, Applications / Google Chrome.app/Contents/Versions/6.0.472.53/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper --type = renderer --lang = en-US - -force-fieldtest
Anurag Uniyal

@Anurag Uniyal. "Tại sao?" Bạn đã đọc câu trả lời? "cơ chế thông thường là sử dụng Sự kiện của Apple cho các tệp như ở đây cho ứng dụng Cocoa hoặc ở đây cho ứng dụng Carbon." Đó là cách Mac OS X được thiết kế. Đúng. Chrome phá vỡ các quy tắc. Mọi tiện ích dòng lệnh của Linux cũng vậy. Nhưng các ứng dụng GUI được mở open- như câu trả lời đã nói - không được thiết kế để hoạt động từ dòng lệnh. "Tại sao?" Bởi vì Mac OS X là như vậy.
S.Lott

105

Như đã đề cập trong câu hỏi ở đây , openlệnh trong 10.6 hiện có một argscờ, vì vậy bạn có thể gọi:

open -n ./AppName.app --args -AppCommandLineArg


Làm việc chính xác theo cách nó được yêu cầu. Cảm ơn
DTdev

Điều này đã hiệu quả và cho phép tôi đặt bí danh zsh cho Chromium. Cảm ơn
jamescampbell

Câu trả lời này là tuyệt vời. Chỉ muốn thêm rằng khi bạn mở Terminal lần đầu tiên, bạn sẽ ở trong thư mục chính của mình, vì vậy hãy nhập nó theo cách này để bạn không cần chuyển sang thư mục Ứng dụng. Tôi muốn chạy Gimp mà không cần nạp các phông chữ, trong đó có mãi mãi, vì vậy tôi gõ này với tham số -f để bỏ qua các phông chữ: mở -n /Applications/GIMP.app --args -f
James Toomey

32

Một gói ứng dụng (một .apptệp) thực sự là một loạt các thư mục. Thay vì sử dụng open.apptên, bạn thực sự có thể chuyển sang nó và bắt đầu nhị phân thực. Ví dụ:

$ cd /Applications/LittleSnapper.app/
$ ls
Contents
$ cd Contents/MacOS/
$ ./LittleSnapper

Đó là nhị phân thực tế có thể chấp nhận các đối số (hoặc không, trong LittleSnappertrường hợp của nó).


3
Hệ nhị phân chấp nhận các đối số, tôi chắc chắn. Tôi đã viết nó. Gọi 'mở' không cho phép truyền đối số. Tôi khá chắc chắn về điều này. Và có, tập lệnh của tôi đang gọi trực tiếp 'mã nhị phân mở', không phải cố gắng mở gói.
psychotik,

@psychotik: Anh ấy không nói gọi "mã nhị phân mở". Anh ấy nói rằng hãy trực tiếp thực thi nhị phân.
Chuck

Điều đó sẽ không hiệu quả với tôi. Thực hiện trực tiếp các kết quả nhị phân trong đó nó là một tiến trình con của tập lệnh của tôi, điều mà tôi chắc chắn không muốn. Do đó, nhu cầu sử dụng mở / nohup
psychotik

1
Nếu đó là một tập lệnh shell, hãy sử dụng 'execute' để thay thế quá trình tập lệnh bằng tập lệnh thực thi thực tế.
Jonathan Leffler

2
Cách tiếp cận này có một nhược điểm lớn: nếu gói chứa các thư viện tùy chỉnh và các khuôn khổ, bạn sẽ cần phải fiddle với DYLD_LIBRARY_PATH, DYLD_FRAMEWORK_PATH.
ulidtko

14

Trong trường hợp ứng dụng của bạn cần hoạt động trên các tệp (những gì bạn thường mong đợi chuyển là ./myApp *.jpg:), bạn sẽ làm như thế này:

open *.jpg -a myApp

Đây chính xác là những gì tôi đang tìm kiếm! Giả thuyết của tôi, ví dụ: open something.py -a Eclipse.app
Eric

4

Tôi muốn giới thiệu kỹ thuật mà MathieuK cung cấp. Trong trường hợp của tôi, tôi cần dùng thử với Chromium:

> Chromium.app/Contents/MacOS/Chromium --enable-remote-fonts

Tôi nhận ra điều này không giải quyết được vấn đề của OP, nhưng hy vọng nó tiết kiệm thời gian của người khác. :)


@Pacerier Thêm dấu `& 'vào cuối lệnh này. Nó sẽ khởi chạy trong nền. Sau đó, bạn có thể đóng cửa sổ đầu cuối của mình và ứng dụng có thể vẫn mở.
Paul Ailen

2

opencũng có cờ -a mà bạn có thể sử dụng để mở ứng dụng từ bên trong thư mục Ứng dụng theo tên của ứng dụng đó (hoặc bằng mã nhận dạng gói với cờ -b). Bạn có thể kết hợp tùy chọn này với tùy chọn --args để đạt được kết quả bạn muốn:

open -a APP_NAME --args ARGS

Để mở một video trong trình phát VLC sẽ mở rộng với hệ số 2x và vòng lặp, bạn sẽ lấy ví dụ:

open -a VLC --args -L --fullscreen

Lưu ý rằng tôi không thể nhận đầu ra của các lệnh tới thiết bị đầu cuối. (mặc dù tôi đã không cố gắng bất cứ điều gì để giải quyết điều đó)


Bạn có open -acố ý lặp lại không ?? Trong mọi trường hợp, open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir=/Users/an/userllkhông hiệu quả với tôi.
Pacerier

Xin lỗi, vì lý do nào đó cú pháp của tôi bị tắt hoàn toàn. Tôi sẽ cập nhật ngay bây giờ.
rien333

2

Tôi muốn có hai phiên bản Chrome riêng biệt đang chạy, mỗi phiên bản sử dụng cấu hình riêng. Tôi muốn có thể khởi động chúng từ Spotlight , cũng như thói quen khởi động ứng dụng Mac của tôi. Nói cách khác, tôi cần hai ứng dụng Mac thông thường, regChromeđể duyệt web bình thường và altChromesử dụng cấu hình đặc biệt, có thể dễ dàng khởi động bằng cách nhấn ⌘-space để hiển thị Spotlight, sau đó nhấn 'reg' hoặc 'alt' rồi Enter.

Tôi cho rằng cách brute-force để hoàn thành mục tiêu trên là tạo hai bản sao của gói ứng dụng Google Chrome dưới các tên tương ứng. Nhưng điều đó xấu và làm phức tạp việc cập nhật.

Những gì tôi kết thúc với là hai ứng dụng AppleScript chứa hai lệnh mỗi ứng dụng. Đây là cái dành cho altChrome:

do shell script "cd /Applications/Google\\ Chrome.app/Contents/Resources/; rm app.icns; ln /Users/garbuck/local/chromeLaunchers/Chrome-swirl.icns app.icns"
do shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --user-data-dir=/Users/garbuck/altChrome >/dev/null 2>&1 &"

Dòng thứ hai khởi động Chrome với cấu hình thay thế ( --user-data-dirtham số).

Dòng đầu tiên là một nỗ lực không thành công để cung cấp cho hai ứng dụng các biểu tượng riêng biệt. Ban đầu, nó có vẻ hoạt động tốt. Tuy nhiên, sớm hay muộn, Chrome sẽ đọc lại tệp biểu tượng của nó và nhận tệp biểu tượng tương ứng với bất kỳ ứng dụng nào trong hai ứng dụng được khởi động sau cùng, dẫn đến hai ứng dụng đang chạy có cùng biểu tượng. Nhưng tôi không bận tâm đến việc cố gắng sửa chữa nó - tôi giữ hai trình duyệt trên các máy tính để bàn riêng biệt và việc điều hướng giữa chúng không thành vấn đề.


2

Bắt đầu với OS X Yosemite , giờ đây chúng ta có thể sử dụng AppleScriptAutomator để tự động hóa các tác vụ phức tạp. JavaScript cho tự động hóa hiện có thể được sử dụng làm ngôn ngữ kịch bản.

Trang này đưa ra một tập lệnh ví dụ điển hình có thể được viết tại dòng lệnh bằng cách sử dụng chế độ tương tác bash và osascript . Nó mở một tab Safari và điều hướng đến example.com.

http://developer.telerik.com/featured/javascript-os-x-automation-example/
osascript -l JavaScript -i
Safari = Application("Safari");
window = Safari.windows[0];
window.name();
tab = Safari.Tab({url:"http://www.example.com"});
window.tabs.push(tab); 
window.currentTab = tab;

kiểm tra Script Editor / Window / Library để biết danh sách các ứng dụng có sẵn tính năng tự động hóa Applecript. Tôi đang tìm kiếm Vysor, dựa trên Chrome và tôi nghĩ mình cần một cách khác.
AnneTheAgile,

Sự phức tạp hơn ftw!
Pacerier

1

Với táo báo:

tell application "Firefox" to activate

Làm thế nào để bạn chuyển các đối số cho Firefox? Ví dụ: -no-remote -P "Một hồ sơ khác". Khi phát triển các tiện ích bổ sung và như vậy, thật tiện lợi khi có hai tiến trình Firefox riêng biệt sử dụng hai cấu hình riêng biệt. Hồ sơ thông thường của bạn và một hộp cát để gỡ lỗi tiện ích mở rộng của bạn.
George

Tôi tin rằng bạn đang đề cập đến một chỉ thị AppleScript, nhưng câu hỏi là về cách mở từ dòng lệnh ...
conny

0

Tại sao không chỉ đặt thêm đường dẫn vào thùng của ứng dụng. Đối với MacVim, tôi đã làm như sau.

export PATH=/Applications/MacVim.app/Contents/bin:$PATH

Một bí danh, là một tùy chọn khác mà tôi đã thử.

alias mvim='/Applications/MacVim.app/Contents/bin/mvim'
alias gvim=mvim 

Với PATH xuất, tôi có thể gọi tất cả các lệnh trong ứng dụng. Đối số đã vượt qua tốt cho thử nghiệm của tôi với MacVim. Trong khi bí danh, tôi phải đặt bí danh cho từng lệnh trong thùng.

mvim README.txt
gvim Anotherfile.txt

Tận hưởng sức mạnh của bí danh và PATH. Tuy nhiên, bạn cần theo dõi các thay đổi khi hệ điều hành được nâng cấp.


"Hãy nhớ MacOS dựa trên linux". Không, không, không phải, macOS và Linux không chia sẻ một dòng mã nào. MacOS là một UNIX có nhân dựa trên FreeBSD.
Thomas,

Sẽ thay đổi. Tôi không muốn tạo ra một cuộc chiến tôn giáo. Mục đích là để cho cộng đồng biết rằng có một số tùy chọn mạnh mẽ mà người dùng MacOS có thể sử dụng.
zerocog

Chắc chắn không có vấn đề! :)
Thomas

0

Đơn giản, ở đây thay thế "APP" bằng tên của ứng dụng bạn muốn khởi chạy.

export APP_HOME=/Applications/APP.app/Contents/MacOS
export PATH=$PATH:$APP_HOME

Cảm ơn tôi sau.


0

Bạn có thể khởi chạy ứng dụng bằng open:

open -a APP_YOU_WANT

Thao tác này sẽ mở ứng dụng mà bạn muốn.

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.