2009-08-20 168 views
90

我想從腳本啓動OSX上的應用程序。我需要傳遞它的命令行參數。不幸的是,open不接受命令行參數。使用命令行在OS X上啓動應用程序

我能想到的唯一選擇是使用nohup myApp > /dev/null &啓動我的應用程序,以便它可以獨立於啓動它的腳本而存在。

有什麼更好的建議嗎?

+0

我不能跟隨這個問題。 「打開」不接受命令行參數?什麼是「開放」?這是AppleScript打開嗎? 'nohup&'如何解決問題? – 2009-08-20 21:03:30

+4

man open(1) - OS X命令來啓動文件或應用程序 – 2009-08-20 21:22:43

+3

這應該在superuser.com – 2009-10-18 02:04:02

回答

58

在OS X 10.6中,open命令增強,允許的參數傳遞給應用程序:

open ./AppName.app --args -AppCommandLineArg 

但對於舊版本的Mac OS X的,因爲應用程序包沒有被設計成傳遞命令行參數,傳統的機制是將Apple Events用於像here這樣的文件用於Cocoa應用程序或here用於Carbon應用程序。你也可以通過使用環境變量傳遞參數來做一些kludgey。

+0

我的kludgey方法是使用nohup直接使用命令行參數調用可執行文件 - 如果環境變量 - kludge減少kludgey? – psychotik 2009-08-20 21:31:55

+2

可能不是。如果它對你有用,就去吧。更大的一點是open(1)是當用戶在Finder中進行雙擊或「打開」時發生的情況的等價物,並且這些機制都不支持傳統的命令行參數。 – 2009-08-20 21:52:02

+0

+1:您不應該使用Mac OS X GUI應用程序的命令行參數。 – 2009-08-21 01:53:17

29

應用程序包(一個.app文件)實際上是一堆目錄。而不是使用open.app名稱,您可以實際移動到它並啓動實際的二進制文件。例如:

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

也就是說實際的可執行文件,可能會接受參數(或不,在LittleSnapper的情況下)。

+3

二進制接受參數,我相信。我寫的。調用'open'不允許傳遞參數。我很確定這一點。 是的,我的腳本直接調用'打開二進制',而不是試圖打開這個包。 – psychotik 2009-08-20 21:05:45

+0

@psychotik:他不是說打開二進制文件。他說要直接執行二進制文件。 – Chuck 2009-08-20 21:22:13

+0

這對我不起作用。直接執行二進制結果是我的腳本的一個子進程,我絕對不想這樣做。因此,需要使用open/nohup – psychotik 2009-08-20 21:24:58

4

我會推薦MathieuK提供的技術。就我而言,我需要用鉻來試試吧:

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

我知道這並不能解決OP的問題,但希望這樣可以節省別人的時間。 :)

+0

但您需要保持終端打開... – Pacerier 2017-12-15 16:14:25

+0

@Prier將'&'添加到此命令的末尾。它將在後臺啓動。然後,您可以關閉終端窗口,應用程序可能仍會保持打開狀態。 – 2017-12-19 01:01:59

98

如問題here所提到的,在10.6 open命令現在有一個args標誌,所以你可以撥打:

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

+0

完全按照要求的方式工作。謝謝 – Durgesh 2013-11-04 10:08:21

+0

這工作,並允許我爲Chromium設置zsh別名。謝謝 – jamescampbell 2015-09-03 00:47:04

+0

這個答案很好。只是想補充一點,當你第一次打開終端時,你將會進入你的主目錄,所以你可以這樣輸入,所以你不需要切換到Application目錄。我想在不加載字體的情況下運行Gimp,因此我使用-f開關鍵入以省略字體:open -n /Applications/GIMP.app --args -f – 2015-11-21 15:38:59

1

使用AppleScript:

tell application "Firefox" to activate 
+0

如何將參數傳遞給Firefox ?例如,-no-remote -P「另一個配置文件」。在開發附加組件等時,使用兩個單獨的配置文件有兩個獨立的Firefox進程是很方便的。您的正常配置文件和一個用於調試擴展的沙箱。 – George 2014-01-29 00:27:06

+0

我相信你指的是一個AppleScript指令,但問題是關於從命令行打開... – conny 2017-06-07 08:43:30

13

在如果你的應用需要處理文件(你通常希望通過的文件是:./myApp *.jpg),你可以這樣做:

open *.jpg -a myApp 
+0

這是我正在尋找的!我的實例,例如:'打開something.py - 一個Eclipse.app' – Eric 2014-09-12 21:52:28

1

我希望有兩個獨立的Chrome運行實例,每個實例都使用自己的配置文件。我希望能夠從Spotlight開始,因爲我的習慣是啓動Mac應用程序。換句話說,我需要兩個普通的Mac應用程序,regChrome用於正常瀏覽,altChrome用於使用特殊配置文件,通過鍵入⌘-space以調出Spotlight,然後輸入'reg'或'alt',輕鬆啓動。

我認爲完成上述目標的蠻力方法是在相應的名稱下製作Google Chrome應用程序包的兩個副本。但這很醜陋,並且更新複雜。

我最終得到的是兩個AppleScript應用程序,每個應用程序包含兩個命令。下面是一個用於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 &" 

第二行與所述替代的概況(所述--user-data-dir參數)開始鉻。

第一行是嘗試給兩個應用程序截然不同的圖標。最初,它似乎工作正常。不過,Chrome遲早會重新讀取其圖標文件,並獲取與上次啓動的兩個應用程序相對應的圖標文件,從而導致兩個具有相同圖標的正在運行的應用程序。但我沒有試圖修復它 - 我將兩個瀏覽器放在不同的桌面上,並且在它們之間導航並不成問題。

+0

Mac是搞砸了。隔離和沙箱是基本的可用性,安全性和健壯性原則。無論如何,爲什麼不使用'open --args'工作?使用'do shell script'是唯一的方法嗎? – Pacerier 2017-12-15 16:21:05

2

OS X Yosemite開始,我們現在可以使用AppleScriptAutomator來自動完成複雜的任務。用於自動化的JavaScript現在可以用作腳本語言。

This page gives a good example example script可以使用bash和osascript交互模式在命令行寫入。它打開一個Safari標籤並導航到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; 
+0

檢查腳本編輯器/窗口/庫以獲取可用的AppleScript自動化應用程序列表。我一直在尋找基於Chrome的Vysor,我想我需要一種不同的方式。 – AnneTheAgile 2016-10-18 16:59:44

+0

ftw更復雜! – Pacerier 2017-12-15 16:15:42

1

open也有一個-a標誌,你可以用它來從內部打開一個應用程序應用程序文件夾的名稱(或通過包標識符與-b標誌)。你可以用--args選項一起使用能達到的效果你想:

open -a APP_NAME --args ARGS 

要開拓VLC播放的影片,應該用因數2x和循環你會如exectute規模:

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

請注意,我無法將命令輸出到終端。 (雖然我沒有試圖解決這個問題)

+0

你有沒有重複'打開-a'故意?無論如何,'open -a/Applications/Google \ Chrome.app/Contents/MacOS/Google \ Chrome --args --user-data-dir =/Users/an/userll'不適用於我。 – Pacerier 2017-12-15 16:17:54

+0

對不起,我的語法因爲某種原因完全關閉。我現在更新。 – rien333 2017-12-15 18:00:39

相關問題