Fat*_*mon 3 windows perl pipe wildcard environment-variables
我和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
Run Code Online (Sandbox Code Playgroud)
出于某些奇怪的原因,运行此Perl脚本(在Windows下)调用open函数最终会出错:
'sqlselect' is not recognized as an internal or external command
Run Code Online (Sandbox Code Playgroud)
我猜测它与*我的命令字符串中存在有关,因此我将其删除,现在我的命令字符串看起来像这样
my $cmd_to_run = 'find-something-in-somedb myname|'
Run Code Online (Sandbox Code Playgroud)
现在,当我运行我的Perl脚本时,它工作得非常好.只有存在通配符时才会出现问题.
有些要点需要注意:
我在相同的cmd提示符(我正在执行这个perl脚本)中使用通配符char运行相同的命令,它运行得很好..
当我使用Windows中的_open函数在C中编程时,相同的命令有效.
问题似乎只有当存在通配符*时,至少这是我猜的
不,我没有在Unix上试过这个..
任何线索???
编辑:我发现这与ENV有关.我尝试运行的程序仅在搜索字符串中存在"*"通配符时使用"sqlselect"... find-something-in-somedb和sqlselect存在于同一位置.在哪种情况下perl如何能够找到"find-in-db"而不是"sqlselect"
对不起,我意识到原来的问题现在变成了别的东西..与"ENV"有关,而不是与Wildcard*有关
建议使用3参数形式的open
open(procHandle, '-|', 'find-something-in-somedb', 'myname*');
Run Code Online (Sandbox Code Playgroud)
因为绕过shell(将执行*扩展).
但是,在Windows上,应用程序通常会执行自己的引用解析和*扩展,因此您可能需要
open(procHandle, '-|', 'find-something-in-somedb', '"myname*"');
Run Code Online (Sandbox Code Playgroud)
甚至
open(procHandle, '-|', 'find-something-in-somedb "myname*"');
Run Code Online (Sandbox Code Playgroud)
因为我不确定究竟Perl如何以及何时将事情交给我cmd.