如何将命令行参数传递给使用 open 命令运行的程序?

问题描述 投票:0回答:5

有没有办法将参数传递给正在运行的程序:

open -a /Applications/Utilities/Terminal.app ~/my_executable

我已经尝试过:

open -a /Applications/Utilities/Terminal.app ~/my_executable arg1 arg2

但这被解释为告诉终端打开

~/my_executable ~/arg1 ~/arg2.

我已经尝试过:

open -a /Applications/Utilities/Terminal.app '~/my_executable arg1 arg2'

但是它会选取 arg1 和 arg2,就好像它们是路径的一部分而不是参数一样。

我已经尝试过:

open -a /Applications/Utilities/Terminal.app ~/my_executable | xargs arg1 arg2

我也尝试过:

open -a /Applications/Utilities/Terminal.app ~/my_executable --args arg1 arg2

但是使用该标志,参数将被传递到终端。

注意

我只能更改 Terminal.app 的参数([ ] 内的部分):

open -a /Applications/Utilities/Terminal.app [~/my_executable arg1 arg2]
macos bash
5个回答
23
投票

可能最简单的方法是创建一个临时 shell 脚本,例如

$ echo "~/my_executable arg1 arg2" > /tmp/tmp.sh ; chmod +x /tmp/tmp.sh ; open -a Terminal /tmp/tmp.sh ; rm /tmp/tmp.sh

22
投票

编辑:留下下面的原始答案,因为有些人似乎觉得它很有用,但请记住,这并不能真正回答OP的问题,这是将参数传递给使用

open
打开的应用程序,而不是传递给应用程序使用 Terminal.app 打开,该应用程序使用
open
打开。

您可以通过运行不带参数的

open
来找到答案:

% open  Usage: open [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-b <bundle identifier>] [-a <application>] [filenames] [--args arguments]

[...]

          --args        All remaining arguments are passed in argv to the application's main() function instead of opened.

[...]

你可以看到有一个选项

--args
你可以这样使用它:

open ./Untitled.app --args arg1 arg2 arg3

我在 el Capitan (10.11.3) 上测试了它,所以我不知道该选项是否存在于早期版本中。


1
投票

是的,我知道。需要管理另一个脚本。 但想法不同。您不是在终端上工作,而是在脚本编辑器上工作。 (不是 bash 脚本,而是 AppleScript)

property testScript : "/tmp/sh.sh"

set input to display dialog "args?" default answer ""
log input
tell application "Terminal"
    activate
    do script testScript & " " & text returned of input
end tell

1
投票

对于那些对 Paul R 的答案有疑问的人,请将

; rm /tmp/tmp.sh
添加到 tmp.sh 脚本本身。不要添加像 Maksim 这样的睡眠命令,因为这会产生竞争条件。

echo "~/my_executable arg1 arg2 ; rm /tmp/tmp.sh" > /tmp/tmp.sh ; chmod +x /tmp/tmp.sh ; open -a Terminal /tmp/tmp.sh

0
投票

在参数之前使用

--args
开关。

open ./Terminal.app --args --your-args

来自文档:

--args: All remaining arguments are passed in argv to the application's main() function instead of opened.

© www.soinside.com 2019 - 2024. All rights reserved.