2008-09-24 18 views
6

具體而言,我有一個PHP命令行腳本,在某個點需要用戶輸入。我希望能夠執行外部編輯器(如vi),並等待編輯器在恢復腳本之前完成執行。如何將PHP腳本轉義到外部編輯器並在之後返回?

我的基本想法是使用臨時文件進行編輯,然後檢索文件的內容。

$filename = '/tmp/script_' . time() . '.tmp'; 

get_user_input ($filename); 

$input = file_get_contents ($filename); 
unlink ($filename); 

我懷疑這是不可能從PHP命令行腳本,但我希望有某種形式的shell腳本技巧的,可以被用來實現相同的:沿着線的東西影響。

對於如何在其他腳本語言中實現這一點的建議也非常受歡迎。

回答

9

您可以編輯的輸出重定向到終端:

system("vim > `tty`"); 
2

我只是想這和它在Windows正常工作,所以你也許可以用你想在Linux上vi或任何應用程序複製。

關鍵是exec()在記事本(在本例中)正在運行時會掛起php進程。

<?php 

exec('notepad c:\test'); 
echo file_get_contents('c:\test'); 

?> 

$ php -r test.php 

編輯:正如你嘗試節目和bstark指出,我的記事本試射了一個新的窗口,使一切都很好,但因爲它沒有終端連接到控制檯模式下運行的任何編輯失敗。

這就是說,我試着在一個Linux機器上使用exec('nano test'); echo file_get_contents('test');,它不會像vi那樣失敗,它只是運行而不顯示任何東西。我可以鍵入一些東西,按「ctrl-X,y」關閉並保存文件,然後php腳本繼續顯示我寫的內容。無論如何..我找到了適當的解決方案,所以新的答案進來

0

我不知道是否有可能將vi連接到終端php正在運行,但快速和簡單的解決方案是不使用在同一個終端上的屏幕編輯器。你可以使用ed編輯器(你可能不需要)或者打開一個新的窗口,比如system(「xterm -e vi」)(用你的終端應用的名稱替換xterm) 。

編輯添加:在perl中,系統(「vi」)只是起作用,因爲perl並沒有做那種花哨的流水線/緩衝php的功能。

0

如此看來你寫一個文件的想法導致我們嘗試瘋狂的事情,而有一個簡單的解決方案:)

<?php 

$out = fopen('php://stdout', 'w+'); 
$in = fopen('php://stdin', 'r+'); 

fwrite($out, "foo?\n"); 
$var = fread($in, 1024); 
echo strtoupper($var); 

的FREAD()調用,直到它收到的東西將掛起PHP程序(1024字節或行,我認爲)的結束,生產這種:

$ php test.php 
foo? 
bar <= my input 
BAR 
+0

當然,你可以做到這一點,但它不完全是我以後的事情。我的觀點是我想要像vi或類似的外部編輯器的靈活性。 – 2008-09-25 04:28:49

+0

好吧,那麼對不起,我以爲你只是想出了這個想法作爲黑客獲取用戶輸入,無論如何,這是我看到的。 – Seldaek 2008-09-25 05:32:02

相關問題