我发现,LaunchCtl在使用'submit'协议时会跳过参数。
我有以下脚本(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
任何人都可以帮我解决这个问题吗?有谁知道我应该做什么,或者我错了什么?
我还必须说,上面的小例子当然不是我正在处理的原始剧本。这更容易显示我的问题。
请帮帮我!谢谢!
答案 0 :(得分: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 path] [-e path] - 命令 [args]
-p
设置似乎是用于别名,但我不确定为什么会有用
- p 计划
无论如何,真正执行什么程序 - 在提交子命令中。
因此,在您的情况下,launchctl将您的第一个参数视为要运行的脚本,但实际上正在运行您的脚本,因为您将其指定为-p
的可执行文件。如上所述,将脚本指定为arg 0,或者只删除-p
规范并在其args之前包含脚本的路径。