繁体   English   中英

通过 Jenkins 运行时,Perl SYSTEM 命令失败并显示“错误的文件描述符”

[英]Perl SYSTEM command fails with “Bad file descriptor” when running via Jenkins

我有一个简单的系统命令将文件从一个文件夹复制到另一个文件夹:

my $cmd = "xcopy /Y c:\DBs\Support\db.bak c:\jenkins\workdir\sql-bak-files";

当我尝试运行以下系统命令时,一切都失败了:

1. my $res = qx/$cmd/; 2. my $res = qx($cmd); 3. using back ticks 1. my $res = qx/$cmd/; 2. my $res = qx($cmd); 3. using back ticks所有尝试都返回错误: Error number -1, error message: "Bad file descriptor"

尝试使用 system($cmd) 时,错误为Error number 65280, error message: "No such file or directory"

此 perl 代码通过 Jenkins(版本 2.190.1)和 perl v5.26.0 运行。 这个问题是在将代码从 mercurial 迁移到 git 之后开始出现的,但我认为它不相关。 它以前工作过,但现在总是失败:(

反斜杠在 Perl 引用的字符串中具有特殊含义。 它用于转义以下字符 - 以“关闭”任何特殊含义。 如果要在 Perl 引用的字符串中使用反斜杠,则需要使用另一个反斜杠对其进行转义。

my $cmd = 'xcopy /Y c:\\DBs\\Support\\db.bak c:\\jenkins\\workdir\\sql-bak-files';

或者,Perl 可以识别 Windows 路径中的正斜杠,因此使用以下代码替换您的代码可能更容易:

my $cmd = 'xcopy /Y c:/DBs/Support/db.bak c:/jenkins/workdir/sql-bak-files';

请注意,在这两种情况下,我都用单引号替换了您的双引号。 这对您的问题没有影响,但是如果您不使用双引号字符串的任何特殊特性(例如变量的扩展),则使用双引号字符串似乎很奇怪。

更新:要调试这样的问题,您可以尝试print字符串。

$ perl -E'say "xcopy /Y c:\DBs\Support\db.bak c:\jenkins\workdir\sql-bak-files"'
xcopy /Y c:DBsSupportdb.bak c:jenkinsworkdirsql-bak-files

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM