gpt4 book ai didi

perl - 如何获取另一个命令行工具 "wrap"的未修改命令行参数?

转载 作者:行者123 更新时间:2023-11-29 09:01:34 27 4
gpt4 key购买 nike

我想编写一个脚本 foo,它使用 Bash 或 Perl 简单地调用 bar,并使用与调用时完全相同的参数。

现在,在 perl 中执行此操作的一种简单方法是

#!/bin/perl

my $args=join(' ', @ARGV);
`bar $args`;

但是,ARGV 中的值已经被 shell 处理过,因此如果我调用

 foo "I wonder, \"does this work\""

bar 会这样调用

 bar I wonder "does this work"

如何获取原始命令行以便我可以简单地逐字传递?

最佳答案

在 perl 可执行文件被 shell 处理之前,您无法获取它们的参数。但是,您可以确保 shell 不会再次处理它们:

system('bar', @ARGV);

对比

system("bar @ARGV");

参见 perldoc -f system :

If there is only one scalar argument, the argument is checked for shell metacharacters, and if there are any, the entire argument is passed to the system's command shell for parsing (this is "/bin/sh -c" on Unix platforms, but varies on other platforms). If there are no shell metacharacters in the argument, it is split into words and passed directly to "execvp", which is more efficient.

如果您需要读取程序的输出,请使用进程句柄并以相同的方式(不使用插值)传递参数:

open my $barhandle, '-|', 'bar', @ARGV or die "Can't call bar: $!";
while (my $line = <$barhandle>)
{
# do something with $line...
}
close $barhandle;

调用 Perl 程序的方法有很多种;见What's the difference between Perl's backticks, system, and exec?以获得对主要选项的良好概述。

关于perl - 如何获取另一个命令行工具 "wrap"的未修改命令行参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1765697/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com