从stdin获取输入在Cocoa命令行应用程序的子进程中
问题描述:
我有一个命令行应用程序A
,并在A
我执行一个可执行脚本B
,在B
我期待从标准输入输入。从stdin获取输入在Cocoa命令行应用程序的子进程中
我写了一个演示,在斯威夫特实施A
,使用Foundation
的Process
API,发现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
的输入根据该文档,因为:
如果不使用这种方法,标准输入从工艺继承那创造了接收器。
UPDATE:
A
是用斯威夫特包管理器创建的可执行程序包。我使用swift package generate-xcodeproj
来生成Xcode项目文件。我确认如果我在shell中运行使用swift build
或xcodebuild
构建的可执行文件,则出现从B
的stdin获取输入的问题。但是,如果我直接在Xcode中运行它,通过在Xcode内按command + R
,然后它工作。所以如果我理解在shell和Xcode中运行可执行文件的区别,我可能会使所有的工作都成功。
答
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()
希望它可以帮助
你是否允许通过从命令行'shell'内置插件的输入? – Inian
@Inian我不熟悉你提到的概念(这与shell本身有关?),但是我在Ruby中编写了'A',它的工作方式和我的预期一样。如果你认为这可能是相关的,那么你能提供更多的信息吗? – axl411