如何在 Mac OS 中运行带有命令行参数的应用程序

And*_*rew 70 mac script command-line

有没有什么简单的方法可以将命令行参数附加到 Mac 上的应用程序?例如,要在 kiosk 模式下运行 Opera 或在 Firefox 中使用不同的配置文件,我可以输入

$ /Applications/Opera.app/Contents/MacOS/Opera -kioskmode
$ /Applications/Firefox.app/Contents/MacOS/firefox -P profilename -no-remote
Run Code Online (Sandbox Code Playgroud)

在 Windows 中,我可以将参数附加到快捷方式属性,但由于 Mac 本身不使用快捷方式并直接运行应用程序,因此这是不可能的。

我发现通过 bash 或 Applescript 启动应用程序部分有效:

# Bash
#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote

# Applescript    
do shell script "exec /Applications/Opera.app/Contents/MacOS/Opera -kioskmode"
Run Code Online (Sandbox Code Playgroud)

我可以使这些可执行文件并分配一个图标,一切都很好,除了当我运行这些伪程序中的任何一个时,只要应用程序打开,终端窗口或 Applescript 图标就会保持打开状态。据推测,使用 Applescript 命令open可以避免这种情况,但是由于我没有在打包时运行该应用程序(只是/Applications/Firefox),所以它不起作用。

那么,有没有更好的方法来运行带有命令行参数的应用程序?如果没有,有没有办法防止持久的终端会话或 Applescript 图标在应用程序打开时保持打开状态?

编辑

根据Mozilla Wiki 页面,最好使用脚本来运行带参数的应用程序。&在脚本末尾添加 a会终止持久的终端窗口。现在唯一的烦恼是它打开了一个死的、注销的终端窗口(这比持久的要好,但仍然......)

#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote &
Run Code Online (Sandbox Code Playgroud)

Bob*_*Bob 37

从 OS X 10.6.2 开始, open 命令可以通过 --args 标志将参数传递给它打开的应用程序。使用它的 AppleScript 如下所示:

do shell script "open -a /Applications/Firefox.app --args -P default -no-remote"
Run Code Online (Sandbox Code Playgroud)

这应该给你你想要的所有行为。

  • 我在 Chrome 中尝试了“--args”,但它不起作用。它仅适用于**第一个实例**。如果您尝试同时运行两个“--user-data-dir”,则无法使用“open”来执行此操作,而必须通过旧的“/applications...”方法来运行它。有人知道为什么“--args”不起作用吗? (2认同)
  • @Pacerier,“打开-n” (2认同)

MJe*_*yes 21

这是我最好的解决方案:创建一个 Applescript:

do shell script "/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote & killall Firefox.app"
Run Code Online (Sandbox Code Playgroud)

并且将其保存为一个应用程序

您可以在第一部分中放置带有任何参数的任何应用程序。后面的部分&需要杀死您命名脚本 + .app 的任何内容。您会看到脚本应用程序在 Dock 中闪烁,但随后会消失。

注意:从脚本编辑器运行时,脚本将无法正常运行,只有从您创建的脚本应用程序运行时才能正常运行。

  • @Pacerier 检查此答案的日期。 (2认同)

Dan*_*eck 18

打开Automator并使用单个Run Shell Script操作创建一个应用程序

 /Applications/Firefox.app/Contents/MacOS/firefox-bin -here-some-args &
Run Code Online (Sandbox Code Playgroud)

此应用程序将启动 Firefox 并立即退出,只留下 Firefox 运行。


或者,使用AppleScript 编辑器和以下 AppleScript 代码创建应用程序:

do shell script "open -a '/Users/danielbeck/Applications/Firefox.app' --args -ProfileManager"
Run Code Online (Sandbox Code Playgroud)

两者都可以正常工作,并且不会让终端或脚本应用程序运行超过一秒钟左右。使用 Automator,您甚至可以选择创建服务

  • 请记住,正如 Bob 已经提到的,`open --args` 是在 10.6.2 中实现的。 (2认同)

ecn*_*nai 17

open命令有一个可选--args参数,该参数的值将作为参数传递到打开的应用程序。例如:

open /Applications/TextEdit.app --args example.txt
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案。 (2认同)
  • 这仍然是正确的答案。 (2认同)

小智 9

这是一个古老的讨论,但仍然会出现在 Google 搜索中,所以我想我会添加一些 ¢。

使用“包标识符”而不是可执行文件的绝对路径可能更好:

open -b com.google.Chrome --args --profile-directory="Profile 1"
Run Code Online (Sandbox Code Playgroud)

或者在 Apple 脚本中:

do shell script "open -b com.google.Chrome --args --profile-directory='Profile 1'"
Run Code Online (Sandbox Code Playgroud)

我还没有想出的是,一旦第一个实例/窗口已经打开,如何使用不同的配置文件打开一个新实例/窗口。(如果我运行上面的 AppleScript,然后运行另一个“配置文件 2”,那么 Chrome 仍然会打开另一个窗口作为“配置文件 1”)。:(


Chr*_*sen 8

在这种情况下,没有必要(如其他一些答案所建议的那样)使用killall(或类似方法)来终止父 AppleScript 应用程序进程(“applet”)。如果提供给killall的名称/模式不仅仅匹配父小程序进程(例如,其他并发运行的 AppleScript 应用程序(如果使用“小程序”作为模式)),它甚至可能会产生不利的副作用。

likekill $PPID可能更合理,但我们可能不想假设 AppleScript 应用程序的小程序始终是由do shell script启动的 shell 的直接父级。幸运的是,有一种完全合理的方法可以满足您的需求。

根据TN2065(在“我想启动后台服务器进程;如何让 shell 脚本不等到命令完成?”),正确的方法是重定向 stdout 和 stderr 并让 shell 在后台运行程序.

使用脚本编辑器将以下程序保存为 AppleScript 应用程序:

do shell script ¬
    "/Applications/Firefox.app/Contents/MacOS/firefox-bin \\
        -P default -no-remote \\
        >/dev/null 2>&1 &"
Run Code Online (Sandbox Code Playgroud)

(添加功能换行符,以保持它“窄”;删除¬\\并把它全部在一个长行,如果你喜欢)

它将运行足够长的时间来启动Firefox,并且会在Firefox继续运行时干净地退出。

重定向是必需的,因为shell 脚本不仅等待其直接子进程(shell)退出,而且还等待(所有实例)它为 shell 的 stdout 和 stderr 创建的管道的可写端关闭. shell 的 stdout 和 stderr(do shell script的管道)由它运行的程序继承而无需重定向(即使是在后台运行的程序&);重定向确保外壳是最后一个保存管道可写端的外壳。因此,do shell script将在 shell 退出后立即返回,从而允许 AppleScript 应用程序本身退出(因为do shell script是 AppleScript 程序中的最后一个表达式)。

在内部使用open的其他答案可以运行shell 脚本,因为open(实际上是 LaunchServices)所做的工作相当于将结果程序置于后台并将其 stdout 和 stderr 发送到其他地方。

  • 我知道这个方法在10.4中有效。我的印象是 *do shell script* 总是这样工作(它被添加到 [AppleScript 1.7](http://developer.apple.com/library/mac/#releasenotes/AppleScript/ 中的 *Standard Additions* OSAX) RN-AppleScript/RN-10_1/RN-10_1.html%23//apple_ref/doc/uid/TP40000982-CH101-SW13),随 Mac OS X 10.1 一起提供)。如果您愿意假设 10.6,那么 `open --args` 可能就可以了。 (2认同)