Eam*_*orr 1 shell perl command-line
当我运行以下脚本时,它完全符合我的要求并退出:
setDisplay.sh:
#!/bin/bash
Xvfb -fp /usr/share/fonts/X11/misc/ :22 -screen 0 1024x768x16 2>&1 &
export DISPLAY=:22
Run Code Online (Sandbox Code Playgroud)
当我跑步时./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;
Run Code Online (Sandbox Code Playgroud)
它只是在我跑的时候挂起 ./eamorr.pl
我完全陷入困境......
小智 9
当你这样做:
$result=`$cmd`;
Run Code Online (Sandbox Code Playgroud)
创建一个管道,将perl进程连接到外部命令,perl从该管道读取直到EOF.
您的外部命令会创建一个后台进程,该进程在其stdout上仍然有管道(以及它之后的stderr 2>&1).在后台进程退出或关闭其stdout和stderr或将其重定向到其他位置之前,该管道上将不会有EOF.
如果你打算将stdout和stderr收集Xvfb到perl变量中$result,你自然不得不等待它完成.如果你不打算这样做,我无法猜测你是怎么做的2>&1.
还有一个以export命令结尾的脚本是可疑的.它只能修改自己的环境,然后立即退出,因此没有明显的效果.通常这表明有人试图修改父进程的环境,这是不可能的.