Shell实用程序在perl system()调用中不起作用

时间:2013-07-12 16:05:40

标签: perl powershell

我有一个Perl脚本,我想使用system()调用一些shell程序,并可能动态地对程序的输出进行后处理。

在powershell中,我可以运行更多,tee,grep和其他东西,而无需指定可执行文件的完整路径。 我不明白为什么以下失败

C:\Users\xxxwork> perl -W -e "system 'more foo.log | tee  bar.txt'"
'tee' is not recognized as an internal or external command,
operable program or batch file.

以下工作,      C:\ Users \用户xxxwork> perl -W -e“system”more foo.log | grep -e failed'“

直接打电话给工作

C:\Users\xxxwork> tee
cmdlet Tee-Object at command pipeline position 1
Supply values for the following parameters:
FilePath:

我已经尝试用“Tee-Object”替换tee,但我得到了相同的结果。是否有任何额外的环境变量需要在这个特定情况下设置Perl才能看到shell看到的完整$ Path? 这只是因为在一种情况下,grep是一个纯粹的应用程序,而在另一种情况下,tee是shell实用程序吗?

PS C:\Users\xxxwork>  get-command Tee-Object

CommandType     Name                                               ModuleName
-----------     ----                                               ----------
Cmdlet          Tee-Object                                         Microsoft.PowerShell.Utility 
PS C:\Users\xxxwork> get-command grep

CommandType     Name                                               ModuleName
-----------     ----                                               ----------
Application     grep.exe

由于 ģ

1 个答案:

答案 0 :(得分:1)

system有两个目的。它可用于启动程序:

system($program, @args_to_program)

或者它可用于执行shell命令:

system($shell_command)

后者基本上等同于

system('cmd', '/x', '/c', $shell_command)

powershell /?,我们看到可以指示使用-Command参数执行命令,因此powershell的等价物将是

system('powershell', '-Command', $powershell_command)