繁体   English   中英

为什么在我的管道中打开的*不能在Windows上运行?

[英]Why doesn't a * in my pipe open in Perl work on Windows?

我和Perl有这个奇怪的问题。 我试图从我的Perl脚本中执行外部程序,这个外部程序将字符串+通配符作为参数。 我的Perl程序看起来像这样

my $cmd_to_run = 'find-something-in-somedb myname* |' 
open(procHandle, $cmd_to_run); # I am using open because I want to 
                               # parse the output using pipes

出于某些奇怪的原因,运行此Perl脚本(在Windows下)调用open函数最终会出错:

'sqlselect' is not recognized as an internal or external command

我猜测它与我的命令字符串中的* ,因此我将其删除,现在我的命令字符串看起来像这样

my $cmd_to_run = 'find-something-in-somedb myname|'

现在,当我运行我的Perl脚本时,它运行得非常好。 只有存在通配符时才会出现问题。

有些要点需要注意:

  1. 我在相同的cmd提示符(我正在执行这个perl脚本)中使用通配符char运行相同的命令,它运行得很好..

  2. 当我使用Windows中的_open函数在C中编程时,相同的命令有效。

  3. 问题似乎只有当存在通配符*时,至少这是我猜的

  4. 不,我没有在Unix上试过这个..

任何线索???

编辑 :我发现这与ENV有关。 我尝试运行的程序仅在搜索字符串中存在“*”通配符时使用“sqlselect”... find-something-in-somedb和sqlselect存在于同一位置。 在哪种情况下perl如何能够找到“find-in-db”而不是“sqlselect”

对不起,我意识到原来的问题现在变成了别的东西..与“ENV”有关,而不是与Wildcard *有关

建议使用3参数形式的open

open(procHandle, '-|', 'find-something-in-somedb', 'myname*');

因为绕过shell(将执行*扩展)。

但是,在Windows上,应用程序通常会执行自己的引用解析和*扩展,因此您可能需要

open(procHandle, '-|', 'find-something-in-somedb', '"myname*"');

甚至

open(procHandle, '-|', 'find-something-in-somedb "myname*"');

因为我不确定Perl如何以及何时将事情交给cmd

Perl很可能正在扩展通配符本身,你不想这样做。 ephemient提供的答案非常好,但为了调试这个,尝试调用这个非常简单的程序:

print join ' ', @ARGV;

把它放到自己的文件中,然后从原始程序中调用它(我命名为我的argv.pl):

my $cmd_to_run = './argv.pl myname* |' 
open(procHandle, $cmd_to_run); 

这将在您的平台上明确地告诉您Perl如何解析事物。 在Unix上,*被展开以匹配当前工作目录中的文件。 虽然不确定Windows。

如果你使用三参数open会发生什么?

open my $procHandle, '-|', 'find-something-in-somedb myname*'
    or die "Cannot open pipe: $!";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM