2016-03-01 192 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');