我知道如何用XARGS进行多个参数:
echo a b | xargs -l bash -c '1:$0 2:$1'
我知道如何将一系列参数传递给我的perl模块的子例程:
echo a b | xargs --replace={} perl -I/home/me/module.pm -Mme -e 'me::someSub("{}")'
,但我似乎无法使用这些美元参考(以满足me::someSub
签名(来获得多个个人参数:
echo a b | xargs -l perl -e 'print("$0 $1")'
只打印:
-e
那么如何获得外壳参数: $0
, $1
传递给我的perl模块的子例程?
我知道我可以只界定 a;b
,以便可以通过将其拆分以获取单个参数来处理XARG {}
(,但我也可以完全用Perl完全处理所有Stdin。取而代之的是,我的目标是使用perl -e
,以便我可以明确调用我想要的子例程(而不是在脚本中有一些预处理,以弄清楚要拨打什么子例程以及基于stdin使用哪些论点,以避免脚本维护成本(。
,而bash
的参数可作为$@
和$0
,$1
,$2
等获得,而Perl的参数可通过@ARGV
获得。这意味着
echo a b | xargs -l bash -c 'echo "1:$0 2:$1"'
是
echo a b | xargs -l perl -e'CORE::say "1:$ARGV[0] 2:$ARGV[1]"'
也就是说,以这种方式使用xargs
是没有意义的,因为没有办法预测它将称为perl
的次数,并且无法预测每次perl
的参数将传递多少参数。您有一个XY问题,并且还没有提供任何信息来帮助我们。也许您正在寻找
perl -e'CORE::say "1:$ARGV[0] 2:$ARGV[1]"' $( echo a b )
我不确定您的设计详细信息,因此我认为您需要一个perl One-Liner来使用shell的变量,这些变量被称为。<<<<<<<<<</p>
A perl -e'...'
执行''
给出的Perl 程序。对于来自该程序运行的环境的任何变量(管道或外壳脚本(,可以将其值传递给程序。在这篇文章中阐明了用单线执行此操作的方法,这是一个摘要。
Perl程序接收到在@ARGV
数组中的命令行中传递给它的参数。因此,您可以在
... | perl -e'($v1, $v2) = @ARGV; ...' "$0" "$1"
或
... | xargs -l perl -e'($v1, $v2) = @ARGV; ...'
如果xargs
确实用于为其输入提供Perl程序。在第一个示例中,引用了变量,以保护其中可能的有趣字符(空格, *
等(免受设置并运行perl程序的外壳解释。
如果输入包含多行处理,并且单线使用-n
或-p
,则在BEGIN
块中解开参数
... | perl -ne'BEGIN { ($v1, $v2) = splice(@ARGV,0,2) }; ...' "$0" "$1" ...
在编译时间运行的
,因此在循环之前,-n
/-p
提供的输入线。现在,文件名之外的其他参数已从@ARGV
中删除,因此,如果输入来自文件,则仅将文件名留在-n
/-p
中。
通过-s开关,还有一种单线命令行开关的基本机制。请参阅上面的链接以获取详细信息;我会推荐@ARGV
。
最后,您的调用代码可以设置环境变量,然后可以在%ENV
中使用Perl Progam。但是,这似乎不适合您似乎想要的东西。
还请参见此帖子。