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

Linux perl-将系统命令重定向到文件,linux,perl,bash,shell,unix,Linux,Perl,Bash,Shell,Unix,下面是我的perl代码,基本上我想循环这两个文件。然后调用一个bash脚本(它将文件和分隔符作为参数,并打印出多行),然后将该命令的所有输出保存到一个新文件中(文件名末尾加上“_processed”)。 下面的语法有什么问题(目前它只是创建一个空白文件) 通过在终端命令前面加上,可以重定向终端命令的输出。因此: system("sh myBashScript.sh $files[$i]"); 变成: system("sh myBashScript.sh $files[$i] > file

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


通过在终端命令前面加上
,可以重定向终端命令的输出。因此:

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

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

通过在终端命令前面加上
,可以重定向终端命令的输出。因此:

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

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

您似乎对perl如何写入文件感到困惑。您在
MYFILE
句柄上的
open
close
将只创建一个空文件<代码>系统不会在perl中对该文件执行任何操作。(虽然我不能说你的sh脚本用它做了什么)

一些建议:

  • 您使用的是
    @files
    的索引,而不是 毫无理由地降低可读性,因为索引本身是 不在任何地方使用
  • 您正在使用
    split
    提取文件名和扩展名,并且 假设这是有原因的。但是,没有必要设置 限制为2,因为您只使用前一两个 来自该拆分的元素
  • 当您只有一个字符(或字符类,例如
    \s
    )时 不需要括号。因此,请使用
    \s
    而不是
    [\s]
  • 建议将三个参数与 词法文件句柄
  • 捕获输出(到标准输出)是用完成的。 仅返回系统调用的返回值。 正确的是,您只需在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; 
}

您似乎对perl如何写入文件感到困惑。您在
MYFILE
句柄上的
open
close
将只创建一个空文件<代码>系统不会在perl中对该文件执行任何操作。(虽然我不能说你的sh脚本用它做了什么)

一些建议:

  • 您使用的是
    @files
    的索引,而不是 毫无理由地降低可读性,因为索引本身是 不在任何地方使用
  • 您正在使用
    split
    提取文件名和扩展名,并且 假设这是有原因的。但是,没有必要设置 限制为2,因为您只使用前一两个 来自该拆分的元素
  • 当您只有一个字符(或字符类,例如
    \s
    )时 不需要括号。因此,请使用
    \s
    而不是
    [\s]
  • 建议将三个参数与 词法文件句柄
  • 捕获输出(到标准输出)是用完成的。 仅返回系统调用的返回值。 正确的是,您只需在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; 
}

为什么不打印就打开和关闭
MYFILE
?您是否认为
系统
语句正在写入该文件?为什么不打印就打开和关闭
MYFILE
?您认为
system
语句正在写入该文件吗?