2012-12-30 105 views
2

我在我的redhat上有php脚本,即时通过telnet客户端以根用户身份登录。
我的PHP脚本来运行bash脚本是(functions.inc):PHP脚本exec bash脚本不打印所有bash行

<?php 
exec('/ilantest/testscript.sh'); 
?> 

我的bash脚本:

#!/bin/bash 
echo "Hello world" 
echo "Whats going on ?" 

当我做:PHP functions.inc - 我得到如下:
怎么回事?[root @ X ilantest]#

为什么我不看第一行?
谢谢!

+0

那是什么“E”第一回声语句之后做什么? – Icarus3

+0

抱歉,没有“e”修复Q .. +当我./testscript.sh它工作正常并打印2行 – ilansch

+1

[返回Perl输出到PHP]可能的重复/ questions/21407590/return-perl-output-to-php) –

回答

4

exec()http://us3.php.net/manual/en/function.exec.php#refsect1-function.exec-returnvalues

最后线从命令的结果。如果您需要执行 命令并将命令中的所有数据直接传回 而不受任何干扰,请使用passthru()函数。要获得执行命令的输出 ,请务必设置并使用输出 参数

所以:

exec('/ilantest/testscript.sh', $output); 
echo implode("\n", $output); 
+0

或者更好地使用另一个函数,它总是返回输出。 – gaRex

+1

@gaRex,当然OP会希望检查脚本的返回值,并确保在执行implode()之前$ output不是空的,但这一切取决于OP如何编写shell脚本。 –

+0

那么使用proc_ *函数堆栈甚至可能会更好。 – gaRex

1

在你的PHP脚本尝试

echo system('/ilantest/testscript.sh'); 
+0

确定所有字符串与\ n(!),但重复最后一个...使用'shell_exec()'代替系统,不会导致副作用。 –

1

只有当你不指定任何参数来接收输出的最后一行将被打印。从exec()手册:

如果输出参数存在,则该指定的数组将 填充来自指令输出的每一行。尾数 空格(例如\ n)未包含在此数组中。请注意,如果 数组已包含某些元素,则exec()将追加到数组的末尾 。如果您不希望函数追加元素, 在将数组传递给exec()之前会调用unset()方法。

你可以传递一个阵列接收所有行:

<?php 
$lines = array(); 
exec('/ilantest/testscript.sh', $lines); 
foreach($lines as $i) { 
    echo $i; 
} 
?>