Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用带有readline的PHP读取用户命令行输入,但bash不是默认的shell_Php_Bash_Shell_Command Line Interface_Readline - Fatal编程技术网

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

使用带有readline的PHP读取用户命令行输入,但bash不是默认的shell,php,bash,shell,command-line-interface,readline,Php,Bash,Shell,Command Line Interface,Readline,我编写了一个PHP脚本,并试图从命令行读取用户输入。我从 $myVar = exec('read myVar; echo $myVar;'); 这很好,但当输入时,箭头键没有按应有的方式工作。我知道这可以通过-e开关解决,所以它变成: $myVar = exec('read -e myVar; echo $myVar;'); $myVar = exec('/bin/bash -c "read -e myVar; echo $myVar"'); 现在,这在我的开发环境中很有吸引力,但不幸的

我编写了一个PHP脚本,并试图从命令行读取用户输入。我从

$myVar = exec('read myVar; echo $myVar;');
这很好,但当输入时,箭头键没有按应有的方式工作。我知道这可以通过-e开关解决,所以它变成:

$myVar = exec('read -e myVar; echo $myVar;'); 
$myVar = exec('/bin/bash -c "read -e myVar; echo $myVar"');
现在,这在我的开发环境中很有吸引力,但不幸的是,在我们的生产环境中,PHP似乎不使用bash shell,也不支持-e开关,而且要改变这一点可能并不容易

据了解,可以强制PHP使用bash,因此它变成:

$myVar = exec('read -e myVar; echo $myVar;'); 
$myVar = exec('/bin/bash -c "read -e myVar; echo $myVar"');
现在,不幸的是,这不起作用,因为没有设置变量
myVar

当我直接从命令行运行命令时,
$myVar
(shell变量)被设置为我输入的任何内容,并因此返回

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

/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”

您考虑过使用吗?是的,我考虑过。在我发现我的开发环境不支持它之后,我停止了尝试,但是它在生产环境中确实工作得很好,所以我认为我只需要在开发环境中工作,或者甚至可以暂时使用“function_exists()”开关。所以谢谢,有点忘了。尽管如此,我还是想知道上面的内容是如何不起作用的。你是在开发一个不同于你在生产中使用的PHP版本吗?仅此而已!谢谢:-)没问题@btum81:-)