babashka 2025-12-07

how can i discard the output of a babashka.process without reading it into memory?

✅ 1

i see that there's :out but i'm not sure how to set up a object that just discards the output

you could do :out-file "/dev/null" - I should add a better explicit option for this

are you looking for NullOutputStream

you could also supply :out ProcessBuilder$Redirect/DISCARD

👍 1

but I should really put this behind :discard, I'll do it now

although yeah Borkdude's solutions are much more elegant :)

user=> (import '[java.lang ProcessBuilder$Redirect])
java.lang.ProcessBuilder$Redirect
user=> ProcessBuilder$Redirect/DISCARD
#object[java.lang.ProcessBuilder$Redirect$3 0x1626e651 "WRITE"]

and even then it was NullInputStream anyway lol, that naming always trips me up. Or is it NullReader?

oh lol, that doesn't work yet.

user=> (babashka.process/process {:out ProcessBuilder$Redirect/DISCARD :err :inherit} "echo 'lol'")
{:proc #object[java.lang.ProcessImpl 0xc816d52 "Process[pid=23158, exitValue=0]"], :exit nil, :in #object[java.lang.ProcessImpl$ProcessPipeOutputStream 0x1a2c1ea3 "java.lang.ProcessImpl$ProcessPipeOutputStream@1a2c1ea3"], :out #object[clojure.core$future_call$reify__8578 0x37f44d7b {:status :failed, :val #error {
 :cause "No method in multimethod 'do-copy' for dispatch value: [java.lang.ProcessImpl$ProcessPipeInputStream java.lang.ProcessBuilder$Redirect$3]"

it treats the thing like a file, which is wrong. so :out-file "/dev/null" for now

👍 1

nullInputStream doesn't work either

flower configure: error: java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: No method in multimethod 'do-copy' for dispatch value: [java.lang.ProcessImpl$ProcessPipeInputStream flower.cmd$configure$invoke__InputStream_nullInputStream__11796]
 Caused by: java.lang.IllegalArgumentException: No method in multimethod 'do-copy' for dispatch value: [java.lang.ProcessImpl$ProcessPipeInputStream flower.cmd$configure$invoke__InputStream_nullInputStream__11796]

I just posted that :)

oh sorry, misread

@jyn514 doesn't this work?

@(babashka.process/process {:out (java.io.OutputStream/nullOutputStream) :err :inherit} "echo 'lol'")

seems to work here

:dude2
{:proc #object[java.lang.ProcessImpl 0x7574b7da "Process[pid=25297, exitValue=0]"], :exit 0, :in #object[java.lang.ProcessImpl$ProcessPipeOutputStream 0x6f4d5a83 "java.lang.ProcessImpl$ProcessPipeOutputStream@6f4d5a83"], :out #object[java.io.OutputStream$1 0x290e1b73 "java.io.OutputStream$1@290e1b73"], :err #object[java.lang.ProcessBuilder$NullInputStream 0xd4186a8 "java.lang.ProcessBuilder$NullInputStream@d4186a8"], :prev nil, :cmd ["bb" "-e" "(prn :dude1) (binding [*out* *err*] (println :dude2))"]}

oops, forgot to post the code, posted just the output:

user=> @(babashka.process/process {:out (java.io.OutputStream/nullOutputStream) :err :inherit} "bb" "-e" "(prn :dude1) (binding [*out* *err*] (println :dude2))")

something feels wrong about this

ser=> (slurp (:out @(babashka.process/process {} "bb -e 1")))
"1\r\n"
user=> (slurp (:out @(babashka.process/process {:out (java.io.OutputStream/nullOutputStream)} "bb -e 1")))
java.lang.IllegalArgumentException: Cannot open <#object[java.io.OutputStream$1 0x4b91b0a6 "java.io.OutputStream$1@4b91b0a6"]> as an InputStream. [at <repl>:34:1]
user=> (slurp (:out @(babashka.process/process {:out (java.io.InputStream/nullInputStream)} "bb -e 1")))
java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: No method in multimethod 'do-copy' for dispatch value: [java.io.BufferedInputStream java.io.InputStream$1] [at <repl>:35:14]

it doesn't work for me in any case

(run-non-fatal {:out OutputStream/nullOutputStream} "ninja -t cleandead")
flower configure: error: java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: No method in multimethod 'do-copy' for dispatch value: [java.lang.ProcessImpl$ProcessPipeInputStream flower.cmd$configure$invoke__OutputStream_nullOutputStream__11796]
 Caused by: java.lang.IllegalArgumentException: No method in multimethod 'do-copy' for dispatch value: [java.lang.ProcessImpl$ProcessPipeInputStream flower.cmd$configure$invoke__OutputStream_nullOutputStream__11796]

(this is a wrapper around ps/shell)

ok just use :out-file "/dev/null" for now and post an issue about other stuff that you think is incorrect, I gotta run now

👍 1

@jyn514 https://github.com/babashka/process Clojure library for shelling out / spawning sub-processes 0.6.24 (2025-12-07) • https://github.com/babashka/process/issues/181: support :discard or ProcessBuilder$Redirect as :out and :err options

😍 1