我想使用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
都不会解释我的选项?我应该怎么做才能获得正确的输出?
答案 0 :(得分:2)
当您向system
,qx
,open
等提供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