Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用系统命令时如何在Perl中处理引号?_Perl_Pdf_Exec_System_Wine - Fatal编程技术网

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

调用系统命令时如何在Perl中处理引号?,perl,pdf,exec,system,wine,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

我正在尝试制作一个非常简单的脚本,从.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很快就用完了


有什么想法吗?

看来你在这里躲过了子弹(常见的莫名其妙的引号和转义),因为你不需要外壳来完成事情,其余的也不需要太多

然后使用的列表形式,它完全绕过shell。这也可以通过使用backticks来实现,但遗憾的是,不能使用backticks

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;
注意使用as单引号,释放符号
,以便在内部使用

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

穿过外壳只会让它变得更难;仅当您特别需要外壳时才执行此操作


但是,一旦您确实需要shell,请注意和。

经过一百次尝试,我终于让它工作了

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

你把标准定得很高。获得所有这些引用和转义是不容易的。看看是否能帮上忙。当然,你似乎并没有做任何有壳的好处。您是否考虑过使用exec的列表形式?您是否尝试过
my@cmd=('wine',q('C:\…'),$winepath);exec@cmd
@zdim的观点很好,不知道可以这样做,谢谢!!它似乎工作,我会在家里测试更多!它不起作用了!我敢打赌,任何程序都不会像wine那样使用空格。最后一个参数从winepath返回。@MaikoID已修复。(我没有想到,
$winepath
会有空格。)这就是我第一次在评论中问的原因——因为我无法测试
wine
这个东西。你确定它有效吗?我的假设是,
“.$winepath.”“
将刚好接近
$winepath
,因为您将
(这是一个空字符串)与
$winepath
连接起来,然后在
的末尾再连接另一个空字符串。我的意思是,结果与您使用
$winepath
的情况一样奇怪,不是。如果没有这种奇怪的空字符串串联,则会出现错误:“sh:1:语法错误:未终止的引号字符串”。我的猜测是winepath的返回有不同的unicodes引号,并且它修复了它。请参阅我的答案,以了解连接的明确方式(在
'
中放置一个变量)。您也可以始终只执行
q(')$怀恩帕斯。q(')
(我最初的答案中也有)。这真是“奇怪”