【问题标题】:perl - redirect system command to a fileperl - 将系统命令重定向到文件
【发布时间】:2012-01-01 05:04:43
【问题描述】:

我下面有这个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); 
}

【问题讨论】:

  • 为什么打开和关闭MYFILE 而不打印到它?您认为system 语句正在写入该文件吗?

标签: linux perl bash shell unix


【解决方案1】:

您可以重定向终端命令的输出,方法是在其前面加上> <file name>。尔格:

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

变成:

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

【讨论】:

    【解决方案2】:

    您似乎对 perl 如何写入文件感到困惑。 MYFILE 句柄上的 openclose 只会创建一个空文件。 system 在 perl 中不对那个文件做任何事情。 (虽然我不能说你的 sh-script 用它做了什么)。

    一些提示:

    • 您正在使用@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; 
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-07
      • 2015-04-10
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2020-03-12
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多