я использую пройти бежать scp
, Обычно scp выводит индикатор выполнения, но он не отображается при использовании passthru
, Я хочу оценить, сколько времени займет перевод. Есть ли способ заставить его показать?
Большинство программ, связанных с libc, используют эту функцию isatty
проверить, является ли stdout терминалом, прежде чем они решат раскрасить свой вывод. Таким образом, чтобы убедиться, что управляющие последовательности терминала ANSI не будут испортить канал или перенаправлены в файл. passthru()
не будет запускать команду в терминале.
В PHP вы можете использовать proc_open()
открыть процесс и представить ему терминал для стандартного вывода. Возьмите этот пример из руководства, которое я изменил, чтобы использовать pty
вместо pipe
за stdout
а также stderr
:
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pty", "w"), // stdout is a pty that the child will write to
2 => array("pty", "w") // stderr is a pty that the child will write to
);
$cwd = '/tmp';
$env = array('some_option' => 'aeiou');
$process = proc_open('command', $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) {
// $pipes now looks like this:
// 0 => writeable handle connected to child stdin
// 1 => readable handle connected to child stdout
// Any error output will be appended to /tmp/error-output.txt
fwrite($pipes[0], '<?php print_r($_ENV); ?>');
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
echo stream_get_contents($pipes[2]);
fclose($pipes[2]);
// It is important that you close any pipes before calling
// proc_close in order to avoid a deadlock
$return_value = proc_close($process);
echo "command returned $return_value\n";
}
Однако вы также можете использовать LD_PRELOAD
при запуске процесса и обмануть программу таким образом, чтобы она думает стандартный вывод является терминалом. (хак, но иногда в крайнем случае). Я описал это здесь: Bash: трюк с программой мышления, стандартный вывод — это интерактивный терминал
Других решений пока нет …