【问题标题】:Arrow keys not working in php CLI script | EDIT: STDIN involved箭头键在 php CLI 脚本中不起作用 |编辑:涉及标准输入
【发布时间】:2012-05-25 00:40:24
【问题描述】:

我最近进入了 PHP CLI 的迷人世界。

然后我在 ubuntu 终端上运行脚本,当我按下箭头键时,它没有移动光标,而是打印了转义码 ^[[A^[[B^[[C^[[D.

如果我使用普通终端,问题不会出现。所以我猜想在我的脚本中有些东西会阻止正常行为。

有人有解决办法吗?

感谢您的帮助!

编辑:

看起来是标准输入,我用它来捕捉输入,问题!等待 STDIN 输入时,终端显示错误字符!! 我该如何解决这个问题?

【问题讨论】:

  • 您能给我们看一些代码吗? readline 如果您还没有使用它,它可能会有所帮助。
  • 嗯,不是代码问题,当我按下箭头键时,它会显示其中一个 [[A^[[B^[[D^[[C 而不是移动光标!
  • 不同的实现肯定会导致不同的行为,至少对我来说是这样。例如,使用fgets(STDIN)fread(STDIN, 100),我得到与您相同的转义字符,而使用使用GNU readline 的readline(),左右箭头键允许行编辑(这在Linux 机器上通过Windows PuTTY SSH 终端)。不确定是否可以使用fgetsfread 进行行编辑,所以我怀疑您使用readlineNcurses 是另一种可能性。但如果没有看到任何代码,恐怕我无法(尝试)提供太多帮助。
  • 是的,我认为你是对的!脚本等待来自 fgets(STDIN) 的输入时会出现问题!!!我在 mac 上没有注意到,因为我需要一个文件路径作为输入,并且我曾经在终端中拖放所需的文件。相反,当我在 Ubuntu 上拖放时,终端会在文件路径周围显示令人讨厌的 ',所以我需要箭头来移动和删除那些 '。这使问题显而易见。那么我们如何解决这个问题呢?我应该传递给 readline() 吗? PS:我该如何解决'问题?有什么方法或者我应该改变我的代码来清除它们吗?还是谢谢!

标签: terminal stdin php


【解决方案1】:

我建议将fgets(STDIN) 调用替换为readline() 函数,该函数至少在Linux 环境中可用。请注意,readline 库未在 OS X 中提供,但可以单独安装。

// $input = fgets(STDIN);
$input = readline('Input: ');

如果您需要行编辑的唯一原因是从拖放文件路径中删除多余的 ´ 字符,您可以随时从脚本中的字符串中修剪任何多余的字符。

$input = readline('Input: ');
$input = trim($input, '´');

【讨论】:

  • 而且它更加更加用户友好,因为您可以使用光标键进行导航、查看历史记录等。
  • 那么唯一的办法就是安装readline?我将寻找一种无需重新编译整个 php 即可安装它的方法。有什么建议吗?
  • @Bakaburg:不确定是否有一种非常简单的方法可以让readline 在 OS X 中工作。使用 MacPorts 的安装说明here。如果您没有安装 MacPorts,请先转到 here。 MacPorts 反过来需要 Apple 的 Xcode 开发者工具...
猜你喜欢
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 2011-04-03
  • 2012-04-11
相关资源
最近更新 更多