我正在编写一个小命令行脚本来管理我的应用程序中的某些数据。
我正在使用STDIN
和fgets()
来阅读用户输入。
当我添加新数据时,我可以使用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。任何帮助和想法将不胜感激。
答案 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为空,则只需使用之前的。