1

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

设置显示.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

我完全被困住了...

4

1 回答 1

9

当你这样做时:

$result=`$cmd`;

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

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

如果您打算将 stdout 和 stderr 收集Xvfb到 perl 变量$result中,您自然必须等待它完成。如果你不是故意的,我猜不出你想用2>&1.

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

于 2013-06-20T20:26:38.057 回答