You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Perl中依次执行带dzdo的两个脚本遇报错,求解决方案

问题解决:Perl中使用dzdo依次执行两个脚本失败

我需要在Perl中通过类sudo工具dzdo,先成功执行/home/user1/script1.pl,再运行/home/user1/script2.pl。手动在终端执行dzdo -iHu admin /home/user1/script1.pl ; dzdo -iHu admin /home/user1/script2.pl时两个脚本都能正常运行,但在Perl里尝试多种写法都出问题:

尝试过的写法及问题

写法1

cmd="dzdo -iHu admin /home/user1/script1.pl && dzdo -iHu admin /home/user1/script2.pl";

写法2

cmd="dzdo -iHu admin "/home/user1/script1.pl" ; "/home/user1/script2.pl"";

写法3

cmd="dzdo -iHu admin /home/user1/script1.pl" && "dzdo -iHu admin /home/user1/script2.pl";

写法4

cmd="dzdo -iHu admin "/home/user1/script1.pl ; /home/user1/script2.pl"";

写法5

cmd="$cmd1 && $cmd2";

写法6

cmd="${cmd1} && ${cmd2}";

所有上述写法均报错:Unknown option: ihu。

另外单独定义命令变量:

cmd1="dzdo -iHu admin /home/user1/script1.pl";
cmd2="dzdo -iHu admin /home/user1/script2.pl";

结果仅第二个脚本运行,第一个完全不执行。

问题根源

  • 直接拼接字符串执行时,若未通过shell解析,dzdo的合并短选项-iHu会被当成单个长选项-ihu,导致参数解析错误,触发Unknown option: ihu。
  • 单独定义变量后未正确调用执行第一个命令,导致只有第二个脚本被运行。

正确解决方案

方案1:通过shell执行完整命令串

使用Perl的system()函数传入完整shell命令,让shell处理&&的逻辑判断和参数解析:

# 确保第一个脚本执行成功后才运行第二个
system('dzdo -iHu admin /home/user1/script1.pl && dzdo -iHu admin /home/user1/script2.pl');

&&会检查第一个命令的退出码,只有当退出码为0(执行成功)时,才会执行第二个命令。

方案2:分两次调用system,手动判断结果

拆分dzdo的短选项,分别执行两个命令,通过$?获取退出码判断执行结果:

# 执行第一个脚本,拆分短选项避免解析错误
system('dzdo', '-i', '-H', '-u', 'admin', '/home/user1/script1.pl');
# 判断第一个命令是否执行成功(退出码为0)
if ($? == 0) {
    # 执行第二个脚本
    system('dzdo', '-i', '-H', '-u', 'admin', '/home/user1/script2.pl');
}

这种写法更安全,避免shell解析带来的问题,还能在第一个命令失败时添加自定义错误处理逻辑。

方案3:用qx//捕获输出(若需获取命令输出)

如果需要捕获脚本的执行输出,可使用反引号或qx//,同时判断执行结果:

my $script1_output = qx/dzdo -iHu admin /home/user1/script1.pl/;
if ($? == 0) {
    my $script2_output = qx/dzdo -iHu admin /home/user1/script2.pl/;
    # 处理输出
}

内容的提问来源于stack exchange,提问作者Prakash Somasundaram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:35:31