【问题标题】:How to launch an app on OS X with command line - The best way使用命令行在 OS X 上启动应用程序
【发布时间】:2010-11-21 11:30:58
【问题描述】:

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

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

有更好的建议吗?

【问题讨论】:

  • 我听不懂这个问题。 “open”不接受命令行参数?什么是“开放”?这是 AppleScript 打开吗? nohup & 是如何解决问题的?
  • man open(1) - OS X 命令来启动文件或应用程序
  • 这应该在 superuser.com 上

标签: macos


【解决方案1】:

正如问题here 中提到的,10.6 中的open 命令现在具有args 标志,因此您可以调用:

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

【讨论】:

  • 完全按照要求的方式工作。谢谢
  • 这很有效,让我可以为 Chromium 设置一个 zsh 别名。谢谢
  • 这个答案很棒。只是想补充一点,当你第一次打开终端时,你将在你的主目录中,所以这样输入,这样你就不需要切换到应用程序目录。我想在不加载字体的情况下运行 Gimp,这需要很长时间,所以我用 -f 开关输入这个以省略字体: open -n /Applications/GIMP.app --args -f
【解决方案2】:

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

open ./AppName.app --args -AppCommandLineArg

但是对于旧版本的 Mac OS X,并且由于应用程序包不是为传递命令行参数而设计的,因此传统的机制是使用 Apple Events 来处理文件,例如 Cocoa 应用程序的 here 或 Cocoa 应用程序的 here碳应用程序。您还可以通过使用环境变量传递参数来做一些笨拙的事情。

【讨论】:

  • 我的 kludgey 方法是使用 nohup 使用命令行参数直接调用可执行文件 - 如果 environment-vars-kludge 不那么 kludgey?
  • 可能不会。如果它对你有用,那就去吧。更重要的一点是 open(1) 相当于用户在 Finder 中双击或“打开”时发生的情况,并且这些机制都不支持常规命令行参数。
  • +1:您不应该对 Mac OS X GUI 应用程序使用命令行参数。
  • 告诉谷歌不要使用命令行参数,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。 “为什么?”你读过答案吗? “传统的机制是使用 Apple 事件来处理文件,例如此处用于 Cocoa 应用程序或此处用于 Carbon 应用程序。”这就是 Mac OS X 的设计方式。是的。 Chrome 打破了规则。每个 Linux 命令行实用程序也是如此。但是,使用open 打开的 GUI 应用程序——正如答案所说——不是为从命令行工作而设计的。 “为什么?”因为 Mac OS X 就是这样。
【解决方案3】:

应用程序包(.app 文件)实际上是一个目录。除了使用open.app 文件名,您可以移动到应用程序的目录并启动位于其中的实际机器代码程序。例如:

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

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

【讨论】:

  • 二进制接受参数,我敢肯定。我写的。调用“open”不允许传递参数。我很确定这一点。是的,我的脚本直接调用“打开二进制文件”,而不是试图打开包。
  • @psychotik:他并不是说要调用“开放二进制”。他的意思是直接执行二进制文件。
  • 这对我不起作用。直接执行二进制文件会导致它成为我脚本的子进程,我绝对不想要。因此,需要使用 open/nohup
  • 如果是shell脚本,使用'exec'将脚本进程替换为实际的可执行文件。
  • 这种方法有一个主要缺点:如果包包含自定义库和框架,您将需要摆弄DYLD_LIBRARY_PATHDYLD_FRAMEWORK_PATH
【解决方案4】:

如果您的应用需要处理文件(您通常期望传递为:./myApp *.jpg),您可以这样做:

open *.jpg -a myApp

【讨论】:

  • 这正是我要找的!我的实例化,例如:open something.py -a Eclipse.app
  • 这个答案对我有用。我的情况是使用Numbers打开文件:open -a numbers filenanme.tsv
【解决方案5】:

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

open -a APP_YOU_WANT

这应该会打开您想要的应用程序。

【讨论】:

  • 如果我想处理 'ls' 命令怎么办。运行“open -a ls”给我一个错误提示 - 无法找到名为“ls”的应用程序。当 app_you_want 不是文件或应用程序时该怎么做。
【解决方案6】:

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

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

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

【讨论】:

  • @Pacerier 在此命令的末尾添加一个`&`。它将在后台启动。然后,您可以关闭终端窗口,该应用程序可能仍会保持打开状态。
【解决方案7】:

open 也有一个 -a 标志,您可以使用它从 Applications 文件夹中通过其名称(或通过带有 -b 标志的捆绑标识符)打开应用程序。您可以将其与 --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 对我不起作用。
  • 对不起,由于某种原因,我的语法完全关闭了。我马上更新。
【解决方案8】:

我希望运行两个独立的 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。

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

【讨论】:

    【解决方案9】:

    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;
    

    【讨论】:

    • 检查脚本编辑器 / 窗口 / 库以获取具有 AppleScript 自动化功能的应用程序列表。我一直在寻找基于 Chrome 的 Vysor,我认为我需要一种不同的方式。
    • 更复杂的ftw!
    【解决方案10】:

    使用苹果脚本:

    tell application "Firefox" to activate
    

    【讨论】:

    • 如何将参数传递给 Firefox?例如,-no-remote -P “另一个配置文件”。在开发附加组件等时,使用两个单独的配置文件让两个单独的 Firefox 进程很方便。您的正常配置文件和用于调试扩展程序的沙箱。
    • 我相信您指的是 AppleScript 指令,但问题是关于从命令行打开...
    【解决方案11】:

    当您可以简单地访问 Applications 文件夹并输入时,会有很多复杂的答案:

    打开 -a [应用程序名称]

    就是这样!

    【讨论】:

      【解决方案12】:

      为什么不将添加路径设置到应用程序的 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
      

      享受别名和路径的力量。但是,您确实需要在操作系统升级时监控更改。

      【讨论】:

      • “记住 MacOS 是基于 linux 的”。不,不,不是,macOS 和 Linux 不共享一行代码。 MacOS 是一个基于 FreeBSD 内核的 UNIX。
      • 会改变。我不想制造一场宗教战争。目标是让社区知道 MacOS 用户可以使用一些强大的选项。
      • 当然,没问题! :)
      【解决方案13】:

      简单,这里把“APP”换成你要启动的应用的名字。

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

      稍后谢谢我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-08
        • 1970-01-01
        • 2011-03-09
        • 2017-03-28
        • 2016-01-18
        • 2017-07-29
        • 2016-05-30
        • 1970-01-01
        相关资源
        最近更新 更多