使用命令行在OS X上启动应用


108

我想通过脚本在OSX上启动应用程序。我需要通过命令行参数。不幸的是,open不接受命令行参数。

我能想到的唯一选择是用于nohup myApp > /dev/null &启动我的应用程序,以便它可以独立于启动它的脚本而存在。

还有更好的建议吗?


我不能理解这个问题。“打开”不接受命令行参数?什么是“开放”?这是AppleScript开放的吗?如何nohup &解决问题?
S.Lott

4
man open(1)
-OS

3
这应该在superuser.com上
Jeff Meatball Yang 2009年

Answers:


78

在OS X 10.6中,open命令得到了增强,可以将参数传递给应用程序:

open ./AppName.app --args -AppCommandLineArg

但对于旧版本的Mac OS X的,因为应用程序包不是用来传递命令行参数,传统的方法是使用Apple事件的文件喜欢这里的Cocoa程序或在这里为Carbon程序。您还可以通过使用环境变量传递参数来做一些麻烦的事情。


我的kludgey方法是使用nohup在命令行args中直接调用可执行文件-如果environment-vars-kludge少了kludgey?
psychotik

2
可能不是。如果它适合您,请选择它。更大的一点是,open(1)等同于用户在Finder中双击或“打开”时发生的情况,并且这些机制都不支持常规的命令行参数。
内德·迪利

+1:您不应该在Mac OS X GUI应用程序中使用命令行参数。
S.Lott

2
告诉Google不要使用命令行参数,Applications / Google Chrome.app/Contents/Versions/6.0.472.53/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper --type = renderer --lang = zh-CN- -force-fieldtest
Anurag Uniyal

@Anurag Uniyal。“为什么?” 你看了答案吗?“传统的机制是将Apple Events用于可可应用程序或Carbon应用程序的文件。” 这就是Mac OS X的设计方式。是。Chrome违反了规则。每个Linux命令行实用程序也是如此。但是,open如答案所示,打开的GUI应用程序并非旨在从命令行运行。“为什么?” 因为这就是Mac OS X的方式。
S.Lott 2010年

105

这里的问题所述open,10.6中的命令现在具有一个args标志,因此您可以调用:

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


完全按照要求的方式工作。谢谢
DTdev

这有效,并允许我为Chromium设置zsh别名。谢谢
jamescampbell's

这个答案很好。只是想补充一下,当您第一次打开Terminal时,您将位于主目录中,因此以这种方式键入它,因此您无需切换到Application目录。我想在不加载字体的情况下运行Gimp,这会花费很多时间,所以我用-f开关键入以忽略字体:open -n /Applications/GIMP.app --args -f
James Toomey

32

应用程序捆绑包(.app文件)实际上是一堆目录。除了使用open.app名称之外,您实际上可以移至其中并启动实际的二进制文件。例如:

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

那是实际的二进制文件,可能接受参数(在LittleSnapper情况下则不)。


3
我确定二进制文件接受参数。我写的。调用“ open”不允许传递参数。我对此很确定。是的,我的脚本直接调用“打开二进制文件”,而不是尝试打开捆绑软件。
psychotik

@psychotik:他不是在说“开放二进制”。他是说直接执行二进制文件。
Chuck

那对我不起作用。直接执行二进制文件会使它成为脚本的子进程,我绝对不希望这样做。因此,需要使用开放/ nohup
psychotik

1
如果它是Shell脚本,请使用'exec'将脚本进程替换为实际的可执行文件。
乔纳森·勒夫勒

2
这种方法的主要缺点是:如果捆绑包包含自定义库和框架,则需要弄乱DYLD_LIBRARY_PATHDYLD_FRAMEWORK_PATH
ulidtko 2012年

14

如果您的应用程序需要处理文件(通常希望通过以下方式传递:)./myApp *.jpg,则可以这样做:

open *.jpg -a myApp

这正是我在寻找的东西!我的实例,例如: open something.py -a Eclipse.app
Eric

4

我会推荐MathieuK提供的技术。就我而言,我需要与Chromium一起尝试:

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

我意识到这并不能解决OP的问题,但是希望可以节省其他人的时间。:)


@Pacerier在此命令的末尾添加一个&。它将在后台启动。然后,您可以关闭终端窗口,该应用程序可能仍会保持打开状态。
保罗·爱尔兰

2

open也有一个-a标志,您可以用它的名称(或带有-b标志的捆绑包标识符)从Applications文件夹中打开一个应用程序。您可以将其与--args选项结合使用以获得所需的结果:

open -a APP_NAME --args ARGS

要在VLC播放器中打开应以2倍缩放并循环播放的视频,您可以示例一下:

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

请注意,我无法将命令输出到终端。(尽管我没有尝试解决任何问题)


您是否open -a故意重复?无论如何, open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir=/Users/an/userll这对我不起作用。
Pacerier '17

请原谅,由于某种原因,我的语法完全不可用。我现在更新。
rien333

2

我想运行两个单独的Chrome实例,每个实例都使用自己的配置文件。我希望能够从Spotlight启动它们,这是我启动Mac应用程序的习惯。换句话说,我需要两个常规的Mac应用程序(regChrome用于正常浏览和altChrome使用特殊的配置文件),可以轻松地通过键入⌘-space来调出Spotlight,然后按“ reg”或“ alt”,然后按Enter来轻松启动。

我认为,实现上述目标的蛮力方式是使用相应名称制作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 。

第一行是尝试为两个应用程序提供不同图标的尝试,但未成功。最初,它似乎工作正常。但是,Chrome迟早会重新读取其图标文件,并获取与最后启动的两个应用程序中的任何一个相对应的图标文件,从而导致两个运行中的应用程序具有相同的图标。但是我没有费心去尝试修复它-我将两个浏览器都放在单独的桌面上,并且在它们之间导航并不是问题。


2

OS X Yosemite开始,我们现在可以使用AppleScriptAutomator来自动化复杂的任务。现在可以将自动化JavaScript用作脚本语言。

该页面提供了一个很好的示例脚本示例,可以使用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;

检查“脚本编辑器” /“窗口” /“库”以获取具有AppleScript自动化功能的应用程序列表。我一直在寻找基于Chrome的Vysor,我认为我需要一种不同的方式。
AnneTheAgile

更加复杂!
Pacerier '17

1

带有applescript:

tell application "Firefox" to activate

您如何将参数传递给Firefox?例如,-no-remote -P“另一个配置文件”。在开发附加组件等时,使用两个单独的配置文件拥有两个单独的Firefox进程非常方便。您的常规个人资料和用于调试扩展程序的沙箱。
乔治

我相信您指的是AppleScript指令,但是问题是关于从命令行打开...
conny

0

为什么不只是将添加路径设置为应用程序的bin。对于MacVim,我执行了以下操作。

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

别名是我尝试的另一种选择。

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

使用导出路径,我可以调用应用程序中的所有命令。对于MacVim的测试,参数通过得很好。别名,我必须对bin中的每个命令都使用别名。

mvim README.txt
gvim Anotherfile.txt

享受别名和PATH的强大功能。但是,在升级操作系统时,您确实需要监视更改。


“记住MacOS是基于linux的”。不,不,不是,macOS和Linux不共享一行代码。MacOS是具有基于FreeBSD内核的UNIX。
托马斯,

会改变。我不想发动一场宗教战争。目的是让社区知道MacOS用户可以使用一些强大的选项。
zerocog

好没问题!:)
Thomas

0

很简单,在这里用您要启动的应用程序名称替换“ APP”。

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

待会儿谢谢


0

您可以使用open以下方式启动应用程序:

open -a APP_YOU_WANT

这应该打开所需的应用程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.