如何在shell函数中转义引号?

Shn*_*son 5 perl6 raku

这是基于实现Perl 6.d的MoarVM版本2019.03构建的Rakudo Star版本2019.03.1。

Windows 10

例子:

1)错误:

shell 'mysqldump -uroot -ppassword asppmr > D:\b\29-09-2019 19-45-18\asppmr.sql';
Run Code Online (Sandbox Code Playgroud)

mysqldump:[警告]在命令行界面上使用密码可能不安全。mysqldump:找不到表:“ 19-45-18 \ asppmr.sql” Proc.new(in => IO :: Pipe,out => IO :: Pipe,err => IO :: Pipe,exitcode => 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"';
Run Code Online (Sandbox Code Playgroud)

??????????????? ?????? ??????? ??????,????? ?????? ??? ?????? ????。Proc.new(in => IO :: Pipe,out => IO :: Pipe,err => IO :: Pipe,exitcode => 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';
Run Code Online (Sandbox Code Playgroud)

真正

4)cmd.exe没有错误:

mysqldump -uroot -ppassword asppmr > "D:\b\29-09-2019 19-45-18\asppmr.sql"
Run Code Online (Sandbox Code Playgroud)

5)perl 6没有错误:

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

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!';
Run Code Online (Sandbox Code Playgroud)

mysql dump:成功!

解决方案:(感谢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}";
Run Code Online (Sandbox Code Playgroud)