gpt4 book ai didi

perl - 当@array 包含查找命令时,为什么 system(@array) 不起作用?

转载 作者:行者123 更新时间:2023-12-01 15:45:22 27 4
gpt4 key购买 nike

我开始喜欢上 Perl,但我不明白这里发生了什么。

为什么会这样

my @cmd = ();
push @cmd, 'find';
push @cmd, 'data/path/';
push @cmd, "-name";
push @cmd, '*.xml';
push @cmd, '-exec';
push @cmd, 'mv';
push @cmd, '{}';
push @cmd, 'junk/path/';
push @cmd, '\;';
say join (' ', @cmd);
system(join(' ', @cmd));

输出

find data/path/ -name *.xml -exec mv {} junk/path/ \;

没有发现错误!虽然这不起作用

my @cmd = ();       
push @cmd, 'find';
push @cmd, 'data/path/';
push @cmd, "-name";
push @cmd, '*.xml';
push @cmd, '-exec';
push @cmd, 'mv';
push @cmd, '{}';
push @cmd, 'junk/path/';
push @cmd, '\;';
say join (' ', @cmd);
system(@cmd);

输出:

find data/path/ -name *.xml -exec mv {} junk/path/ \;
find: Missing argument for »-exec«.

system 应该能够理解数组。参见 here .当我将输出复制到 shell 中时,没有缺少参数,它就可以正常工作。但是我的脚本不能执行这个。

最佳答案

在第二次 system 调用中,您不应该对 ; 进行转义。

-exec 切换到 find 会忽略参数,直到找到 ;; 被 shell 解释为命令分隔符,所以当你从命令行运行 find ... -exec 时,你需要将它转义,而在 shell脚本你会看到模式

find ... -exec ... \;

在您的第二个 system 调用中,您将所有参数收集到一个数组中并将该数组直接传递给 system。在这种情况下,Perl 没有使用 shell 来解释命令,find 命令看到参数 \; 而不是 ;,并且-exec 开关变得困惑。

要使 system 命令正常工作,您只需要说

...
push @cmd, ';';
...
system(@cmd);

关于perl - 当@array 包含查找命令时,为什么 system(@array) 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42093760/

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