为什么开放函数不能每次都解释命令的选项?

时间:2019-11-15 10:14:28

标签: perl

我想使用open函数来运行以下命令:

> echo "toto\ntata"
toto
tata
> echo -e "toto\ntata"
toto
tata
> echo -E "toto\ntata"
toto\ntata
> echo -n "toto\ntata"
toto\ntata

请注意,对于最后一个命令,没有结尾的换行符。

所以我有以下脚本:

use strict;

sub run_cmd {
    my ($cmd) = @_;
    my $fcmd;

    print("Run $cmd\n");

    open($fcmd, "$cmd |");
    while ( my $line = <$fcmd> ) {
        print "-> $line";
    }
    close $fcmd;
}

eval{run_cmd('echo "toto\ntata"')};
eval{run_cmd('echo -e "toto\ntata"')};
eval{run_cmd('echo -E "toto\ntata"')};
eval{run_cmd('echo -n "toto\ntata"')};

但是当我运行它时,会得到以下结果:

Run echo "toto\ntata"
-> toto
-> tata
Run echo -e "toto\ntata"
-> -e toto
-> tata
Run echo -n "toto\ntata"
-> toto
-> tataRun echo -E "toto\ntata"
-> -E toto
-> tata

我们可以看到-n正确解释了open选项,因为文本末尾没有换行符,但是选项-e-E。更糟糕的是,这里印有echo

为什么每次open都不会解释我的选项?我应该怎么做才能获得正确的输出?

2 个答案:

答案 0 :(得分:2)

当您向systemqxopen等提供shell命令时,它将被视为sh shell命令。


以下是echo内置的dash的文档,某些Linux发行版将其用作sh

  

echo [-n] args...

     

在标准输出上打印参数,以空格分隔。除非存在-n选项,否则在参数之后输出换行符。

     

如果在输出过程中遇到以下任何字符序列,则不输出该序列。而是执行指定的操作:

     

...

     

\n输出换行符。

     

...

它没有-e-E选项。

运行dash(在您的情况下也称为sh)中的命令,结果与您收到的输出完全相同。

$ echo "toto\ntata"
toto
tata
$ echo -e "toto\ntata"
-e toto
tata
$ echo -E "toto\ntata"
-E toto
tata
$ echo -n "toto\ntata"
toto
tata$

您的测试可能在bash shell中运行。以下将改为使用bash执行命令:

open(my $pipe, "-|", "bash", "-c", $cmd)

答案 1 :(得分:0)

当perl通过多种方式将某些信息输出到控制台/文件时,您是否有理由使用外部程序 echo

在处理过程中,您有 print printf say

Perl input and output functions

Programming Perl