【问题标题】:how to escape quotes in shell function?如何在shell函数中转义引号?
【发布时间】:2019-09-30 07:59:53
【问题描述】:

这是基于 MoarVM 版本 2019.03 构建的 Rakudo Star 版本 2019.03.1 实现 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, 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"';

Синтаксическая ошибка в имени файла, имени папки или метке тома。 Proc.new(in => IO::Pipe, out => IO::Pipe, err => IO::Pipe, exitcode => 1, signal => 0, pid => 19372, command => ("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';

是的

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}";

【问题讨论】:

    标签: raku


    【解决方案1】:

    您可以按照How to escape space in file path in windows run? 中的建议尝试使用^ 转义文件路径中的空格

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-29
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 2014-01-30
      • 1970-01-01
      • 2010-12-21
      相关资源
      最近更新 更多