2013-06-20 61 views
1

當我運行下面的腳本,這不正是我想要它做並退出:的Perl - 腳本內部執行命令掛起

setDisplay.sh:

#!/bin/bash 

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

當我運行./setDisplay.sh ,一切正常。

OK,這裏的樂趣的開始......

我有一個Perl腳本調用setDisplay ...

這裏是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

當shebanh是'bash'時使用'sh'通常是一個壞主意。 –

+0

不知道,但如果這就是你正在做的Perl腳本,你可以做一個'exec $ cmd;'。 – kjprice

回答

9

當你這樣做:

$result=`$cmd`; 

創建管perl的過程中連接到外部命令,和Perl從這個管道讀取數據,直到EOF。

你的外部命令創建了一個後臺進程,它的stdout上還有pipe(還有它的stderr,因爲你做了2>&1)。在後臺進程退出或關閉其stdout和stderr或將其重定向到其他地方之前,該管道上不會有EOF。

如果您打算將Xvfb的stdout和stderr收集到perl變量$result中,那麼您必須等待它完成。如果你不打算這樣做,我不能猜到你想用2>&1做什麼。

另外一個以export命令結尾的腳本是可疑的。它只能修改自己的環境,然後立即退出,因此沒有明顯的影響。通常這是一個跡象表明有人試圖修改父進程的環境,這是不可能的。