【问题标题】:How do I escape a PHP script to an external editor and return afterwards?如何将 PHP 脚本转义到外部编辑器并在之后返回?
【发布时间】:2010-09-12 15:57:13
【问题描述】:

具体来说,我有一个 PHP 命令行脚本,它在某个时候需要用户输入。我希望能够执行外部编辑器(例如 vi),并等待编辑器完成执行,然后再恢复脚本。

我的基本想法是使用临时文件进行编辑,然后检索文件的内容。大致如下:

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

get_user_input ($filename);

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

我怀疑这在 PHP 命令行脚本中是不可能的,但是我希望有某种 shell 脚本技巧可以用来实现相同的效果。

我们也非常欢迎有关如何在其他脚本语言中实现这一点的建议。

【问题讨论】:

    标签: php shell command-line user-input


    【解决方案1】:

    您可以将编辑器的输出重定向到终端:

    system("vim > `tty`");
    

    【讨论】:

    • 不敢相信这这么容易。
    • 天啊,太简单了。谢谢!
    【解决方案2】:

    我刚刚尝试过,它在 Windows 中运行良好,因此您可以在 Linux 上使用 vi 或任何您想要的应用程序进行复制。

    关键是exec()在记事本(在这种情况下)运行时挂起php进程。

    <?php
    
    exec('notepad c:\test'); 
    echo file_get_contents('c:\test');
    
    ?>
    
    $ php -r test.php
    

    编辑:正如您的尝试和 bstark 指出的那样,我的记事本测试会启动一个新窗口,所以一切都很好,但是任何在控制台模式下运行的编辑器都会失败,因为它没有可以附加的终端。

    话虽如此,我在一个带有exec('nano test'); echo file_get_contents('test'); 的Linux 机器上进行了尝试,它并没有像vi 那样失败,它只是运行而不显示任何内容。我可以输入一些东西,按“ctrl-X, y”关闭并保存文件,然后 php 脚本继续显示我写的内容。无论如何..我找到了正确的解决方案,所以新的答案进来了。

    【讨论】:

      【解决方案3】:

      我不知道是否可以将 vi 连接到运行 php 的终端,但快速简便的解决方案是不要在同一终端上使用屏幕编辑器。

      您可以使用诸如 ed 之类的行编辑器(您可能不希望这样做)或打开一个新窗口,例如 system("xterm -e vi")(将 xterm 替换为您的终端应用程序的名称)。

      编辑添加:在 perl 中,system("vi") 可以正常工作,因为 perl 不会像 php 那样做花哨的流水线/缓冲。

      【讨论】:

        【解决方案4】:

        所以看起来你写文件的想法让我们在有一个简单的解决方案时尝试疯狂的事情:)

        <?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
        

        【讨论】:

        • 当然,你可以这样做,但这并不是我想要的。我的意思是,我想要像 vi 或类似的外部编辑器的灵活性。
        • 好吧,对不起,我以为你只是想出这个主意来获取用户输入,反正我明白了。
        【解决方案5】:

        【讨论】:

          猜你喜欢
          • 2014-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-30
          相关资源
          最近更新 更多