首页 > 解决方案 > 在 Swift 中启动终端编辑器,例如 vi 或 nano

问题描述

我试图在用 Swift 编写的命令行程序中启动终端编辑器,例如 vi 或 nano。

这是一个天真的尝试,我猜标准输入和输出应该是不同的。程序什么也不输出。

let task = Process()
task.launchPath = "/usr/bin/env"
task.arguments = ["nano"]
task.standardInput = FileHandle(forReadingAtPath: "/dev/tty")
task.standardOutput = FileHandle(forWritingAtPath: "/dev/tty")
task.launch()
task.waitUntilExit()

标签: swiftshell

解决方案


此示例将在终端窗口中启动“vi”编辑器。可以通过将代码复制/粘贴到新添加的“main.swift”文件并删除预先存在的 AppDelegate 来在 Xcode swift 项目中运行。还需要关闭沙盒。

import Cocoa

let process = Process()
let pipe = Pipe()

process.executableURL = URL(fileURLWithPath:"/bin/sh/")
var args : [String]!
args = []
args.append("-c")
args.append("open '/usr/bin/vi'")
process.arguments = args
process.standardOutput = pipe
process.standardError = pipe
process.terminationHandler = { (process) in
  print("\ndidFinish: \(!process.isRunning)")
}
let fileHandle = pipe.fileHandleForReading
do {
  try process.run()
  let outStr = String(data: fileHandle.readDataToEndOfFile(), encoding: .utf8)
  print(outStr as Any)
} catch { print(String(data: fileHandle.readDataToEndOfFile(), encoding: .utf8) as Any)}

// **** main.swift **** //
let app = NSApplication.shared
app.setActivationPolicy(.regular)
app.activate(ignoringOtherApps:true)
app.run()


推荐阅读