Stel ik heb een programma die ik wil draaien in een ander programma en het programma heeft een prompt, hoe krijg ik de prompt goed in het andere programma.
ik heb een execute function met deze inhoud:
dan voer ik in een ander script termninal.readline uit die er ongeveer zo uit ziet:
Als ik descriptorspec[0] verander in een pipe (was eerst) dan komt er een prompt waar ik kan typen wat ik wil, maar dan blijft ie hangen bij invoer (maar hij geeft niet de tekst weer).
Als ik descriptorspec[0] naar een file doe, dan komt ie bij terminal.readline maar de echo blijft uit. (In mijn voorbeeld heb ik 3 readlines, deze invullen en de code gaat verder en toont daarna pas de bijbehorende tekst.
Oftewel als ik het via "execute" doe dan gaat het niet goed, voer ik het in de terminal direct uit, gaat het wel goed.
Wat gaat er niet goed:
er komt 3x een blanke cursors (zonder text die er wel bij hoort)
Daarna komt de tekst
ik heb ook exec, shell_exec geprobeert met hetzelfde resultaat.
Al wat gelezen over blocking / non / blocking maar kom maar niet verder.
...
Relevante software en hardware die ik gebruik
php 7.4
debian 11
...
Wat ik al gevonden of geprobeerd heb
https://stackoverflow.com...pipe-when-using-proc-open
toch nog verder gekomen:
- The answer is surprisingly simple: leave $descriptorspec empty.
dan is de vraag, waarom gaat het wel goed als ik $descriptorspec leeglaat en gaat het niet goed als ik ze beschrijf...
...
ik heb een execute function met deze inhoud:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public static function execute($command, &$output = '', &$error = '', $type = null) $descriptorspec = array( 0 => array("file", 'php://stdin', "r"), // stdin // 0 => array("pipe", "r"), // stdin 1 => array("pipe", "w"), // stdout 2 => array("pipe", "w"), // stderr ); $process = proc_open($command, $descriptorspec, $pipes, Dir::current(), null); $output = stream_get_contents($pipes[1]); fclose($pipes[1]); $error = stream_get_contents($pipes[2]); fclose($pipes[2]); if(ob_get_level() > 0){ ob_flush(); } return proc_close($process); } |
dan voer ik in een ander script termninal.readline uit die er ongeveer zo uit ziet:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| public static function read($url='', $text=''): ?string { $is_flush = false; if(ob_get_level() > 0){ $is_flush =true; } if($is_flush){ ob_flush(); } if(empty($url)){ $url = 'input'; } $input = null; if($url === 'input'){ fwrite(STDOUT, $text); // echo $text; if($is_flush){ ob_flush(); } $input = trim(fgets(STDIN)); echo PHP_EOL; } elseif($url === 'input-hidden'){ // echo $text; fwrite(STDOUT, $text); if($is_flush){ ob_flush(); } system('stty -echo'); $input = trim(fgets(STDIN)); system('stty echo'); echo PHP_EOL; } return $input; } |
Als ik descriptorspec[0] verander in een pipe (was eerst) dan komt er een prompt waar ik kan typen wat ik wil, maar dan blijft ie hangen bij invoer (maar hij geeft niet de tekst weer).
Als ik descriptorspec[0] naar een file doe, dan komt ie bij terminal.readline maar de echo blijft uit. (In mijn voorbeeld heb ik 3 readlines, deze invullen en de code gaat verder en toont daarna pas de bijbehorende tekst.
Oftewel als ik het via "execute" doe dan gaat het niet goed, voer ik het in de terminal direct uit, gaat het wel goed.
Wat gaat er niet goed:
er komt 3x een blanke cursors (zonder text die er wel bij hoort)
Daarna komt de tekst
Bash:
1
2
3
4
5
6
7
| y y n Setup r3m-io/priya: This will setup r3m-io/priya. Are you sure you want to continue (y/n): This will setup r3m-io/priya. Are you sure you want to continue (y/n): This will setup r3m-io/priya. Are you sure you want to continue (y/n): |
ik heb ook exec, shell_exec geprobeert met hetzelfde resultaat.
Al wat gelezen over blocking / non / blocking maar kom maar niet verder.
...
Relevante software en hardware die ik gebruik
php 7.4
debian 11
...
Wat ik al gevonden of geprobeerd heb
https://stackoverflow.com...pipe-when-using-proc-open
toch nog verder gekomen:
- The answer is surprisingly simple: leave $descriptorspec empty.
dan is de vraag, waarom gaat het wel goed als ik $descriptorspec leeglaat en gaat het niet goed als ik ze beschrijf...
...