2008-09-24 12 views
6

Específicamente tengo un script de línea de comandos PHP que en cierto punto requiere la entrada del usuario. Me gustaría poder ejecutar un editor externo (como vi) y esperar a que el editor finalice la ejecución antes de reanudar el script.¿Cómo puedo escapar de un script PHP a un editor externo y regresar después?

Mi idea básica era utilizar un archivo temporal para hacer la edición y luego recuperar el contenido del archivo. 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 una secuencia de comandos de línea de comandos PHP, sin embargo espero que haya algún tipo de shell scripting truco que puede ser empleado para lograr el mismo efecto.

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

Respuesta

9

puede redirigir la salida del editor al terminal:

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

No puedo creer que esto haya sido tan fácil. – Evert

+0

OMG, tan fácil. ¡Gracias! – marcio

2

Acabo de intentar esto y que funciona bien en Windows, por lo que es probable que pueda replicarse con aplicación vi o lo que quiera en Linux.

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

<?php 

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

?> 

$ php -r test.php 

Edit: Como sus programas intento y bstark señalaron, mis pruebas de fuego libreta una nueva ventana así que todo está bien, pero cualquier editor que se ejecuta en modo consola falla porque no tiene terminales para conectar a.

Dicho esto, probé en una caja de Linux con exec('nano test'); echo file_get_contents('test'); y no falla tan mal como vi, simplemente se ejecuta sin mostrar nada. Podría escribir algunas cosas, presionar "ctrl-X, y" para cerrar y guardar el archivo, y luego la secuencia de comandos php continuó y se muestra lo que había escrito. De todos modos ... Encontré la solución adecuada, así que recibí una nueva respuesta.

0

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

Puede usar un editor de línea como ed (probablemente no lo desee) o abrir una nueva ventana, como system ("xterm -e vi") (reemplace xterm con el nombre de su aplicación de terminal) .

Editado para agregar: En perl, el sistema ("vi") simplemente funciona, porque perl no hace el tipo de pipelining/buffering sofisticado que hace php.

0

por lo que parece que su idea de escribir un archivo nos lleva a probar cosas locas mientras que 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); 

La llamada fread() va a colgar el proceso php hasta que recibe algo (1024 bytes o al final de la línea creo), produciendo esto:

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

Claro, puedes hacer esto, pero no es exactamente lo que buscaba. Mi punto era que quería la flexibilidad de un editor externo como vi o similar. –

+0

Muy bien, entonces lo siento, pensé que se te ocurrió esa idea como un truco para obtener la entrada del usuario, de todos modos, está resuelto. – Seldaek

Cuestiones relacionadas