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

xfb7svmp  于 2023-01-05  发布在  Perl
关注(0)|答案(2)|浏览(156)

我试着做一个非常简单的脚本来从一个.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的初学者,所以在尝试了几次不同的引号配置之后,我很快就没有什么想法了。

vulvrdjw

vulvrdjw1#

看起来您在这里躲过了子弹(常见的难以理解的引号和转义),因为您不需要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()操作符是单引号,释放了符号'以供内部使用。
我们应该删除$winepath(由qx返回)中的换行符,并且需要通过在其周围添加'来保护其中的空格。
穿过 shell 只会让它更难;只有在您 * 特别 * 需要shell的时候才这样做。
但是,一旦您确实需要shell,请注意String::ShellQuoteWin32::ShellQuote
最后,阅读 * perl.com * 中的Quoting the Shell。在我看来,这是一本必读的阅读。

yvgpqqbh

yvgpqqbh2#

我试了一百次后终于使它工作了。

#!/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;

相关问题