haskell 如何运行可执行文件与cabal没有任何额外的输出?

qij5mzcb  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(116)

当我使用cabal run运行我的程序时,我总是在输出中得到一些额外的噪音。例如:

Resolving dependencies...
Build profile: -w ghc-9.4.4 -O1
In order, the following will be built (use -v for more details):
 - output-test-0.1.0.0 (exe:output-test) (first run)
Configuring executable 'output-test' for output-test-0.1.0.0..
Preprocessing executable 'output-test' for output-test-0.1.0.0..
Building executable 'output-test' for output-test-0.1.0.0..
[1 of 1] Compiling Main             ( app/Main.hs, /private/tmp/output-test/dist-newstyle/build/x86_64-osx/ghc-9.4.4/output-test-0.1.0.0/x/output-test/build/output-test/output-test-tmp/Main.o )
[2 of 2] Linking /private/tmp/output-test/dist-newstyle/build/x86_64-osx/ghc-9.4.4/output-test-0.1.0.0/x/output-test/build/output-test/output-test

或者最好是:

Up to date

通常这不是一个大问题,但现在我有一个可执行文件,它生成的输出我想保存到一个文件中,而不需要这些额外的文本。我该怎么做?我在文档中找不到--quiet选项。

9fkzdhlc

9fkzdhlc1#

它曾经是there was no way,但现在一个简单的-v0就足够了。
实际上,在我看来,run的三个默认值是不幸的:

  1. -v0应该是默认的IMO
    1.目标选择器应该默认为exe:。(也许这些天是这样的。我没有跟上这个问题。)
    1.参数应该默认转到正在运行的可执行文件,而不是cabal
    我已经在我的本地垃圾箱下面的脚本,以解决这些问题有一段时间了,随时窃取它。它将exe:添加到目标,除非可执行文件名中已经有:,它将--添加到目标,除非已经有一个--;这两个转义影线允许您在特殊情况下更改新的默认值(例如,希望使用v2-runtest:选择器,或者因为您确实希望将选项传递给cabal)。
#!/bin/sh

contains() {
    local needle="$1"
    while [ $# -gt 1 ]
    do
        shift
        if [ "$needle" = "$1" ]
        then
            return 0
        fi
    done
    return 1
}

executable="$1"
shift
if echo "$executable" | grep -q : >/dev/null
then
    if contains -- "$@"
    then exec cabal v2-run "$executable" -v0 "$@"
    else exec cabal v2-run "$executable" -v0 -- "$@"
    fi
else
    if contains -- "$@"
    then exec cabal v2-run exe:"$executable" -v0 "$@"
    else exec cabal v2-run exe:"$executable" -v0 -- "$@"
    fi
fi

相关问题