Pregunta

Concretamente tengo un PHP script de línea de comandos que en un cierto punto se requiere de la intervención del usuario.Me gustaría ser capaz de ejecutar un editor externo (como vi), y esperar a que el editor para finalizar la ejecución antes de reanudar la secuencia de comandos.

Mi idea era utilizar un archivo temporal para hacer la edición, y para recuperar el contenido del archivo después.Algo a lo largo de las líneas de:

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

get_user_input ($filename);

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

Sospecho que esto no es posible a partir de PHP script de línea de comandos, sin embargo tengo la esperanza de que hay algún tipo de shell scripting truco que puede ser empleado para lograr el mismo efecto.

Sugerencias de cómo esto puede lograrse en otros lenguajes de scripting también son más que bienvenidos.

¿Fue útil?

Solución

Puede redirigir el editor de salida de la terminal:

system("vim > `tty`");

Otros consejos

Acabo de probar esta y funciona bien en windows, así que seguramente se puede replicar con vi o cualquier aplicación que quieras en Linux.

La clave es que exec() se bloquea el proceso de php, mientras que el bloc de notas (en este caso) se está ejecutando.

<?php

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

?>

$ php -r test.php

Editar:Como su intento de muestra y bstark señaló, mi bloc de notas de la prueba de incendios en una nueva ventana así que todo está bien, pero cualquier editor que se ejecuta en modo de consola falla porque no tiene terminal de adjuntar.

Dicho esto, he intentado en un cuadro de Linux con exec('nano test'); echo file_get_contents('test'); y no falla tan mal como vi, que sólo se ejecuta sin mostrar nada.Yo podría escribir algunas cosas, pulse "ctrl-X, y" para cerrar y guardar el archivo y, a continuación, el script php continuación y se muestra lo que yo había escrito.De todos modos..He encontrado la solución adecuada, por lo que la respuesta viene en.

No sé si es posible conectar la vi a la terminal de php se está ejecutando, pero la solución rápida y fácil es no usar un editor de pantalla en el mismo terminal.

Puede utilizar un editor de línea, tales como ed (probablemente usted no desea) o abrir una nueva ventana, como sistema("xterm -e vi") (reemplazar xterm con el nombre de su aplicación terminal).

Editado para añadir:En perl, el sistema("vi") simplemente funciona, ya que perl no es de la clase de lujo de la canalización/búfer de php hace.

Así que parece que su idea de escribir un archivo nos llevan a probar cosas locas mientras que no hay una solución fácil :)

<?php

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

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

El fread() la llamada se bloquea el proceso de php hasta que recibe algo (1024 bytes o al final de la línea, creo), la producción de este :

$ php test.php
foo?
bar <= my input
BAR
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top