How can I check from my Swift script whether or not I am outputting to a terminal?

例如,在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

What is the equivalent in Swift?

#!/usr/bin/env swift

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

推荐答案

如果给定的文件描述符与终端关联,则isatty函数返回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

Swift相关问答推荐

什么是Swift Concurrency中任务组的正常退出

如何将EnvironmentObject从UIKit视图控制器传递到SwiftUI视图

带有文本输入自动大小写修饰符的SwiftUI Textfield问题

当TextField变为空时,不会触发onChange

是否可以循环遍历SWIFT子类并访问它们的静态变量S?

为什么枚举上的.allCases.forEach不是循环(继续和中断不起作用)?

如何偏移HStack中的视图,但仍然约束框架以与偏移匹配?

有条件地在同一视图上设置两个不同的过渡

将变量设置为 @Published 会 destruct 代码而不会出现任何错误

TimeZone 背后的目的

macOS SwiftUI: 如何触发删除一个项目?

如何在 Swift 中做类型安全的索引?

如何从我的 macOS 应用程序打开 (.log) 文件?

为什么 SwiftUI 中 ForEach 的这个 Select 不起作用?

确定路径是否相交的有效方法

在 Swift 5.5 中编写同步和异步函数

如何在 SwiftUI 中通过按钮点击一次为一个更改设置动画?

Swift:连接两个数组而不重复共享后缀/前缀

如何实现 Swift 的 Comparable 协议?

DispatchQueue:不能在非主线程上使用 asCopy = NO 调用