Perl - 在脚本内执行的命令挂起

时间:2013-06-20 20:14:38

标签: perl shell command-line

当我运行以下脚本时,它完全按照我的要求执行并退出:

setDisplay.sh:

#!/bin/bash

Xvfb -fp /usr/share/fonts/X11/misc/ :22 -screen 0 1024x768x16 2>&1 &
export DISPLAY=:22

当我运行./setDisplay.sh时,一切正常。

好的,这是有趣的开始......

我有一个调用setDisplay的Perl脚本......

这是eamorr.pl脚本:

#!/usr/bin/perl

use strict;
use warnings;

my $homeDir="/home/eamorr/Dropbox/site/";

my $cmd;
my $result;

print "-----Setting display...\n";
$cmd="sh $homeDir/setDisplay.sh";
print $cmd."\n";
$result=`$cmd`;
print $result;

当我运行./eamorr.pl

时,它就会挂起

我完全陷入困境......

1 个答案:

答案 0 :(得分:9)

执行此操作时:

$result=`$cmd`;

创建了一个管道,将perl进程连接到外部命令,perl从该管道读取直到EOF。

您的外部命令会创建一个后台进程,该进程在其stdout上仍然具有管道(以及自2>&1以来它的stderr)。在后台进程退出或关闭其stdout和stderr或将其重定向到其他地方之前,该管道上将没有EOF。

如果您打算将Xvfb的stdout和stderr收集到perl变量$result中,您自然必须等待它完成。如果您不打算这样做,我无法猜测您试图对2>&1做些什么。

此外,以export命令结尾的脚本也是可疑的。它只能修改其自己的环境,然后立即退出,因此没有明显的效果。通常这表明有人试图修改父进程的环境,这是不可能的。