4

我发现,LaunchCtl 在使用它的“提交”协议时会跳过参数。

我有以下脚本(script.sh):

#!/bin/bash
arg1="$1"
arg2="$2"
arg3="$3"
arg4="$4"
echo $arg1$arg2$arg3$arg4
exit 1

当我从终端调用 script.sh 时,将参数传递给它没有问题。当我通过 LaunchCtl 做同样的事情时,出现了问题,第一个参数消失了。

launchctl submit -l MyUniqueScript -p ROOT/script.sh -o ROOT/out.txt -e ROOT/err.txt "abc" "def" "ghi" "jkl"

我什至检查我的过程

launchctl list MyUniqueScript

我所有的论点都在那里。终端将它们打印出来。

{
"Label" = "MyUniqueScript";
"LimitLoadToSessionType" = "Background";
"OnDemand" = false;
"LastExitStatus" = 256;
"TimeOut" = 30;
"Program" = "/Users/ROOT/script.sh";
"StandardOutPath" = "/Users/ROOT/out.txt";
"StandardErrorPath" = "/Users/ROOT/err.txt";
"ProgramArguments" = (
    "abc";
    "def";
    "ghi";
    "jkl";
);
};

但是我在 out.txt 中的内容非常混乱:

defghijkl

而不是

abcdefghijkl

谁能帮我解决这个问题?有谁知道我应该做什么,或者我错了什么?

我还必须说,上面的小例子当然不是我正在处理的原始脚本。这更容易显示我的问题。

请帮我!谢谢!

4

1 回答 1

4

您的 launchctl 语法错误。第一个“参数”应该是脚本的路径:

launchctl submit -l MyUniqueScript -p ROOT/script.sh -o ROOT/out.txt -e ROOT/err.txt -- ROOT/script.sh "abc" "def" "ghi" "jkl"

从手册页:

提交 -l 标签 [-p 可执行文件] [-o 路径] [-e 路径] --命令[args]

-p设置似乎用于混叠,但我不确定为什么会有用

-p program 真正执行什么程序,不管提交子命令中的 -- 后面是什么

因此,在您的情况下,launchctl 将您的第一个参数视为要运行的脚本,但实际上是在运行您的脚本,因为您将其指定为带有-p. 如上所述,将脚本指定为 arg 0,或者只是删除-p规范并在其 args 之前包含脚本的路径。

于 2012-05-03T16:42:50.117 回答