6

具体的には、特定の時点でユーザーからの入力を必要とする PHP コマンドライン スクリプトがあります。外部エディター (vi など) を実行し、エディターの実行が終了するのを待ってからスクリプトを再開できるようにしたいと考えています。

私の基本的なアイデアは、一時ファイルを使用して編集を行い、後でファイルの内容を取得することでした。次のようなもの:

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

get_user_input ($filename);

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

これは PHP コマンドライン スクリプトからは不可能だと思われますが、同じ効果を得るために使用できる何らかのシェル スクリプト トリックがあることを期待しています。

他のスクリプト言語でこれを実現する方法についての提案も大歓迎です。

4

5 に答える 5

9

エディターの出力をターミナルにリダイレクトできます。

system("vim > `tty`");
于 2008-09-24T21:19:33.753 に答える
2

これを試してみたところ、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スクリプトが続行され、私が書いたものが表示されました。とにかく..適切な解決策を見つけたので、新しい答えが入ってきました。

于 2008-09-24T08:30:48.093 に答える
0

phpが実行されているターミナルにviを接続できるかどうかはわかりませんが、同じターミナルで画面エディターを使用しないことをすばやく簡単に解決できます。

edなどのラインエディタを使用するか(おそらく必要ないでしょう)、system( "xterm -e vi")などの新しいウィンドウを開きます(xtermをターミナルアプリの名前に置き換えます)。

追加のために編集:perlでは、system( "vi")が機能します。これは、perlがphpのような派手なパイプライン/バッファリングを実行しないためです。

于 2008-09-24T10:56:35.670 に答える
0
system('vi');

http://www.php.net/system

于 2008-09-24T08:29:55.023 に答える
0

したがって、ファイルを作成するというあなたの考えは、簡単な解決策がある一方で、クレイジーなことを試すように私たちを導くようです:)

<?php

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

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

fread() 呼び出しは、何か (1024 バイトまたは行末) を受け取るまで php プロセスをハングさせ、これを生成します:

$ php test.php
foo?
bar <= my input
BAR
于 2008-09-24T11:41:41.567 に答える