我试着做一个非常简单的脚本来从一个.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的初学者,所以在尝试了几次不同的引号配置之后,我很快就没有什么想法了。
2条答案
按热度按时间vulvrdjw1#
看起来您在这里躲过了子弹(常见的难以理解的引号和转义),因为您不需要shell来完成所做的事情,其余的也不需要太多。
然后使用列表形式的exec,它完全绕过了shell,这也可以用system来实现,但是不能用反勾号。
注意q()操作符是单引号,释放了符号
'
以供内部使用。我们应该删除
$winepath
(由qx
返回)中的换行符,并且需要通过在其周围添加'
来保护其中的空格。穿过 shell 只会让它更难;只有在您 * 特别 * 需要shell的时候才这样做。
但是,一旦您确实需要shell,请注意String::ShellQuote和Win32::ShellQuote。
最后,阅读 * perl.com * 中的Quoting the Shell。在我看来,这是一本必读的阅读。
yvgpqqbh2#
我试了一百次后终于使它工作了。
我希望能帮助到一些人!
如果有人对.desktop文件感兴趣: