当我运行以下脚本时,它完全按照我的要求执行并退出:
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
我完全陷入困境......
答案 0 :(得分:9)
执行此操作时:
$result=`$cmd`;
创建了一个管道,将perl进程连接到外部命令,perl从该管道读取直到EOF。
您的外部命令会创建一个后台进程,该进程在其stdout上仍然具有管道(以及自2>&1
以来它的stderr)。在后台进程退出或关闭其stdout和stderr或将其重定向到其他地方之前,该管道上将没有EOF。
如果您打算将Xvfb
的stdout和stderr收集到perl变量$result
中,您自然必须等待它完成。如果您不打算这样做,我无法猜测您试图对2>&1
做些什么。
此外,以export
命令结尾的脚本也是可疑的。它只能修改其自己的环境,然后立即退出,因此没有明显的效果。通常这表明有人试图修改父进程的环境,这是不可能的。