[英]Perl system command changes the variable values and throws error
我有以下脚本:
#! /bin/env perl
use File::Basename;
my @log_files;
my $log_dir = "/tmp/";
my $path = "find_failing/";
$log_files[0] = (`find $path -name compile.log -print0`)[0];
$log_files[1] = (`find $path -name sim.log -print0`)[0];
my $rev = "100";
print "@log_files << \n";
foreach (@log_files) {
if (-f $_) {
chomp;
my $dirn = sprintf "%s/%s.%s", $log_dir, basename ($_), $rev;
chomp $dirn;
my $cmd = "cp -v $_ $dirn";
chomp $cmd;
print "C: $cmd\n";
system ($cmd);
system ("cp", "-v", $_, $dirn);
system ("echo");
}
}
运行此命令时,将得到以下输出:
find_failing/simulation/tc_ctrl.rtl/compile/compile.log find_failing/simulation/tc_ctrl.rtl/test_prbs.nrz.16.prbs23/sim.log <<
C: cp -v find_failing/simulation/tc_ctrl.rtl/compile/compile.log /tmp//compile.log.100
cp: missing destination file operand after `find_failing/simulation/tc_ctrl.rtl/compile/compile.log'
Try `cp --help' for more information.
`find_failing/simulation/tc_ctrl.rtl/compile/compile.log' -> `/tmp//compile.log'
C: cp -v find_failing/simulation/tc_ctrl.rtl/test_prbs.nrz.16.prbs23/sim.log /tmp//sim.log.100
cp: missing destination file operand after `find_failing/simulation/tc_ctrl.rtl/test_prbs.nrz.16.prbs23/sim.log'
Try `cp --help' for more information.
`find_failing/simulation/tc_ctrl.rtl/test_prbs.nrz.16.prbs23/sim.log' -> `/tmp//sim.log'
命令的打印显示了我想要的变量的正确扩展。 但是,使用system()运行时,会引发错误,指出目的地丢失。
此外,当我通过给出命令列表的形式发出命令时,会发生复制,但目标路径缺少$ dirn中的“。$ rev”。
我在v5.8.8和v5.24.0上运行,得到的输出是相同的。
怎么了? 为什么system()具有这种方式?
谢谢。
-print0
打印后跟NUL的路径,因此
$log_files[0]
包含
find_failing/foo/compile.log<NUL>find_failing/bar/compile.log<NUL>
$log_files[1]
包含
find_failing/foo/sim.log<NUL>find_failing/bar/sim.log<NUL>
更换
$log_files[0] = (`find $path -name compile.log -print0`)[0];
$log_files[1] = (`find $path -name sim.log -print0`)[0];
与
( $log_files[0] ) = split /\0/, `find $path -name compile.log -print0`;
( $log_files[1] ) = split /\0/, `find $path -name sim.log -print0`;
要么
$log_files[0] = `find $path -name compile.log -print0`;
$log_files[1] = `find $path -name sim.log -print0`;
s/\0.*//s for @log_files;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.