2009-08-01 09:24:24 +0000 2009-08-01 09:24:24 +0000
60
60

如何在Mac OS中使用命令行参数运行应用程序?

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

$ /Applications/Opera.app/Contents/MacOS/Opera -kioskmode
$ /Applications/Firefox.app/Contents/MacOS/firefox -P profilename -no-remote

在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"

我可以把这些程序变成可执行程序,并指定一个图标,一切都很好,除了当我运行这些伪程序时,只要应用程序打开,终端窗口或Applescript图标就会一直打开。据推测,使用Applescript命令open可以避免这种情况,但由于我并没有运行打包后的应用程序(只是/Applications/Firefox),所以不起作用。

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

编辑

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

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

答案 (9)

30
30
30
2010-03-04 20:13:16 +0000

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

do shell script "open -a /Applications/Firefox.app --args -P default -no-remote"

这样你就能得到你想要的所有行为。

18
18
18
2009-08-01 11:56:26 +0000

这是我的最佳解决方案。创建一个Applescript

do shell script "/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote & killall Firefox.app"

然后保存为一个应用程序

你可以在第一部分放入任何应用程序和任何参数。&之后的部分需要杀死你给脚本+.app命名的任何程序。你会看到脚本应用程序在dock中闪烁,但随后会消失。

注意:当从脚本编辑器运行时,脚本不会正常工作,只有当从你创建的脚本应用程序中运行时,才会正常工作。

14
14
14
2011-01-22 13:04:27 +0000

打开Automator,用一个Run Shell Script动作创建一个Application

/Applications/Firefox.app/Contents/MacOS/firefox-bin -here-some-args &

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


另外,使用AppleScript Editor创建一个应用程序,其AppleScript代码如下。

do shell script "open -a '/Users/danielbeck/Applications/Firefox.app' --args -ProfileManager"

两种方式都能正常工作,而且不会让终端或脚本应用程序运行超过一秒左右。如果你选择使用Automator,你甚至可以创建一个Service

8
8
8
2011-03-13 03:59:54 +0000

在这种情况下,使用 killall (或类似的) 来杀死父 AppleScript 应用程序进程 (“applet”) 是没有必要的 (正如其他一些答案所建议的那样)。如果给killall的名称/模式不仅与父applet进程相匹配(例如,其他同时运行的AppleScript应用程序(如果使用 “applet "作为模式)),那么它甚至会产生不良的副作用。

类似kill $PPID的东西可能更合理,但我们可能不想假设AppleScript应用程序的applet总是由do shell script启动的shell的直接父进程。幸运的是,有一个完全合理的方法来实现你的需求。

根据 TN2065 (在 "我想启动一个后台服务器进程;如何使do shell脚本不等待命令完成?"下),正确的方法是重定向stdout和stderr,让shell在后台运行程序。

使用Script Editor将下面的程序保存为AppleScript应用程序。

do shell script ¬
    "/Applications/Firefox.app/Contents/MacOS/firefox-bin \
        -P default -no-remote \
        >/dev/null 2>&1 &"

(为了保持 "窄",添加了功能换行符;如果你愿意,可以删除¬\,并将其放在一个长行上)

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

重定向是必须的,因为do shell script不仅要等待它的直属子程序(shell)退出,而且还要等待它为shell的stdout和stderr创建的管道的可写端(所有实例)被关闭。shell的stdout和stderr(do shell script的管道)是由没有重定向的程序继承的(即使是在后台用&运行的程序也是如此);重定向确保了shell是最后一个持有管道的可写端。因此,do shell script将在shell退出后立即返回,允许AppleScript程序本身退出(因为do shell script是AppleScript程序的最后一个表达式)。

其他在do shell script内使用open的答案也能工作,因为open (实际上是LaunchServices)做了等同的工作,即对产生的程序进行后台处理,并将其stdout和stderr发送到其他地方。

8
8
8
2014-08-22 20:50:57 +0000

这是一个老的讨论,但仍然在Google搜索中出现,所以我想我应该补充几个¢。

使用 “bundle identifier "比使用可执行文件的绝对路径可能更好。

open -b com.google.Chrome --args --profile-directory="Profile 1"

或者在苹果脚本中:

do shell script "open -b com.google.Chrome --args --profile-directory='Profile 1'"

我还没弄明白的是,如果第一个实例/窗口已经打开,如何用不同的配置文件打开一个新的实例/窗口。如果我运行上面的 AppleScript,然后再运行另一个带有 "Profile 2 "的窗口,那么 Chrome 浏览器仍然会以 "Profile 1 "的方式打开另一个窗口) :(

4
4
4
2011-01-22 12:48:22 +0000

AppleScript

do shell script "/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --incognito & killall applet"

有两点。

1.空格由反斜线转义,再由反斜线转义 2. killall小程序会引起麻烦,因为可能有其他小程序在运行 3. 将其保存为程序

然而它在 10.6.5 上运行良好。

3
3
3
2009-08-01 10:30:41 +0000

下面应该可以让你为.app本身指定命令行参数。

右击.app bundle,选择 “显示包内容",导航到Info.plist,双击它,找到Args键,编辑。

我现在手头没有OS X机器,所以我无法确认你是否也可以对别名做这样的操作(如果你想保持原来的.app没有参数,等等)。

2
2
2
2011-03-22 19:32:58 +0000

将你的应用程序封装在AppleScript启动器中。

下面是步骤。

1.创建一个包含以下内容的AppleScript,并将其保存为一个应用程序(在本例中,它被命名为 “Firefox 3 launcher.app")。

  1. 在Finder中找到该应用,右击它,显示包内容。

  2. 把你的应用程序放在包内容的根目录下。(在这个例子中,它将是 "Firefox 3.app”)

4.你现在可以打开你的应用程序启动器了。现在你可以打开你的应用程序启动器了。

备注。

  • 在大多数情况下,封装的应用程序的自动更新应该是有效的。
  • 应该可以让任何拖放到启动器的程序自动重定向到被包装的应用程序(需要更多的脚本)。
  • 封装的应用程序启动后,启动器会自动退出。
  • 这种方法的一个好处是,直接打开被包装的应用程序的风险很小。
1
1
1
2019-03-29 23:38:35 +0000

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

open /Applications/TextEdit.app --args example.txt
```。