无法通过Perl的IPC::System::Simple向systemx传递命令行选项
问题原因与解决方案:IPC::System::Simple的systemx参数传递错误
你的问题出在参数传递的方式上:systemx要求每个命令行参数(包括选项、选项值、目标命令)都作为独立的列表元素传递,而不是把多个选项打包成一个字符串。
你当前的代码把所有gtime选项塞进了单个字符串$opt里,systemx会把这个完整字符串当作gtime的第二个参数——也就是gtime要执行的命令,而不是选项。这就导致gtime试图运行一个名为 -a -f %e\t%U\t%S\t%P\t%M\t%c\t%w\t%F\t%R -o hostname.log的文件,自然会提示"找不到文件或目录"。
修正后的代码
把gtime的选项拆分成独立的列表元素,每个选项和对应的参数都单独作为systemx的参数:
#!/usr/local/bin/perl use v5.40; use strict; use utf8; use warnings; use IPC::System::Simple qw(systemx); # set executable name my $exe = 'hostname'; # set GNU time command my $time = "/opt/local/bin/gtime"; # set log file name my $ofile = $exe . '.log'; # 拆分gtime选项为独立元素 my @time_opts = ( '-a', '-f', '%e\t%U\t%S\t%P\t%M\t%c\t%w\t%F\t%R', '-o', $ofile, ); systemx($time, @time_opts, $exe);
为什么这样有效
systemx的调用逻辑是:第一个参数是要执行的命令,后续每个参数都是该命令的独立命令行参数。拆分后,gtime会正确识别-a是选项,-f是格式选项、后面跟着格式字符串,-o是输出选项、后面跟着日志文件名,最后才是要执行的hostname命令。
这样调用后,gtime会正常收集hostname的运行数据并写入指定日志文件,同时输出hostname的结果。
内容的提问来源于stack exchange,提问作者mabalenk
相关产品推荐
相关产品推荐

