Perl——在脚本中执行的命令挂起

Perl——在脚本中执行的命令挂起,perl,shell,command-line,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

当我运行以下脚本时,它完全执行我希望它执行的操作并退出:

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

我完全被卡住了…

当你这样做时:

$result=`$cmd`;
创建一个将perl进程连接到外部命令的管道,perl从该管道读取数据,直到EOF

您的外部命令创建了一个后台进程,该进程的stdout和stderr上仍然有管道,因为您执行了2>&1。在后台进程退出或关闭其stdout和stderr或将其重定向到其他位置之前,该管道上不会有EOF

如果您打算将Xvfb的stdout和stderr收集到perl变量$result中,那么自然需要等待它完成。如果您不是有意的,我猜不出您想用2>&1做什么

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

执行此操作时:

$result=`$cmd`;
创建一个将perl进程连接到外部命令的管道,perl从该管道读取数据,直到EOF

您的外部命令创建了一个后台进程,该进程的stdout和stderr上仍然有管道,因为您执行了2>&1。在后台进程退出或关闭其stdout和stderr或将其重定向到其他位置之前,该管道上不会有EOF

如果您打算将Xvfb的stdout和stderr收集到perl变量$result中,那么自然需要等待它完成。如果您不是有意的,我猜不出您想用2>&1做什么


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

在shebanh为bash时使用sh通常是个坏主意。不知道,但如果这就是perl脚本所做的全部,您可以只执行exec$cmd;。当shebanh是bash时使用sh通常是个坏主意。不知道,但是如果perl脚本就是这么做的,那么您可以只执行exec$cmd;。