Skip to content

Commit 708671b

Browse files
committed
Fix #181: support :discard or ProcessBuilder$Redirect for :out and :err
1 parent f02e024 commit 708671b

File tree

3 files changed

+25
-8
lines changed

3 files changed

+25
-8
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
[Babashka process](https://github.com/babashka/process)
44
Clojure library for shelling out / spawning sub-processes
55

6+
## 0.6.24 (2025-12-07)
7+
8+
- [#181](https://github.com/babashka/process/issues/181): support `:discard` or `ProcessBuilder$Redirect` as `:out` and `:err` options
9+
610
## 0.6.23 (2025-03-31)
711

812
- [#163](https://github.com/babashka/process/issues/163), [#164](https://github.com/babashka/process/issues/164): Program resolution strategy for `exec` and Windows now matches macOS/Linux/PowerShell ([@lread](https://github.com/lread))

src/babashka/process.cljc

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -271,18 +271,20 @@
271271
:write (.redirectOutput pb (ProcessBuilder$Redirect/to (io/file (str out-file))))
272272
:append (.redirectOutput pb (ProcessBuilder$Redirect/appendTo (io/file (str out-file))))
273273
:discard (.redirectOutput pb (if-before-jdk8
274-
(ProcessBuilder$Redirect/to @null-file)
274+
(ProcessBuilder$Redirect/to @null-file)
275275
ProcessBuilder$Redirect/DISCARD))
276-
nil)
276+
(when (instance? java.lang.ProcessBuilder$Redirect out)
277+
(.redirectOutput pb out)))
277278
(case err
278279
:out (.redirectErrorStream pb true)
279280
:inherit (.redirectError pb ProcessBuilder$Redirect/INHERIT)
280281
:write (.redirectError pb (ProcessBuilder$Redirect/to (io/file (str err-file))))
281282
:append (.redirectError pb (ProcessBuilder$Redirect/appendTo (io/file (str err-file))))
282-
:discard (.redirectOutput pb (if-before-jdk8
283-
(ProcessBuilder$Redirect/to @null-file)
284-
ProcessBuilder$Redirect/DISCARD))
285-
nil)
283+
:discard (.redirectError pb (if-before-jdk8
284+
(ProcessBuilder$Redirect/to @null-file)
285+
ProcessBuilder$Redirect/DISCARD))
286+
(when (instance? java.lang.ProcessBuilder$Redirect err)
287+
(.redirectError pb err)))
286288
(case in
287289
:inherit (.redirectInput pb ProcessBuilder$Redirect/INHERIT)
288290
(when (or (instance? java.io.File in)
@@ -396,12 +398,14 @@
396398
stderr (.getErrorStream proc)
397399
out (if (and out (or (identical? :string out)
398400
(identical? :bytes out)
399-
(not (keyword? out))))
401+
(and (not (keyword? out))
402+
(not (instance? java.lang.ProcessBuilder$Redirect out)))))
400403
(future (copy stdout out out-enc))
401404
stdout)
402405
err (if (and err (or (identical? :string err)
403406
(identical? :bytes err)
404-
(not (keyword? err))))
407+
(and (not (keyword? err))
408+
(not (instance? java.lang.ProcessBuilder$Redirect err)))))
405409
(future (copy stderr err err-enc))
406410
stderr)]
407411
;; wrap in futures, see https://github.com/clojure/clojure/commit/7def88afe28221ad78f8d045ddbd87b5230cb03e
@@ -481,6 +485,7 @@
481485
For writing output to a file, you can set `:out` and `:err` to a `java.io.File` object, or a keyword:
482486
- `:write` + an additional `:out-file`/`:err-file` + file to write to the file.
483487
- `:append` + an additional `:out-file`/`:err-file` + file to append to the file.
488+
To discard `:out` or `:err`, use `:discard`
484489
- `:prev`: output from `:prev` will be piped to the input of this process. Overrides `:in`.
485490
- `:inherit`: if true, sets `:in`, `:out` and `:err` to `:inherit`.
486491
- `:dir`: working directory.

test/babashka/process_test.cljc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,3 +627,11 @@
627627
:out)]
628628
(is (bytes? result))
629629
(is (= (seq ba) (seq result))))))
630+
631+
(deftest discard-test
632+
(when-let [bb (u/find-bb)]
633+
(doseq [out [:discard java.lang.ProcessBuilder$Redirect/DISCARD]]
634+
(is (= "" (slurp (:out @(p/process {:out out} bb "-e" "(println :dude) (binding [*out* *err*] (println :bye))")))))
635+
(is (= (with-out-str (println :bye)) (slurp (:err @(p/process {:out out} bb "-e" "(println :dude) (binding [*out* *err*] (println :bye))")))))
636+
(is (= "" (slurp (:err @(p/process {:err out} bb "-e" "(println :dude) (binding [*out* *err*] (println :bye))")))))
637+
(is (= (with-out-str (println :dude)) (slurp (:out @(p/process {:err out} bb "-e" "(println :dude) (binding [*out* *err*] (println :bye))"))))))))

0 commit comments

Comments
 (0)