2016-03-01 145 views
-1

我有一个PHP CLI脚本并希望从该脚本执行交互式bash命令(例如less huge-file.txt),并获得相同的视图(例如导航控件less),就像我一样直接从终端开始。在CLI模式下从PHP运行交互式shell命令

正常system()调用,因为他们不暂停,只是返回所有的输出一次(在例如less的情况下)是不够的。

感觉是我有一个CLI脚本来组织几个任务。其中一些使用复杂的bash命令,我只是想从PHP调用bash脚本,但获得原始终端行为。

+0

说的真好:

下载您只需使用下面的代码之后。祝你好运(即使这是不可能的,除非你在cli模式下运行PHP)...你有编程问题吗?这个网站是为了问题,而不是转储您的待办事项/需求清单的地方。 –

+0

@MarcB我认为更一般的问题更好?我正在努力寻找一个好的和短期的解决方案,所以我认为我会很高兴分享我的发现,并要求更好的? – flori

+0

@thatotherguy我有一个CLI脚本,不需要任何Web访问。我重新提出了这个问题,以使其更加清晰。 – flori

回答

-1
proc_open('less huge-file.txt', array(STDIN, STDOUT, STDERR), $pipes); 

这将调用命令,并传递所有的控制等通过,所以不存在区别正常less huge-file.txt

仍然有点笨重,但比我能找到的其他例子短得多。

+0

那不行。 – hek2mgl

+0

@ hek2mgl嗯,也许这取决于环境?对于我在Mac OS 10.9.5上使用PHP 7 CLI,它工作正常。 – flori

+0

我已经使用php5.6进行测试。我会在晚上试试php7。 – hek2mgl

0

是的,这是可能的。我最近发布了一个项目,该项目允许PHP获得并与真正的Bash shell进行交互。在这里得到它:https://github.com/merlinthemagic/MTS

我怀疑你真的很少使用脚本(这将变得丑陋,头/尾/ sed/awk是你的朋友在文本操作),但获得真正的shell行为是非常可能的。

$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', false); 

//open file in less. $return1 will contain the view and the first part of the file you opened. The second argument is needed to delimit the return since less will not end in a shell prompt. 
$return1 = $shell->exeCmd('less /path/to/huge-file.txt', 'huge-file.txt'); 

//quit less, you must do this or the shell will hang on the less prompt and will have to be forcefully terminated. 
$return2 = $shell->exeCmd('q');