检查 Swift 程序是否正在输出到终端

Check if Swift program is outputting to terminal

如何从我的 Swift 脚本中检查我是否正在输出到终端?

例如,在 bash 或 zsh 脚本中,这可以通过 -t 1 条件表达式来完成,以检查文件描述符 1 (stdout) 是否打开并与终端设备相关联:

if [[ -t 1 ]]; then
  echo "\e[31m"HELLO"\e[0m"           # colorize output
else
  echo hello
fi

注意当脚本在交互式 shell 中 运行 而不是通过管道传输到另一个程序时格式的差异:

./script
↪︎ HELLO

./script | tee
↪︎ hello

Swift中的等价物是什么?

#!/usr/bin/env swift

if ❓ {
  print("\u{001B}[31m" + "HELLO" + "\u{001B}[0m")
} else {
  print("hello")
}

isatty 函数 returns 1 如果给定的文件描述符与终端关联。像许多 C 库函数一样,isatty 可以通过 Darwin 模块从 Swift 调用:

import Darwin

if isatty(STDOUT_FILENO) == 1 {
  print("\u{001B}[31m" + "HELLO" + "\u{001B}[0m")
} else {
  print("hello")
}

要在 macOS 和 Linux 上实现此 运行,请将 import Darwin 替换为

#if os(Linux)
  import Glibc
#else
  import Darwin
#endif