如何在调用系统命令时处理Perl中的引号?

时间:2017-10-19 01:07:44

标签: perl pdf exec system wine

我试图制作一个非常简单的脚本来从.desktop文件调用PDFXchange查看器。但是我无法做到这一点,因为bash正在看到我不知道的事情:

#!/usr/bin/perl

use strict;
use warnings;

my $winepath = `winepath -w -0 "$ARGV[0]"`;

my $cmd=join ' ',
    'wine',
    '\'C:\Program Files\Tracker Software\PDF Viewer\PDFXCview.exe\'',
    "\'$winepath\'";

print $cmd . "\\n";

exec $cmd;

输出

$ exec_pdfxcv 'pdf with spaces.pdf' 
wine 'C:\Program Files\Tracker Software\PDF Viewer\PDFXCview.exe' 'Z:\media\FILES\pdf with spaces.pdf'\nsh: 1: Syntax error: Unterminated quoted string

我是Perl的初学者,所以在尝试了几次不同的引号配置后,我很快就用完了ideias。

任何想法?

2 个答案:

答案 0 :(得分:1)

你似乎在这里躲过了子弹(常见的难以理解的引号和逃逸的错误),因为你不需要shell来做什么,其余的也不需要太多。

然后使用exec的列表形式,它完全绕过shell。这可以通过system来完成,但是,唉,不是用反引号。

my $winepath = `winepath -w -0 "$ARGV[0]"`;
chomp $winepath;

my @cmd = (
    'wine', 
    q('C:\Program Files\Tracker Software\PDF Viewer\PDFXCview.exe'),
    "'$winepath'"
); 
exec @cmd;

请注意使用q (perlop)作为单引号,释放符号'以供在内部使用。

我们应该从$winepath移除换行符(由qx返回),并且需要通过在其周围添加'来保护其中的空格。

穿过外壳只会让它变得更难;只有当特别需要shell时才能这样做。

一旦需要shell,请注意ShellQuoteWin32::ShellQuote

答案 1 :(得分:0)

经过数百次尝试后,我终于成功了。

#!/usr/bin/perl

use strict;
use warnings;

my $winepath = `winepath -w -0 "$ARGV[0]"`;

exec 'wine', q(C:\Program Files\Tracker Software\PDF Viewer\PDFXCview.exe), "".$winepath."";

我希望能帮助别人!

如果有人对.desktop文件感兴趣:

[Desktop Entry]
Name=PDF XChange Viwer
Comment=View multi-page documents
Exec=exec_pdfxcv %U
StartupNotify=true
Terminal=false
Type=Application
StartupWMClass=PDFXCview.exe
Icon=evince
Categories=GNOME;GTK;Office;Viewer;
MimeType=application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;image/vnd.djvu+multipage;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/vnd.comicbook+zip;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;