我有一个命令行应用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 build
或xcodebuild
构建的可执行文件,则会出现从B
的stdin获取输入的问题。但是如果我直接在Xcode中运行它,通过在Xcode中按command + R
,它就可以了。因此,如果我理解在shell和Xcode中运行可执行文件之间的区别,我可能会使一切正常。
答案 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()
希望有所帮助