如果在 Nim 中未检测到控制台,如何将输出重定向到文件

How to redirect output to file if no console detected in Nim

如果有控制台,我希望我的 Nim 程序写入控制台,如果没有控制台,则重定向 echo 写入文件。 .NET 中是否有等同于 Environment.UserInteractive 属性 的等效项,我可以使用它来检测是否没有可用的控制台并在这种情况下重定向标准输出?

您应该可以使用 isatty()

这是 Nimble 中的 example

编辑: @tjohnson 这是对您的评论的回应。我没有足够的积分来直接回复您的评论或其他什么?感谢 Stack Overflow...

如果没有看到更多代码,很难说。

您使用的是哪个版本的 Nim?

我怀疑标准输出被只读符号遮蔽了。

您是否在 proc 内调用此代码并将 stdout 作为参数传递? 像这样: proc foo(stdout: File)

如果是这样,您需要将其更改为 var 参数以使参数可写: proc test(stdout: var File)

或者使用 stdout 作为全局变量。

这是您发现的使用 isatty() as suggested by genotrance and the code 的组合:)

# stdout_to_file.nim 
import terminal, strformat, times

if isatty(stdout): # ./stdout_to_file
  echo "This is output to the terminal."
else:              # ./stdout_to_file | cat
  const
    logFileName = "log.txt"
  let
    # https://github.com/jasonrbriggs/nimwhistle/blob/183c19556d6f11013959d17dfafd43486e1109e5/tests/cgitests.nim#L15
    logFile = open(logFileName, fmWrite)
  stdout = logFile
  echo fmt"This is output to the {logFileName} file."
  echo fmt"- Run using nim {NimVersion} on {now()}."

将以上文件另存为 stdout_to_file.nim

在 运行:

nim c stdout_to_file.nim && ./stdout_to_file | cat

我在创建的 log.txt:

中得到了这个
This is output to the log.txt file.
- Run using nim 0.19.9 on 2019-01-23T22:42:27-05:00.