在Cocoa命令行应用程序的子进程中从stdin获取输入

时间:2016-11-24 08:33:39

标签: swift shell cocoa foundation

我有一个命令行应用A,并在A我执行可执行脚本B,在B我期待来自stdin的输入

我使用A' s Foundation api编写了一个演示文稿,在Swift中实现Process,发现B,无论用哪种语言实现,无法从标准输入获取用户输入。

代码:

// `A`'s main.swift
import Foundation
let process = Process()
process.launchPath = PATH_TO_SCRIPT_B
process.launch()
process.waitUntilExit()

// `B`
#!/usr/bin/swift 
print("intpu something")
let input = readLine()
print("input: \(input)")

我没有设置process的输入,因为根据doc:

  

如果未使用此方法,则标准输入将从创建接收器的进程继承。

更新:

A是使用Swift Package Manager创建的可执行包。我使用swift package generate-xcodeproj生成Xcode项目文件。我确认如果我在shell中运行使用swift buildxcodebuild构建的可执行文件,则会出现从B的stdin获取输入的问题。但是如果我直接在Xcode中运行它,通过在Xcode中按command + R,它就可以了。因此,如果我理解在shell和Xcode中运行可执行文件之间的区别,我可能会使一切正常。

1 个答案:

答案 0 :(得分:1)

func task() {
  print("input here")
  let x = input()
  print ("inputed:" + x)
}

func input() -> String {
  let keyboard = FileHandle.standardInput
  let inputData = keyboard.availableData
  let strData = String(data: inputData, encoding: .utf8)!

  let string = strData.trimmingCharacters(in: .newlines)
  return string
}

task()

希望有所帮助