Как мне выйти из скрипта PHP во внешний редактор и вернуться после этого? - PullRequest
6 голосов
/ 24 сентября 2008

В частности, у меня есть сценарий командной строки PHP, который в определенный момент требует ввода от пользователя. Я хотел бы иметь возможность запускать внешний редактор (например, vi) и ждать, пока редактор завершит выполнение, прежде чем возобновить выполнение сценария.

Моя основная идея заключалась в том, чтобы использовать временный файл для редактирования и впоследствии получать содержимое файла. Что-то вроде:

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

get_user_input ($filename);

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

Я подозреваю, что это невозможно из сценария командной строки PHP, однако я надеюсь, что для достижения того же эффекта можно использовать какой-то прием сценариев оболочки

Предложения о том, как этого можно достичь на других языках сценариев, также приветствуются.

Ответы [ 5 ]

9 голосов
/ 25 сентября 2008

Вы можете перенаправить вывод редактора на терминал:

system("vim > `tty`");
2 голосов
/ 24 сентября 2008

Я только что попробовал это, и он отлично работает в Windows, так что вы, вероятно, можете копировать с помощью vi или любого другого приложения, которое вам нужно в Linux.

Ключ в том, что 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 голосов
/ 24 сентября 2008

Так что, похоже, ваша идея написать файл побудила нас попробовать сумасшедшие вещи, пока есть простое решение:)

<?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 голосов
/ 24 сентября 2008

Я не знаю, возможно ли вообще подключить vi к терминалу, на котором работает php, но быстрое и простое решение - не использовать редактор экрана на том же терминале.

Вы можете использовать редактор строк, такой как ed (вы, вероятно, этого не хотите), или открыть новое окно, например system ("xterm -e vi") (замените xterm именем вашего терминального приложения).

Отредактировано, чтобы добавить: В perl system ("vi") просто работает, потому что perl не делает то, что делает php.

0 голосов
/ 24 сентября 2008
...