2016-11-24 70 views
4

我有一个命令行应用程序A,并在A我执行一个可执行脚本B,在B我期待从标准输入输入。从stdin获取输入在Cocoa命令行应用程序的子进程中

我写了一个演示,在斯威夫特实施A,使用FoundationProcess 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 buildxcodebuild构建的可执行文件,则出现从B的stdin获取输入的问题。但是,如果我直接在Xcode中运行它,通过在Xcode内按command + R,然后它工作。所以如果我理解在shell和Xcode中运行可执行文件的区别,我可能会使所有的工作都成功。

+0

你是否允许通过从命令行'shell'内置插件的输入? – Inian

+0

@Inian我不熟悉你提到的概念(这与shell本身有关?),但是我在Ruby中编写了'A',它的工作方式和我的预期一样。如果你认为这可能是相关的,那么你能提供更多的信息吗? – axl411

回答

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() 

希望它可以帮助

相关问题