如何在Perl中调用带管道的Linux命令并正确捕获输出
问题根因
你使用了find的-print0参数,该参数会让find输出的文件名以ASCII 0(null字符)分隔,但后续的du命令没有配置对应读取null分隔输入的参数,导致文件列表解析错误,统计结果不符合预期。你在命令行运行时得到正确结果属于巧合,一般是目标路径下不存在带空格/特殊字符的文件名,才会误打误撞输出正确数值。
解决方法
方案1:保留-print0适配特殊字符文件名
如果你的目录下存在带空格、换行等特殊字符的文件名,需要修改管道命令,给du增加--files0-from=-参数,让其支持读取null分隔的输入:
find /var/opt/ -type f -mtime -1 -print0 | du -s --files0-from=- | cut -f1
对应的Perl捕获代码如下,直接用标量接收单行输出,同时用chomp去除末尾的换行符即可:
my $cmd = 'find /var/opt/ -type f -mtime -1 -print0 | du -s --files0-from=- | cut -f1'; chomp(my $file_size = `$cmd`); # 此时$file_size就是预期的数值结果
方案2:移除-print0简化命令
如果你确认目标路径下没有带特殊字符的文件名,可以直接删除-print0参数,原命令无需其他修改即可正常运行:
find /var/opt/ -type f -mtime -1 | du -s | cut -f1
对应的Perl代码同步调整即可。
内容的提问来源于stack exchange,提问作者p zankat
相关产品推荐
相关产品推荐

