perl - 将系统命令重定向到文件

时间:2012-01-01 05:04:44

标签: linux perl bash shell unix

我在下面有这个perl代码,基本上想循环遍历这两个文件。然后调用一个bash脚本(它将文件和分隔符作为参数并打印出多行),然后将该命令的所有输出保存到一个新文件中(文件名末尾加上'_processed')。 以下语法有什么问题(目前它只是创建一个空白文件)?

#!/usr/bin/env perl
use strict;
use warnings;

my(@files) = (
"fixedtt.txt '|'",
"delimd2iffpipe.dat '|'"
);
for my $i (0 .. $#files) {
    my($filename) = split /[\s]+/, "$files[$i]", 2;
    my($name, $type) = split /[\.]+/, "$filename", 2;
    open (MYFILE, '>'."$name".'_processed.'."$type");
    system("sh myBashScript.sh $files[$i]");   #I want to write the entire output of this command to a file
    close (MYFILE); 
}

2 个答案:

答案 0 :(得分:5)

您可以通过在> <file name>前面添加终端命令的输出来重定向。埃尔戈:

system("sh myBashScript.sh $files[$i]");

变为:

system("sh myBashScript.sh $files[$i] > file.txt");

答案 1 :(得分:1)

您似乎对perl如何写入文件感到困惑。 open句柄上的closeMYFILE只会创建一个空文件。 system对perl中的该文件没有任何作用。 (虽然我不能说你的sh脚本用它做什么)。

一些指示:

  • 您正在使用@files的索引而不是元素 由于索引本身是无用的,因此无缘无故地降低了可读性 没有在任何地方使用。
  • 您正在使用split提取文件名和扩展名,而我 假设有一个原因。但是,没有必要设置 限制为2,因为您只使用前一个或两个 分裂的元素。
  • 如果您只有一个字符(或字符类,例如\s),那么 不需要括号。因此,请使用\s代替[\s]
  • 建议使用三参数open和 词汇文件句柄。
  • 使用backticks or qx()捕获输出(到标准输出)。 system仅返回系统调用的返回值。 dunsmoreb 你可以简单地在shell中重定向来创建 文件,但这是在perl中完成的。

如果我猜,我会说你试图将bash脚本的输出写入你试图打开的文件,在这种情况下你应该这样做:

my @files = (
    "fixedtt.txt '|'",
    "delimd2iffpipe.dat '|'"
);
for my $args (@files) {
    my ($filename)    = split ' ', $args;
    $filename =~ s/\./_processed./;
    open my $fh, '>', $filename or die $!;
    print $fh qx(sh myBashScript.sh $args);
    close $fh; 
}