Чтение ввода командной строки пользователя с PHP с readline, но bash не является оболочкой по умолчанию


Я написал PHP-скрипт и пытаюсь читать пользовательский ввод из командной строки. Я начал с

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

Который работал нормально, но при вводе ввода клавиши со стрелками не работали так, как это должно было бы работать. Я узнал, что это можно решить с помощью переключателя-e, поэтому он стал:

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

Теперь это сработало как шарм в моей среде разработки, но, к сожалению, похоже, что в нашей производственной среде PHP не использует оболочку bash и не поддерживает переключатель-e, и это наверное, это не так просто изменить.

Согласно третьему ответу на этот вопрос можно заставить PHP использовать bash, так что получилось:

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

Теперь, к сожалению, это не работает, так как переменная myVar не установлена.

Когда я запускаю команды непосредственно из командной строки $myVar (переменная оболочки) устанавливается с любым моим входом, и, следовательно, echo'ed

Однако при использовании опции-c, либо в PHP-exec (), либо непосредственно в командной строке, как это:

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

$myVar не задается вообще, и пустая строка (или то, что было предыдущим значением $myVar) является echo'Ed

Что я здесь делаю не так?

1 3

1 ответ:

Проблема в том, что $myVar интерпретируется перед передачей в bash. Следующее будет работать, экранируя $ перед его передачей в оболочку:

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

Также вы можете немного сократить его, используя $REPLY

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