Как прочитать стандартный вывод команды и стандартную ошибку? - PullRequest
0 голосов
/ 15 октября 2018

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

(use-modules (ice-9 popen))
(use-modules (ice-9 textual-ports))

(let ((out (open-input-pipe "date --utc")))
  (get-string-all out))

=> "Mon Oct 15 17:51:46 UTC 2018\n"

Но как мне прочитать и стандартный вывод, и стандартную ошибку?

Обновление

На основев комментариях @ Шона ниже я попытался

(let ((p0 (current-error-port))
      (p1 (open-output-string)))
  (set-current-error-port p1)
  (let* ((p2 (open-input-pipe "date --utz"))
         (err (get-output-string p1))
         (out (get-string-all p2))
         (rval (close-pipe p2)))
    (set-current-error-port p0)
    (format #t "stdout: ~a\nstderr: ~a\nstatus: ~a\n" out err rval)))

Он печатает

stdout: 
stderr: 
status: 256

По какой-то причине он не фиксирует вывод команды на стандартную ошибку.Что я делаю не так?

Обновление 2

Оказывается, вы не можете использовать строковый порт:

Если эти текущие X-порты не являютсяфайлы некоторого вида, и, следовательно, не имеют файловых дескрипторов для дочернего элемента, вместо этого используется / dev / null.

...