Home > Enterprise >  php how to specify virtual terminal size in shell_exec()?
php how to specify virtual terminal size in shell_exec()?

Time:10-24

how do i set the virtual terminal size with shell_exec() ? i tried

function shell_exec_with_size(string $cmd, int $columns = 999, int $rows = 999): string
{
    $cmd = '/bin/bash -c ' . escapeshellarg("stty columns {$columns}; stty rows {$rows};{$cmd}");
    return shell_exec($cmd);
}

but that seems to have no effect, at least the columns property wasn't actually applied (don't know if the rows property was set or not)..

having a problem with yum check-updates changing the format depending on column size, with a "small" column size and a long update name, the format is

python-devel.x86_64                   2.7.18-1.amzn2.0.5       amzn2-core       
python-libs.x86_64                    2.7.18-1.amzn2.0.5       amzn2-core       
python-pillow.x86_64                  2.0.0-23.gitd1c6db8.amzn2.0.1
                                                               amzn2-core       

(where python-pillow's update name 2.0.0-23.gitd1c6db8.amzn2.0.1 is too long), but with a large terminal size it's instead printed as

python.x86_64                                                                                  2.7.18-1.amzn2.0.5                                                                      amzn2-core       
python-devel.x86_64                                                                            2.7.18-1.amzn2.0.5                                                                      amzn2-core       
python-libs.x86_64                                                                             2.7.18-1.amzn2.0.5                                                                      amzn2-core       
python-pillow.x86_64                                                                           2.0.0-23.gitd1c6db8.amzn2.0.1                                                           amzn2-core       
python2-rpm.x86_64                                                                             4.11.3-48.amzn2.0.2                                                                     amzn2-core

and im trying to parse the list programmatically, so specifying the terminal size would help get a consistent format from yum check-updates... also i have checked if yum perhaps separates the properties with tabs or something: it doesn't. it just seem to separate the properties with spaces, or newline and spaces, depending on terminal size.

CodePudding user response:

... don't know why, but using util-linux's script command instead of bash makes stty functional, combining script --command 'stty columns 999;cmd' /dev/null works:

function shell_exec_with_size(string $cmd, int $columns = 999, int $rows = 999): string
{
    $cmd = "stty columns {$columns}; stty rows {$rows};{$cmd}";
    $cmd = 'script --quiet --return --command ' . escapeshellarg($cmd) . ' /dev/null';
    return shell_exec($cmd);
}

(i also suspect, but haven't confirmed, that script calls /bin/sh behind-the-scene)

CodePudding user response:

An alternate approach is to pipe it out to a file and then read it back with file_get_contents

EDIT: Although now that I think about it, I'm not sure how yum will play with being piped to a file. Can you look in /var/log/yum instead?

<?php

/*

Author: hanshenrik
Question: php how to specify virtual terminal size in shell_exec()?
URL: https://stackoverflow.com/questions/74179969/php-how-to-specify-virtual-terminal-size-in-shell-exec
Tags: php, terminal, pty

*/

function shell_exec_with_file_output(string $cmd, string $tmp_file = 'shell_exec_with_file_output'): string 
{
    shell_exec($cmd . ' > ' . $tmp_file);
    $content = file_get_contents($tmp_file);
    unlink($tmp_file);
    return $content;
}

$output = shell_exec_with_file_output('bash ./test.sh');

var_dump($output);

Then with test.sh

#!/bin/bash

echo "python.x86_64                                                                                  2.7.18-1.amzn2.0.5                                                                      amzn2-core"      
echo "python-devel.x86_64                                                                            2.7.18-1.amzn2.0.5                                                                      amzn2-core"      
echo "python-libs.x86_64                                                                             2.7.18-1.amzn2.0.5                                                                      amzn2-core"      
echo "python-pillow.x86_64                                                                           2.0.0-23.gitd1c6db8.amzn2.0.1                                                           amzn2-core"      
echo "python2-rpm.x86_64                                                                             4.11.3-48.amzn2.0.2                                                                     amzn2-core"

Outputs:

string(975) "python.x86_64                                                                                  2.7.18-1.amzn2.0.5                                                                      amzn2-core
python-devel.x86_64                                                                            2.7.18-1.amzn2.0.5                                                                      amzn2-core
python-libs.x86_64                                                                             2.7.18-1.amzn2.0.5                                                                      amzn2-core
python-pillow.x86_64                                                                           2.0.0-23.gitd1c6db8.amzn2.0.1                                                           amzn2-core
python2-rpm.x86_64                                                                             4.11.3-48.amzn2.0.2                                                                     amzn2-core
"
  • Related