gpt4 book ai didi

Perl仅执行部分shell命令并在命令替换中发出警告 'redundant argument in printf'

转载 作者:行者123 更新时间:2023-12-02 07:37:26 26 4
gpt4 key购买 nike

以下内容已在 OS X 10.11.5 上使用 perl 5.24 进行了测试。

我编写了一个简短的程序 (perl-embed.pl) 来确定 Perl 在将字符串插入反引号时是否转义 shell 元字符(事实并非如此)。

use strict;
use warnings;

my $bar = '" ; echo 45 ; "';

printf "%s\n", `echo "hi${bar}ls"`;

我非常惊讶地发现这生成了一个警告并且只执行了部分命令。

$ perl perl-embed.pl
Redundant argument in printf at perl-embed.pl line 6.
hi

为了进行比较,以下程序 (perl-embed2.pl) 使用 print 而不是 printf 运行时不会出现警告。

use strict;
use warnings;

my $bar = '" ; echo 45 ; "';

print `echo "hi${bar}ls"`;

然后我运行了它。

$ perl perl-embed2.pl
hi
45
<contents of current working directory>

perl-embed.pl 的行为完全出乎意料。 printf 在其他上下文中可以很好地插入字符串的内容,即使字符串包含奇怪的字符。

$ perl -Mstrict -Mwarnings -e 'printf "%s\n", q[5]'
5

$ perl -Mstrict -Mwarnings -e 'printf "%s\n", q["]'
"

系统 perl(版本 5.18)不会发出此警告,但似乎不会像我们期望的那样执行 ls 或 echo 45

$ /usr/bin/perl perl-embed.pl
hi

$ /usr/bin/perl perl-embed2.pl
hi
45
<contents of current directory>

为什么 Perl 会这样?请注意,在每种情况下 perl 都会正常退出。

最佳答案

您在列表上下文中使用反引号,因此表达式

`echo "hi${bar}ls`

将运行命令

 `echo "hi"; echo 45; ls`

并在单独的元素中返回每一行输出,例如

( "hi",
"45",
"foo",
... # other files in current directory
)

但是 printf 中的模板 ("%s\n") 只有一个占位符,因此 printf 会感到困惑并发出警告,就像你说的那样

perl -we 'printf "%d\n", 1, 2, 3, 4'

关于Perl仅执行部分shell命令并在命令替换中发出警告 'redundant argument in printf',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37771176/

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