Perl Scripting: запуск mv в качестве внешней команды - PullRequest
0 голосов
/ 19 января 2012

Я пытаюсь запустить эту команду как часть моего сценария Perl:

`mv $n1 ../out`

где $ n1 - это имя файла, которое я получаю из предыдущей подпрограммы. Я получаю сообщение об ошибке, как показано ниже:

mv: missing destination file operand after `test.pl'
Try `mv --help' for more information.
sh: line 1: ../out: is a directory

Может кто-нибудь, пожалуйста, помогите. Если я запускаю команду по отдельности, она работает нормально.

Ответы [ 2 ]

3 голосов
/ 19 января 2012

Вот скрипт, который воспроизводит что-то очень похожее на сообщения об ошибках, которые вы видите:

#!/usr/bin/perl

use strict;
use warnings;

my $n1 = "test.pl\n";

`mv $n1 ../out`;

Проблема в том, что $n заканчивается новой строкой (может быть, вы прочитали ее из файла, а не chomp это?), Поэтому команда, выполняемая оболочкой, выглядит так:

mv test.pl
../out

Если это действительно проблема, вы могли бы отследить ее, напечатав значение $n1:

print "DEBUG: \$n1 = \"$n1\"\n";

Обратите внимание, что

`...`
Синтаксис

предназначен для захвата вывода команды оболочки. Поскольку вы просто переименовываете файл, имеет смысл использовать system:

system 'mv', $n1, '../out';

или, как предложил Квентин в комментарии, использовать File::Copy::move или встроенную функцию rename, если вы уверены, что файл не перемещается через границы файловой системы.

0 голосов
/ 19 января 2012

То, что сказал Конерак выше.

Вы, вероятно, должны выполнить проверку перед вызовом команды, также если вам не нужно сохранять выходные данные команды, используйте system (), а не обратные тики, это делаеткод гораздо более четкий*

if ( -f $n1 ){
....
...