как избежать кавычек в функции оболочки? - PullRequest
5 голосов
/ 30 сентября 2019

Это Rakudo Star версии 2019.03.1, построенная на MoarVM версии 2019.03 с реализацией Perl 6.d.

Windows 10

Примеры:

1) Ошибка:

shell 'mysqldump -uroot -ppassword asppmr > D:\b\29-09-2019 19-45-18\asppmr.sql';

mysqldump: [Предупреждение] Использование пароля в интерфейсе командной строки может быть небезопасным. mysqldump: не удалось найти таблицу: "19-45-18 \ asppmr.sql" Proc.new (in => IO :: Pipe, out => IO :: Pipe, err => IO :: Pipe, код выхода =>6, сигнал => 0, pid => 11928, команда => ("mysqldump -uroot -ppassword asppmr> D: \ b \ 29-09-2019 19-45-18 \ asppmr.sql",))

2) Ошибка:

shell 'mysqldump -uroot -ppassword asppmr > "D:\b\29-09-2019 19-45-18\asppmr.sql"';

Синтаксическая ошибка в имени файла, имени папки или метке тома. Proc.new (in => IO :: Pipe, out => IO :: Pipe, err => IO :: Pipe, код выхода => 1, сигнал => 0, pid => 19372, команда => ("mysqldump -uroot -ppassword asppmr> \ "D: \ b \ 29-09-2019 19-45-18 \ asppmr.sql \" ",))

3) Нет ошибок (при отсутствиипробелы в пути к файлу):

so shell 'mysqldump -uroot -ppassword asppmr > D:\b\asppmr.sql';

True

4) cmd.exe без ошибок:

mysqldump -uroot -ppassword asppmr > "D:\b\29-09-2019 19-45-18\asppmr.sql"

5) perl 6без ошибок:

my $r = q:x/mysqldump -uroot -ppassword asppmr/;
spurt('D:\b\27-09-2019 18-29-12\asppmr.sql', $r);

6) perl 6 без ошибок (если в пути к файлу нет кавычек):

print 'mysql dump: ';
my $d = run 'C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqldump',
    '-uroot',
    '-ppassword',
    'asppmr',
    '--result-file=D:\b\29-09-2019 19-45-18\asppmr.sql',
    :err;

$d.err.slurp(:close); # skip show errors
say $d.exitcode == 0 ?? 'success!' !! 'error!';

дамп mysql: успех!

Решение: (спасибо r4ch )

my $fpath = 'D:\b\29-09-2019 19-45-18\asppmr.sql';
$fpath.subst-mutate(' ', '^ ', :g) if $*DISTRO.is-win;
shell "mysqldump -uroot -ppassword asppmr > {$fpath}";

1 Ответ

5 голосов
/ 30 сентября 2019

Вы можете попробовать освободить место в пути к файлу с помощью ^, как предложено в Как избежать пробела в пути к файлу в Windows Run?

...