从Perl数组中指定的命令捕获输出

从Perl数组中指定的命令捕获输出,perl,command,Perl,Command,我认为这一定很简单,但我还没有找到一个可行的解决方案 问题就这么简单:我想执行一个系统命令并用Perl变量捕获输出。该命令在Perl数组中指定(包含命令和参数,例如@cmd=('mycmd'、'-opt1'、'arg1'、'val1')) 我不想使用分叉,也就是说,open(从_KID,-|')不是一个选项。我知道,如果我有一个字符串中的命令,我可以用backticks实现这一点。因此,这个问题可能归结为将@cmd数组转换为字符串。在我的例子中,命令参数可以包含空格 是否有一种简单的方法可以将@

我认为这一定很简单,但我还没有找到一个可行的解决方案

问题就这么简单:我想执行一个系统命令并用Perl变量捕获输出。该命令在Perl数组中指定(包含命令和参数,例如
@cmd=('mycmd'、'-opt1'、'arg1'、'val1')

我不想使用分叉,也就是说,
open(从_KID,-|')
不是一个选项。我知道,如果我有一个字符串中的命令,我可以用backticks实现这一点。因此,这个问题可能归结为将
@cmd
数组转换为字符串。在我的例子中,命令参数可以包含空格

是否有一种简单的方法可以将
@cmd
数组转换为可以与反勾号一起使用的字符串,但所有参数都正确引用?理想情况下,无需使用任何外部库

谢谢

您可能正在寻找。请注意,仅支持Bourne shell报价

但是反勾号也会执行隐式分叉,如果它们在任何方面与管道打开的隐式分叉不同,我从来没有注意到-\

您可能正在寻找。请注意,仅支持Bourne shell报价

但是反勾号也会执行隐式分叉,如果它们在任何方面与管道打开的隐式分叉不同,我从来没有注意到-\

您可能正在寻找。请注意,仅支持Bourne shell报价

但是反勾号也会执行隐式分叉,如果它们在任何方面与管道打开的隐式分叉不同,我从来没有注意到-\

您可能正在寻找。请注意,仅支持Bourne shell报价



但是反勾号也会执行隐式分叉,如果它们在任何方面与管道打开的隐式分叉不同,我从来没有注意到-\

首先,使用
system
或backtics将派生一个子进程——这是无法避免的。您可以执行类似于
$cmd=join(“”,map{s/'/\\\'/g;“$\'}@cmd”)
但是
open
可能会更安全。如果“我不想使用分叉”,不分叉是不可能的。这就是在unix中创建所有进程的方式,包括使用
system
时。我所理解的forking是指打开管道所做的Perl进程本身的隐式forking。这与
system
和backticks所做的隐式forking是一样的。您应该解释一下为什么您认为不想fork子进程,为什么您不想首先使用Perl模块,使用
system
或backtics将派生一个子进程——这是没有办法的。您可以执行类似于
$cmd=join(“”,map{s/'/\\\'/g;“$\'}@cmd”)
但是
open
可能会更安全。如果“我不想使用分叉”,不分叉是不可能的。这就是在unix中创建所有进程的方式,包括使用
system
时。我所理解的forking是指打开管道所做的Perl进程本身的隐式forking。这与
system
和backticks所做的隐式forking是一样的。您应该解释一下为什么您认为不想fork子进程,为什么您不想首先使用Perl模块,使用
system
或backtics将派生一个子进程——这是没有办法的。您可以执行类似于
$cmd=join(“”,map{s/'/\\\'/g;“$\'}@cmd”)
但是
open
可能会更安全。如果“我不想使用分叉”,不分叉是不可能的。这就是在unix中创建所有进程的方式,包括使用
system
时。我所理解的forking是指打开管道所做的Perl进程本身的隐式forking。这与
system
和backticks所做的隐式forking是一样的。您应该解释一下为什么您认为不想fork子进程,为什么您不想首先使用Perl模块,使用
system
或backtics将派生一个子进程——这是没有办法的。您可以执行类似于
$cmd=join(“”,map{s/'/\\\'/g;“$\'}@cmd”)
但是
open
可能会更安全。如果“我不想使用分叉”,不分叉是不可能的。这就是在unix中创建所有进程的方式,包括使用
system
时。我所理解的forking是指打开管道所做的Perl进程本身的隐式forking。这与
system
和backticks所做的隐式forking是一样的。您应该解释一下为什么您认为不想fork子进程,还有为什么不想使用Perl模块
String::ShellQuote
是第三方软件包,我希望避免使用它。我们有一个现有的脚本,它只使用核心包并支持Perl返回到版本5.8。我只需要让它在Windows下工作,可能不会影响最低要求或添加对不在core中的包的依赖性。String::ShellQuote是纯Perl–您可以从中复制代码。但它只适用于Bourne shell,而不适用于Windows的command.exe/cmd.exe。在Windows上,您需要Win32::ShellQuote–或管道打开工作的足够新的perl版本。;-)Win32::ShellQuote似乎是一个可以借用代码的地方。谢谢
String::ShellQuote
是第三方软件包,我希望避免使用它。我们有一个现有的脚本,它只使用核心包并支持Perl返回到版本5.8。我只需要让它在Windows下工作,可能不会影响最低要求或添加对不在core中的包的依赖性。String::ShellQuote是纯Perl–您可以从中复制代码。但它只适用于Bourne shell,而不适用于Windows的command.exe/cmd.exe。在Windows上,您需要Win32::ShellQuote–或管道打开工作的足够新的perl版本。;-)Win32::ShellQuote似乎是一个可以借用代码的地方。谢谢
String::ShellQuote
是第三方软件包,我将