PHP预填充STDIN进行编辑

时间:2018-02-27 16:44:50

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

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

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

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

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

Value: <user input>

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

$input = trim(fgets(STDIN));

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

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

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

Value: <previous>

其中<previous>是旧值,可编辑。

我尝试使用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

<old_data>无法修改。

然后来自fgets(STDIN)的返回数据只给出了光标起始位置之后的数据。

我不确定这是否可以在没有任何疯狂库的情况下使用PHP。任何帮助和想法将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

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

示例:

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

字符\033[<N>D会将光标向后移动N列,在此示例中为3,将其放在条形的开头。

无论其

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

或者,在Linux世界中通常做的是这样的提示:

Value (previous):

如果您只需按“Enter”,则表示使用“previous”。在您的代码中,如果STDIN为空,则只需使用之前的。