我试图制作一个非常简单的脚本来从.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。
任何想法?
答案 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,请注意ShellQuote和Win32::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;