使用 readline PHP 读取用户命令行输入,但 bash 不是默认值 shell

Reading user command line input with PHP with readline, but bash is not default shell

我写了一个 PHP 脚本,我正在尝试从命令行读取用户输入。我从

开始
$myVar = exec('read myVar; echo $myVar;');

效果很好,但在键入输入时,箭头键无法正常工作。我了解到这可以通过 -e 开关解决,所以它变成了:

$myVar = exec('read -e myVar; echo $myVar;'); 

现在这在我的开发环境中很有用,但不幸的是,在我们的生产环境中似乎 PHP 不使用 bash shell 并且不支持-e switch,要改这个恐怕不容易。

根据the third answer to this question可以强制PHP使用bash,所以变成了:

$myVar = exec('/bin/bash -c "read -e myVar; echo $myVar"');

现在,不幸的是这不起作用,因为未设置变量 myVar

当我 运行 直接从命令行 $myVar(shell 变量)设置命令时,无论我的输入是什么,都会回显

然而,当使用 -c 选项时,在 PHP-exec() 中或直接在命令行中,如下所示:

/bin/bash -c "read -e myVar; echo $myVar";

$myVar 根本没有设置,一个空字符串(或任何 $myVar 的先前值)被回显

我做错了什么?

问题是 $myVar 在传递给 bash 之前正在被解释。以下将通过在传递给 shell 之前转义 $ 来工作:

/bin/bash -c "read -e myVar; echo $myVar"

你也可以使用 $REPLY

缩短一点

/bin/bash -c "read -e; echo $REPLY"

您使用的命令是正确的。 解决方法是使用正确的转义序列:

$myVar = exec ('/bin/bash -c \'read -e myVar; echo $myVar \'');