【问题标题】:PHP Prefilling STDIN for editingPHP 预填充 STDIN 以进行编辑
【发布时间】:2018-02-27 16:44:49
【问题描述】:

我正在编写一个小命令行脚本来管理我的应用程序中的一些数据。

我正在使用 STDINfgets() 来读取用户输入。

当我添加一个新数据时,我可以使用fgets()STDIN读取新数据,然后将其添加到数据库中。

用于添加数据的示例 CLI 界面:

Value: <user input>

我可以使用以下方法获取此用户输入:

$input = trim(fgets(STDIN));

我遇到的问题是编辑已经存在的数据的功能。

我想要的是预先填充到用户输入中的先前值。

用于编辑数据的示例 CLI 界面:

Value: <previous>

其中&lt;previous&gt; 是旧值,可编辑。

我曾尝试使用fwrite() 写入STDIN,它确实如此,但写入的数据不可编辑,并且光标从数据末尾开始。

我的尝试:

// Prompt
echo 'Value: ';

// Try and put the old data into STDIN
fputs(STDIN, $old_data);

// Get the new value from STDIN
$new_data = trim(fgets(STDIN));

界面最终看起来像这样:

Value: <old_data>
                 ^
          Cursor Position

并且&lt;old_data&gt; 不可编辑。

那么从fgets(STDIN)返回的数据只给了我光标起始位置之后的数据。

我不确定这对于没有任何疯狂库的 PHP 是否可行。任何帮助和想法将不胜感激。

【问题讨论】:

    标签: php command-line-interface stdin fgets fwrite


    【解决方案1】:

    这取决于你的 shell(我认为),但你可以用大多数带有控制字符的 xterm 来做到这一点。

    BASH 的文档在这里:https://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html

    例子:

    echo "foo: bar\033[3D";
    

    字符\033[&lt;N&gt;D会将光标向后移动N列,在本例中为3,将其放在小节的开头。

    但是

    我认为这不会像您期望的那样。旧数据不会像您想象的那样“可编辑”。用户将无法移动光标,只需在旧数据上键入即可。此外,按 Enter 不会提交光标“之后”的内容。所以,你可能想看看ncurses

    另外,在 Linux 世界中通常会出现这样的提示:

    Value (previous):

    意思是如果你简单地按“Enter”,则使用“previous”。在您的代码中,如果 STDIN 为空,则只需使用上一个。

    【讨论】:

    • 我想尝试避免任何库/扩展,因此我将通过将旧值作为提示的一部分并在 STDIN 为空时使用保留旧值来实现后一种解决方案。感谢您对此的意见!
    猜你喜欢
    • 2020-09-11
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 2022-10-08
    • 2013-06-24
    • 2020-05-11
    • 2016-06-23
    • 2015-08-26
    相关资源
    最近更新 更多