我想从脚本中启动OSX上的应用程序。我需要传递命令行参数。不幸的是,open
不接受命令行参数。
我能想到的唯一选择是使用nohup myApp > /dev/null &
来启动我的应用,以便它可以独立于启动它的脚本而存在。
有更好的建议吗?
答案 0 :(得分:100)
如问题here中所述,10.6中的open
命令现在有一个args
标记,因此您可以调用:
open -n ./AppName.app --args -AppCommandLineArg
答案 1 :(得分:67)
在OS X 10.6中,open
命令已得到增强,允许将参数传递给应用程序:
open ./AppName.app --args -AppCommandLineArg
但是对于旧版本的Mac OS X,并且因为app bundle不是为了传递命令行参数而设计的,所以传统的机制是对{C>应用程序使用Apple Events这样的文件使用here或{/ 3}}适用于Carbon应用。你也可以通过在使用环境变量中传递参数来做一些事情。
答案 2 :(得分:32)
应用程序包(.app
文件)实际上是一堆目录。您可以实际移入它并启动实际的二进制文件,而不是使用open
和.app
名称。例如:
$ cd /Applications/LittleSnapper.app/
$ ls
Contents
$ cd Contents/MacOS/
$ ./LittleSnapper
这是可能接受参数的实际二进制文件(或不在LittleSnapper
的情况下)。
答案 3 :(得分:14)
如果您的应用需要处理文件(您通常希望传递的内容为:./myApp *.jpg
),您可以这样做:
open *.jpg -a myApp
答案 4 :(得分:4)
我会推荐MathieuK提供的技术。就我而言,我需要使用Chromium进行尝试:
> Chromium.app/Contents/MacOS/Chromium --enable-remote-fonts
我意识到这并不能解决OP的问题,但希望能节省别人的时间。 :)
答案 5 :(得分:2)
从OS X Yosemite开始,我们现在可以使用AppleScript和Automator来自动完成复杂的任务。用于自动化的JavaScript现在可以用作脚本语言。
This page gives a good example example script可以使用bash和osascript交互模式在命令行中编写。它会打开Safari选项卡并导航到example.com
。
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;
答案 6 :(得分:2)
Log.i(CATCH, Ja, e);
还有一个-a标志,您可以使用它来在Applications文件夹中按名称(或使用-b标志的包标识符)打开应用程序。您可以将它与--args选项结合使用以获得所需的结果:
open
要在VLC播放器中打开一个视频,该视频应该以2倍的比例缩放并循环,例如exectute:
open -a APP_NAME --args ARGS
请注意,我无法将命令输出到终端。 (虽然我没有尝试任何解决方法)
答案 7 :(得分:1)
使用applescript:
tell application "Firefox" to activate
答案 8 :(得分:1)
我希望运行两个独立的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迟早会重新读取其图标文件并获取与最后启动的两个应用程序中的任何一个相对应的图标文件,从而导致两个正在运行的应用程序具有相同的图标。但我并没有费心去尝试修复它 - 我将两个浏览器放在不同的桌面上,在它们之间导航并不是问题。
答案 9 :(得分:1)
您可以使用open
启动应用程序:
open -a APP_YOU_WANT
这应该打开所需的应用程序。
答案 10 :(得分: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的强大功能。但是,您确实需要在操作系统升级时监视更改。
答案 11 :(得分:0)
简单,在此将“ APP”替换为您要启动的应用的名称。
export APP_HOME=/Applications/APP.app/Contents/MacOS
export PATH=$PATH:$APP_HOME
稍后谢谢我。