在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
相关产品推荐
相关产品推荐

