Pergunta

Especificamente Eu tenho um script de linha de comando PHP que em um determinado ponto requer entrada do usuário. Eu gostaria de ser capaz de executar um editor externo (como vi), e esperar que o editor para a execução terminar antes de retomar o script.

A minha ideia básica era usar um arquivo temporário para fazer a edição, e para recuperar o conteúdo do arquivo depois. Algo ao longo das linhas de:

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

get_user_input ($filename);

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

Eu suspeito que isso não é possível a partir de um script de linha de comando PHP, porém eu estou esperando que há algum tipo de truque shell script que pode ser empregada para conseguir o mesmo efeito.

Sugestões de como isso pode ser alcançado em outras linguagens de script também são mais que bem-vindos.

Foi útil?

Solução

Você pode redirecionar a saída do editor para o terminal:

system("vim > `tty`");

Outras dicas

Eu apenas tentei isso e ele funciona muito bem no Windows, então você provavelmente pode replicar com vi ou qualquer aplicativo que você deseja em Linux.

A chave é que paira exec() o processo de php, enquanto o bloco de notas (neste caso) está em execução.

<?php

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

?>

$ php -r test.php

Edit:. Como seus programas de tentativa e bstark apontou, meus fogos de teste notepad uma nova janela para que tudo está bem, mas qualquer editor que funciona no modo de consola falha porque ele não tem terminal para anexar

Dito isto, eu tentei em uma caixa de Linux com exec('nano test'); echo file_get_contents('test'); e não deixar tão mal como vi, ele apenas executa sem exibir qualquer coisa. Eu poderia escrever algumas coisas, pressione "Ctrl-x, y" para fechar e salvar o arquivo e, em seguida, o script php continuou e exibido o que eu tinha escrito. De qualquer forma .. Eu encontrei a solução adequada, tão nova resposta entrando.

Eu não sei se é de todo possível para conectar vi ao php terminal está sendo executado, mas a solução rápida e fácil é não usar um editor de tela no mesmo terminal.

Você pode usar um editor de linha, como ed (você provavelmente não quer que) ou abrir uma nova janela, como sistema ( "xterm -e vi") (substitua xterm com o nome de seu aplicativo terminal).

Editado para acrescentar:. Em perl, system ( "vi") simplesmente funciona, porque perl não faz o tipo de fantasia pipelining / tamponamento php faz

Assim, parece que sua idéia de escrever um arquivo nos levar a tentar coisas loucas enquanto não há uma solução fácil:)

<?php

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

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

A chamada fread () irá travar o processo de php até receber alguma coisa (1024 bytes ou fim da linha eu acho), produzindo o seguinte:

$ php test.php
foo?
bar <= my input
BAR
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top