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
(define-module (system-utils)
#:use-module (ice-9 popen)
#:use-module (ice-9 rdelim)
#:export (shell-command-to-string*
in-directory
with-error-to-string*))
(define* (shell-command-to-string* cmd #:optional . args)
"run system program CMD with ARGS and return stdout as string"
(with-output-to-string
(lambda ()
(let ((in-port (apply open-pipe* (cons OPEN_READ (cons cmd args)))))
(let loop ((line (read-line in-port 'concat)))
(or (eof-object? line)
(begin
(display line)
(loop (read-line in-port 'concat)))))))))
(define (with-error-to-string* thunk)
(let ((old-port (current-error-port))
(str-port (open-output-string)))
(set-current-error-port str-port)
(let ((result (thunk)))
(set-current-error-port old-port)
(cons str-port result))))
(define-syntax-rule (in-directory directory body ...)
(let ((old-path (getcwd)))
(chdir directory)
(let ((result (begin body ...)))
(chdir old-path)
result)))