Команда Perl SYSTEM завершается неудачно с «Bad file descriptor» при запуске через Jenkins - PullRequest
1 голос
/ 05 ноября 2019

У меня есть простая системная команда, чтобы скопировать файл из одной папки в другую:

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 Все попытки вернули ошибку: Error number -1, error message: "Bad file descriptor".

При попытке использовать систему ($ cmd) ошибка была Error number 65280, error message: "No such file or directory".

Этот код perl выполняется через Jenkins(версия 2.190.1) и perl v5.26.0. Эта проблема началась после переноса кода из Mercurial в Git, но я не думаю, что это связано. Раньше это работало, но теперь всегда терпит неудачу: (

1 Ответ

3 голосов
/ 05 ноября 2019

Обратная косая черта имеет особое значение в строке в кавычках 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...