【Haskell】cabal runで表示される余計なメッセージを非表示にする
cabal runでHaskellプログラムを実行するとビルドの情報などが表示されますが、実行結果を標準出力として他のプログラムに渡したい場合はこれだと困ると思います。
例
ビルドが走った場合
$ echo 42 | cabal run kagla-hs Build profile: -w ghc-8.8.4 -O1 In order, the following will be built (use -v for more details): - kagla-hs-0.1.0.0 (exe:kagla-hs) --enable-profiling (file app/Main.hs changed) Preprocessing executable 'kagla-hs' for kagla-hs-0.1.0.0.. Building executable 'kagla-hs' for kagla-hs-0.1.0.0.. [1 of 1] Compiling Main ( app/Main.hs, /Users/devilune/dev/src/github.com/convcha/kagla-hs/dist-newstyle/build/x86_64-osx/ghc-8.8.4/kagla-hs-0.1.0.0/x/kagla-hs/build/kagla-hs/kagla-hs-tmp/Main.p_o ) Linking /Users/devilune/dev/src/github.com/convcha/kagla-hs/dist-newstyle/build/x86_64-osx/ghc-8.8.4/kagla-hs-0.1.0.0/x/kagla-hs/build/kagla-hs/kagla-hs ... define i32 @main() { ret i32 42 }
ビルドが不要だった場合
$ echo 99 | cabal run kagla-hs Up to date define i32 @main() { ret i32 99 }
具体的に困る例を出すと、例えばこちらの記事の例のようにLLVM IRを標準出力に出力して、それをLLVMのインタプリタに渡して実行するような場合、余計なメッセージが出力されてしまうとエラーになってしまいます。
↓Up to date
という命令なんてないよ!と怒られている
$ echo 42 | cabal run kagla-hs | lli lli: <stdin>:1:1: error: expected top-level entity Up to date ^
これを防ぐには、cabalの-v0
というオプションを付けて実行すればOKです。
$ echo 42 | cabal -v0 run kagla-hs | lli