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)
这应该给你你想要的所有行为。
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 中闪烁,但随后会消失。
注意:从脚本编辑器运行时,脚本将无法正常运行,只有从您创建的脚本应用程序运行时才能正常运行。
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,您甚至可以选择创建服务。
ecn*_*nai 17
该open
命令有一个可选--args
参数,该参数的值将作为参数传递到打开的应用程序。例如:
open /Applications/TextEdit.app --args example.txt
Run Code Online (Sandbox Code Playgroud)
小智 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”)。:(
在这种情况下,没有必要(如其他一些答案所建议的那样)使用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 发送到其他地方。
归档时间: |
|
查看次数: |
186513 次 |
最近记录: |