2009-08-20 140 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

相关问题